88 lines
3.9 KiB
Python
88 lines
3.9 KiB
Python
import bpy
|
|
from bpy.types import Operator
|
|
from ...core.common import get_active_armature
|
|
from ...core.translations import t
|
|
from ...core.vrm_unity_converter import convert_vrm_to_unity, validate_unity_hierarchy
|
|
from ...core.logging_setup import logger
|
|
from ...core.armature_validation import validate_armature
|
|
|
|
|
|
class AvatarToolkit_OT_ConvertVRMToUnity(Operator):
|
|
"""Convert VRM armature bone names to Unity humanoid format"""
|
|
bl_idname = "avatar_toolkit.convert_vrm_to_unity"
|
|
bl_label = t("VRM.convert_to_unity.label")
|
|
bl_description = t("VRM.convert_to_unity.desc")
|
|
bl_options = {'REGISTER', 'UNDO'}
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
armature = get_active_armature(context)
|
|
return armature is not None
|
|
|
|
def execute(self, context):
|
|
armature = get_active_armature(context)
|
|
if not armature:
|
|
logger.warning("No active armature found for VRM conversion")
|
|
self.report({'ERROR'}, t("VRM.no_armature_selected"))
|
|
return {'CANCELLED'}
|
|
|
|
logger.info(f"Starting VRM to Unity conversion for armature: {armature.name}")
|
|
|
|
# Get conversion settings
|
|
remove_colliders = context.scene.avatar_toolkit.vrm_remove_colliders
|
|
remove_root = context.scene.avatar_toolkit.vrm_remove_root
|
|
logger.info(f"Collider removal setting: {remove_colliders}")
|
|
logger.info(f"Root bone removal setting: {remove_root}")
|
|
|
|
# Log all objects with 'collider' in name for debugging
|
|
collider_objects = [obj.name for obj in bpy.data.objects if 'collider' in obj.name.lower()]
|
|
if collider_objects:
|
|
logger.info(f"Found {len(collider_objects)} objects with 'collider' in name:")
|
|
for obj_name in collider_objects:
|
|
logger.info(f" - {obj_name}")
|
|
|
|
success, messages, converted_count = convert_vrm_to_unity(armature, remove_colliders, remove_root)
|
|
|
|
if not success:
|
|
logger.warning(f"VRM conversion failed: {messages}")
|
|
for msg in messages:
|
|
self.report({'WARNING'}, msg)
|
|
return {'CANCELLED'}
|
|
|
|
logger.info(f"VRM conversion completed successfully. Converted {converted_count} bones")
|
|
for msg in messages:
|
|
self.report({'INFO'}, msg)
|
|
|
|
# Validate the converted armature
|
|
try:
|
|
is_valid, validation_messages = validate_unity_hierarchy(armature)
|
|
|
|
if is_valid:
|
|
logger.info("Unity hierarchy validation passed")
|
|
self.report({'INFO'}, t("VRM.validation.hierarchy_passed"))
|
|
else:
|
|
logger.warning("Unity hierarchy validation found issues")
|
|
self.report({'WARNING'}, t("VRM.validation.hierarchy_issues"))
|
|
for msg in validation_messages:
|
|
self.report({'WARNING'}, msg)
|
|
|
|
try:
|
|
armature_valid, armature_messages, _ = validate_armature(armature)
|
|
if armature_valid:
|
|
logger.info("Full armature validation passed")
|
|
self.report({'INFO'}, t("VRM.validation.armature_passed"))
|
|
else:
|
|
logger.info("Full armature validation found minor issues")
|
|
# Don't report these as errors since the conversion was successful
|
|
# Just log them for debugging
|
|
for msg in armature_messages[:3]:
|
|
logger.debug(f"Armature validation: {msg}")
|
|
except Exception as e:
|
|
logger.warning(f"Error during full armature validation: {str(e)}")
|
|
# Don't fail the operation for validation errors
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error during hierarchy validation: {str(e)}")
|
|
self.report({'WARNING'}, t("VRM.validation.failed", error=str(e)))
|
|
|
|
return {'FINISHED'} |