From 5e12d1d6f6c4864d019425f9aaa3ab24720028a7 Mon Sep 17 00:00:00 2001 From: Reina_Sakiria Date: Sun, 17 Nov 2024 17:46:19 +0900 Subject: [PATCH] fix: Forget to keep the inverse root bone. --- Editor/MeshSettingsPass.cs | 57 +++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/Editor/MeshSettingsPass.cs b/Editor/MeshSettingsPass.cs index 4382fc07..2a414116 100644 --- a/Editor/MeshSettingsPass.cs +++ b/Editor/MeshSettingsPass.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace nadena.dev.modular_avatar.core.editor @@ -144,9 +145,57 @@ namespace nadena.dev.modular_avatar.core.editor if (newMesh) context.SaveAsset(newMesh); } - smr.rootBone = settings.RootBone; - smr.localBounds = settings.Bounds; + + var settingsRootBone = settings.RootBone; + settingsRootBone = settingsRootBone == null ? smr.transform : settingsRootBone; + var smrRootBone = smr.rootBone; + smrRootBone = smrRootBone == null ? smr.transform : smrRootBone; + + if (IsInverted(smrRootBone) != IsInverted(settingsRootBone)) + { + smr.rootBone = GetInvertedRootBone(settingsRootBone); + + var bounds = settings.Bounds; + var center = bounds.center; + center.x *= -1; + bounds.center = center; + smr.localBounds = bounds; + } + else + { + smr.rootBone = settings.RootBone; + smr.localBounds = settings.Bounds; + } } } + + private bool IsInverted(Transform bone) + { + var inverseCount = 0; + + var scale = bone.lossyScale; + if (scale.x < 0) inverseCount += 1; + if (scale.y < 0) inverseCount += 1; + if (scale.z < 0) inverseCount += 1; + + return (inverseCount % 2) != 0; + } + private Dictionary invertedRootBoneCache = new(); + private Transform GetInvertedRootBone(Transform rootBone) + { + if (invertedRootBoneCache.TryGetValue(rootBone, out var cache)) { return cache; } + + var cloned = Object.Instantiate(rootBone.gameObject); + cloned.name = rootBone.gameObject.name + "-InvertedRootBone"; + cloned.transform.SetParent(rootBone, false); + + var invertedRootBone = cloned.transform; + var scale = invertedRootBone.localScale; + scale.x *= -1; + invertedRootBone.localScale = scale; + + invertedRootBoneCache[rootBone] = invertedRootBone; + return invertedRootBone; + } } -} \ No newline at end of file +}