From 3ef94d99dd1732fafd8cb03cc2f781b4df9b6350 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Sat, 28 Sep 2024 14:56:10 +0900 Subject: [PATCH] feat: support outfits' hips in one more deep place --- Editor/SetupOutfit.cs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Editor/SetupOutfit.cs b/Editor/SetupOutfit.cs index f8e4aab6..d2d59bc9 100644 --- a/Editor/SetupOutfit.cs +++ b/Editor/SetupOutfit.cs @@ -512,6 +512,7 @@ namespace nadena.dev.modular_avatar.core.editor } var hipsCandidates = new List(); + var hipsExtraCandidateRoots = new List(); if (outfitHips == null) { @@ -520,6 +521,23 @@ namespace nadena.dev.modular_avatar.core.editor foreach (Transform child in outfitRoot.transform) { foreach (Transform tempHip in child) + { + if (tempHip.name.Contains(avatarHips.name)) + { + outfitHips = tempHip.gameObject; + // Prefer the first hips we find + break; + } + hipsExtraCandidateRoots.Add(tempHip); + } + + if (outfitHips != null) return true; // found an exact match, bail outgit + } + + // Sometimes, Hips is in deeper place(like root -> Armature -> Armature 1 -> Hips). + foreach (Transform extraCandidateRoot in hipsExtraCandidateRoots) + { + foreach (Transform tempHip in extraCandidateRoot) { if (tempHip.name.Contains(avatarHips.name)) { @@ -533,6 +551,7 @@ namespace nadena.dev.modular_avatar.core.editor } hipsCandidates.Add(avatarHips.name); + hipsExtraCandidateRoots = new List(); // If that doesn't work out, we'll check for heuristic bone mapper mappings. foreach (var hbm in HeuristicBoneMapper.BoneToNameMap[HumanBodyBones.Hips]) @@ -553,6 +572,25 @@ namespace nadena.dev.modular_avatar.core.editor { outfitHips = tempHip.gameObject; } + hipsExtraCandidateRoots.Add(tempHip); + } + } + } + + if (outfitHips == null) + { + // Sometimes, Hips is in deeper place(like root -> Armature -> Armature 1 -> Hips). + foreach (Transform extraCandidateRoot in hipsExtraCandidateRoots) + { + foreach (Transform tempHip in extraCandidateRoot) + { + foreach (var candidate in hipsCandidates) + { + if (HeuristicBoneMapper.NormalizeName(tempHip.name).Contains(candidate)) + { + outfitHips = tempHip.gameObject; + } + } } } }