From 634563afb3aa7c641af040625fbc6b970cf558c7 Mon Sep 17 00:00:00 2001 From: Yusarina Date: Sat, 2 Aug 2025 01:52:09 +0100 Subject: [PATCH] Move bones to the dictionary (most was already in there but there were hardcoded for testing) --- core/dictionaries.py | 4 +- core/vrm_unity_converter.py | 167 ++++-------------------------------- 2 files changed, 17 insertions(+), 154 deletions(-) diff --git a/core/dictionaries.py b/core/dictionaries.py index 34251b0..e8227e2 100644 --- a/core/dictionaries.py +++ b/core/dictionaries.py @@ -289,8 +289,8 @@ bone_names.update({ 'right_toe': bone_names['right_toe'] + ['jbiprrtoe', 'jrtoe', 'jbiprtoebase'], # VRM eyes - 'left_eye': bone_names['left_eye'] + ['jbipcleye', 'jleye'], - 'right_eye': bone_names['right_eye'] + ['jbipcreye', 'jreye'], + 'left_eye': bone_names['left_eye'] + ['jbipcleye', 'jleye', 'jadjlfaceeye'], + 'right_eye': bone_names['right_eye'] + ['jbipcreye', 'jreye', 'jadjrfaceeye'], # VRM fingers - Left (including Little finger variations) 'thumb_1_l': bone_names['thumb_1_l'] + ['jbipllthumb1', 'jlthumb1', 'jbiplthumb1'], diff --git a/core/vrm_unity_converter.py b/core/vrm_unity_converter.py index 0248cfb..21225cd 100644 --- a/core/vrm_unity_converter.py +++ b/core/vrm_unity_converter.py @@ -2,7 +2,7 @@ import bpy from typing import Dict, List, Optional, Tuple, Set from bpy.types import Object, Bone from .common import get_active_armature -from .dictionaries import simplify_bonename, standard_bones, bone_hierarchy +from .dictionaries import simplify_bonename, standard_bones, bone_hierarchy, reverse_bone_lookup from .logging_setup import logger @@ -47,168 +47,31 @@ def detect_vrm_armature(armature: Object) -> bool: return found_vrm_bones >= 5 -def get_vrm_to_unity_mapping() -> Dict[str, str]: - """ - Get mapping from VRM bone names to Unity humanoid bone names - """ - return { - # Core structure - 'jbipchips': standard_bones['hips'], - 'jbipcspine': standard_bones['spine'], - 'jbipcchest': standard_bones['chest'], - 'jbipcupperchest': standard_bones.get('upper_chest', 'UpperChest'), - 'jbipcneck': standard_bones['neck'], - 'jbipchead': standard_bones['head'], - - # Left arm - 'jbipllshoulder': standard_bones.get('left_shoulder', 'LeftShoulder'), - 'jbiplshoulder': standard_bones.get('left_shoulder', 'LeftShoulder'), - 'jbiplupperarm': standard_bones['left_arm'], - 'jbipllforearm': standard_bones['left_elbow'], - 'jbipllowerarm': standard_bones['left_elbow'], - 'jbipllhand': standard_bones['left_wrist'], - 'jbiplhand': standard_bones['left_wrist'], - - # Right arm (both jbipr and jbiprr patterns) - 'jbiprlshoulder': standard_bones.get('right_shoulder', 'RightShoulder'), - 'jbiprshoulder': standard_bones.get('right_shoulder', 'RightShoulder'), - 'jbiprrshoulder': standard_bones.get('right_shoulder', 'RightShoulder'), - 'jbiprupperarm': standard_bones['right_arm'], - 'jbiprrupperarm': standard_bones['right_arm'], - 'jbiprforearm': standard_bones['right_elbow'], - 'jbiprrforearm': standard_bones['right_elbow'], - 'jbiprlowerarm': standard_bones['right_elbow'], - 'jbiprhand': standard_bones['right_wrist'], - 'jbiprrhand': standard_bones['right_wrist'], - - # Left leg - 'jbiplupperleg': standard_bones['left_leg'], - 'jbipllowerleg': standard_bones['left_knee'], - 'jbipllfoot': standard_bones['left_ankle'], - 'jbiplfoot': standard_bones['left_ankle'], - 'jbiplltoe': standard_bones['left_toe'], - 'jbipltoebase': standard_bones['left_toe'], - - # Right leg (both jbipr and jbiprr patterns) - 'jbiprupperleg': standard_bones['right_leg'], - 'jbiprrupperleg': standard_bones['right_leg'], - 'jbiprlowerleg': standard_bones['right_knee'], - 'jbiprrlowerleg': standard_bones['right_knee'], - 'jbiprfoot': standard_bones['right_ankle'], - 'jbiprrfoot': standard_bones['right_ankle'], - 'jbiprtoe': standard_bones['right_toe'], - 'jbiprrtoe': standard_bones['right_toe'], - 'jbiprtoebase': standard_bones['right_toe'], - - # Eyes - 'jbipcleye': standard_bones.get('left_eye', 'Eye.L'), - 'jbipcreye': standard_bones.get('right_eye', 'Eye.R'), - 'jadjlfaceeye': standard_bones.get('left_eye', 'Eye.L'), - 'jadjrfaceeye': standard_bones.get('right_eye', 'Eye.R'), - - # Fingers - Left thumb - 'jbipllthumb1': standard_bones.get('thumb_1_l', 'Thumb1.L'), - 'jbipllthumb2': standard_bones.get('thumb_2_l', 'Thumb2.L'), - 'jbipllthumb3': standard_bones.get('thumb_3_l', 'Thumb3.L'), - 'jbiplthumb1': standard_bones.get('thumb_1_l', 'Thumb1.L'), - 'jbiplthumb2': standard_bones.get('thumb_2_l', 'Thumb2.L'), - 'jbiplthumb3': standard_bones.get('thumb_3_l', 'Thumb3.L'), - - # Fingers - Left index - 'jbipllindex1': standard_bones.get('index_1_l', 'Index1.L'), - 'jbipllindex2': standard_bones.get('index_2_l', 'Index2.L'), - 'jbipllindex3': standard_bones.get('index_3_l', 'Index3.L'), - 'jbiplindex1': standard_bones.get('index_1_l', 'Index1.L'), - 'jbiplindex2': standard_bones.get('index_2_l', 'Index2.L'), - 'jbiplindex3': standard_bones.get('index_3_l', 'Index3.L'), - - # Fingers - Left middle - 'jbipllmiddle1': standard_bones.get('middle_1_l', 'Middle1.L'), - 'jbipllmiddle2': standard_bones.get('middle_2_l', 'Middle2.L'), - 'jbipllmiddle3': standard_bones.get('middle_3_l', 'Middle3.L'), - 'jbiplmiddle1': standard_bones.get('middle_1_l', 'Middle1.L'), - 'jbiplmiddle2': standard_bones.get('middle_2_l', 'Middle2.L'), - 'jbiplmiddle3': standard_bones.get('middle_3_l', 'Middle3.L'), - - # Fingers - Left ring - 'jbipllring1': standard_bones.get('ring_1_l', 'Ring1.L'), - 'jbipllring2': standard_bones.get('ring_2_l', 'Ring2.L'), - 'jbipllring3': standard_bones.get('ring_3_l', 'Ring3.L'), - 'jbiplring1': standard_bones.get('ring_1_l', 'Ring1.L'), - 'jbiplring2': standard_bones.get('ring_2_l', 'Ring2.L'), - 'jbiplring3': standard_bones.get('ring_3_l', 'Ring3.L'), - - # Fingers - Left pinky - 'jbipllpinky1': standard_bones.get('pinkie_1_l', 'Pinky1.L'), - 'jbipllpinky2': standard_bones.get('pinkie_2_l', 'Pinky2.L'), - 'jbipllpinky3': standard_bones.get('pinkie_3_l', 'Pinky3.L'), - 'jbipllittle1': standard_bones.get('pinkie_1_l', 'Pinky1.L'), - 'jbipllittle2': standard_bones.get('pinkie_2_l', 'Pinky2.L'), - 'jbipllittle3': standard_bones.get('pinkie_3_l', 'Pinky3.L'), - - # Fingers - Right thumb (both jbipr and jbiprr patterns) - 'jbiprthumb1': standard_bones.get('thumb_1_r', 'Thumb1.R'), - 'jbiprthumb2': standard_bones.get('thumb_2_r', 'Thumb2.R'), - 'jbiprthumb3': standard_bones.get('thumb_3_r', 'Thumb3.R'), - 'jbiprrrthumb1': standard_bones.get('thumb_1_r', 'Thumb1.R'), - 'jbiprrrthumb2': standard_bones.get('thumb_2_r', 'Thumb2.R'), - 'jbiprrrthumb3': standard_bones.get('thumb_3_r', 'Thumb3.R'), - - # Fingers - Right index - 'jbiprindex1': standard_bones.get('index_1_r', 'Index1.R'), - 'jbiprindex2': standard_bones.get('index_2_r', 'Index2.R'), - 'jbiprindex3': standard_bones.get('index_3_r', 'Index3.R'), - 'jbiprrrindex1': standard_bones.get('index_1_r', 'Index1.R'), - 'jbiprrrindex2': standard_bones.get('index_2_r', 'Index2.R'), - 'jbiprrrindex3': standard_bones.get('index_3_r', 'Index3.R'), - - # Fingers - Right middle - 'jbiprmiddle1': standard_bones.get('middle_1_r', 'Middle1.R'), - 'jbiprmiddle2': standard_bones.get('middle_2_r', 'Middle2.R'), - 'jbiprmiddle3': standard_bones.get('middle_3_r', 'Middle3.R'), - 'jbiprrmiddle1': standard_bones.get('middle_1_r', 'Middle1.R'), - 'jbiprrmiddle2': standard_bones.get('middle_2_r', 'Middle2.R'), - 'jbiprrmiddle3': standard_bones.get('middle_3_r', 'Middle3.R'), - - # Fingers - Right ring - 'jbiprring1': standard_bones.get('ring_1_r', 'Ring1.R'), - 'jbiprring2': standard_bones.get('ring_2_r', 'Ring2.R'), - 'jbiprring3': standard_bones.get('ring_3_r', 'Ring3.R'), - 'jbiprrrring1': standard_bones.get('ring_1_r', 'Ring1.R'), - 'jbiprrrring2': standard_bones.get('ring_2_r', 'Ring2.R'), - 'jbiprrrring3': standard_bones.get('ring_3_r', 'Ring3.R'), - - # Fingers - Right pinky - 'jbiprpinky1': standard_bones.get('pinkie_1_r', 'Pinky1.R'), - 'jbiprpinky2': standard_bones.get('pinkie_2_r', 'Pinky2.R'), - 'jbiprpinky3': standard_bones.get('pinkie_3_r', 'Pinky3.R'), - 'jbiprrrpinky1': standard_bones.get('pinkie_1_r', 'Pinky1.R'), - 'jbiprrrpinky2': standard_bones.get('pinkie_2_r', 'Pinky2.R'), - 'jbiprrrpinky3': standard_bones.get('pinkie_3_r', 'Pinky3.R'), - 'jbiprlittle1': standard_bones.get('pinkie_1_r', 'Pinky1.R'), - 'jbiprlittle2': standard_bones.get('pinkie_2_r', 'Pinky2.R'), - 'jbiprlittle3': standard_bones.get('pinkie_3_r', 'Pinky3.R'), - } def find_vrm_bones_in_armature(armature: Object) -> Dict[str, str]: """ - Find VRM bones in armature and return mapping to their actual names + Find VRM bones in armature and return mapping to their actual names using dictionary lookup """ - vrm_mapping = get_vrm_to_unity_mapping() found_bones = {} for bone_name in armature.data.bones.keys(): simplified_name = simplify_bonename(bone_name) - # Check if this bone matches any VRM pattern - for vrm_pattern, unity_name in vrm_mapping.items(): - if simplified_name == vrm_pattern: + # Check if this bone exists in our reverse lookup dictionary + if simplified_name in reverse_bone_lookup: + standard_bone_key = reverse_bone_lookup[simplified_name] + + # Get the Unity name from standard_bones + if standard_bone_key in standard_bones: + unity_name = standard_bones[standard_bone_key] found_bones[bone_name] = unity_name - logger.debug(f"Found VRM bone: {bone_name} -> {unity_name}") - break + logger.debug(f"Found VRM bone via dictionary: {bone_name} -> {unity_name}") + else: + logger.debug(f"Standard bone key '{standard_bone_key}' not found in standard_bones for bone '{bone_name}'") - if simplified_name.startswith('jbip') and bone_name not in found_bones: + # Fallback for unrecognized VRM bones that start with 'jbip' + elif simplified_name.startswith('jbip') and bone_name not in found_bones: unity_equivalent = guess_unity_name_from_vrm(simplified_name) if unity_equivalent: found_bones[bone_name] = unity_equivalent @@ -537,7 +400,7 @@ def remove_vrm_root_bone(armature: Object) -> Tuple[bool, str]: for child in root_to_remove.children: if child != hips_bone: children_to_reparent.append(child) - ) + hips_bone.parent = None for child in children_to_reparent: