feat: support using cloth's Humanoid Rig on merge_armature.adjust_names

This commit is contained in:
Sayamame-beans 2024-09-20 21:54:23 +09:00
parent 97d8261557
commit b470421f02

View File

@ -116,7 +116,50 @@ namespace nadena.dev.modular_avatar.core.editor
{
var avatarRoot = RuntimeUtil.FindAvatarTransformInParents(target.mergeTarget.Get(target).transform);
var avatarAnimator = avatarRoot != null ? avatarRoot.GetComponent<Animator>() : null;
HeuristicBoneMapper.RenameBonesByHeuristic(target, avatarAnimator: avatarAnimator);
// Search Outfit Root Animator
var outfitRoot = ((ModularAvatarMergeArmature)serializedObject.targetObject).transform;
Animator outfitAnimator = null;
while (outfitRoot != null)
{
if (outfitRoot == avatarRoot)
{
outfitAnimator = null;
break;
}
outfitAnimator = outfitRoot.GetComponent<Animator>();
if (outfitAnimator != null && outfitAnimator.isHuman) break;
outfitAnimator = null;
outfitRoot = outfitRoot.parent;
}
if (outfitAnimator != null)
{
var hipsCheck = outfitAnimator.GetBoneTransform(HumanBodyBones.Hips);
if (hipsCheck != null && hipsCheck.parent == outfitRoot.transform)
{
// Sometimes broken rigs can have the hips as a direct child of the root, instead of having
// an intermediate Armature object. We do not currently support this kind of rig, and so we'll
// assume the outfit's humanoid rig is broken and move on to heuristic matching.
outfitAnimator = null;
} else if (hipsCheck == null) {
outfitAnimator = null;
}
}
Dictionary<Transform, HumanBodyBones> humanoidBones = null;
if (outfitAnimator != null)
{
humanoidBones = new Dictionary<Transform, HumanBodyBones>();
foreach (HumanBodyBones boneIndex in Enum.GetValues(typeof(HumanBodyBones)))
{
var bone = boneIndex != HumanBodyBones.LastBone ? outfitAnimator.GetBoneTransform(boneIndex) : null;
if (bone == null) continue;
humanoidBones[bone] = boneIndex;
}
}
HeuristicBoneMapper.RenameBonesByHeuristic(target, humanoidBones: humanoidBones, avatarAnimator: avatarAnimator);
}
}