diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs index 89f5192fe..8201e3c05 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Linq; +using MeshUtility; using UnityEditor; using UnityEngine; @@ -39,15 +40,26 @@ namespace VRM EditorUtility.SetDirty(m_target); } } - + + override public void OnInspectorGUI() + { + // show validate information + foreach (var v in m_target.Validate()) + { + v.DrawGUI(); + } + + base.OnInspectorGUI(); + } + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/X Mirror")] private static void InvertOffsetX(MenuCommand command) { var target = command.context as VRMSpringBoneColliderGroup; if (target == null) return; - + Undo.RecordObject(target, "X Mirror"); - + foreach (var sphereCollider in target.Colliders) { var offset = sphereCollider.Offset; @@ -55,24 +67,24 @@ namespace VRM sphereCollider.Offset = offset; } } - + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/Sort Colliders by Radius")] private static void SortByRadius(MenuCommand command) { var target = command.context as VRMSpringBoneColliderGroup; if (target == null) return; - + Undo.RecordObject(target, "Sort Colliders by Radius"); target.Colliders = target.Colliders.OrderBy(x => -x.Radius).ToArray(); } - + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/Sort Colliders by Offset Y")] private static void SortByOffsetY(MenuCommand command) { var target = command.context as VRMSpringBoneColliderGroup; if (target == null) return; - + Undo.RecordObject(target, "Sort Colliders by Offset Y"); target.Colliders = target.Colliders.OrderBy(x => -x.Offset.y).ToArray(); diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneValidator.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneValidator.cs index 5809b6938..0d3b29fef 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneValidator.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneValidator.cs @@ -63,6 +63,11 @@ namespace VRM yield return Validation.Error($"{sb.name}.ColliderGroups[{i}] is out of hierarchy"); continue; } + + foreach (var x in c.Validate()) + { + yield return x; + } } } } diff --git a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index 6ff4265bd..9fbdcf5d8 100644 --- a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -105,11 +105,6 @@ namespace VRM return avatar; }); - // humanPoseTransfer - // var animator = normalized.GetComponent(); - // var humanPoseTransfer = normalized.AddComponent(); - // humanPoseTransfer.Avatar = animator.avatar; - CopyVRMComponents(go, normalized, bMap); return normalized; @@ -135,6 +130,7 @@ namespace VRM } { + // springbone var secondary = go.transform.Find("secondary"); if (secondary == null) { @@ -148,7 +144,7 @@ namespace VRM dstSecondary.SetParent(root.transform, false); } - // 揺れモノ + // VRMSpringBoneColliderGroup foreach (var src in go.transform.GetComponentsInChildren()) { var dst = map[src.transform]; @@ -156,17 +152,18 @@ namespace VRM dstColliderGroup.Colliders = src.Colliders.Select(y => { var offset = dst.worldToLocalMatrix.MultiplyPoint(src.transform.localToWorldMatrix.MultiplyPoint(y.Offset)); + var ls = src.UniformedLossyScale; return new VRMSpringBoneColliderGroup.SphereCollider { Offset = offset, - Radius = y.Radius + Radius = y.Radius * ls }; }).ToArray(); } + // VRMSpringBone foreach (var src in go.transform.GetComponentsInChildren()) { - // Copy VRMSpringBone var dst = dstSecondary.gameObject.AddComponent(); dst.m_comment = src.m_comment; dst.m_stiffnessForce = src.m_stiffnessForce; diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs index b6692ac74..9ad63c3ae 100644 --- a/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs +++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using MeshUtility; using UnityEngine; @@ -29,15 +31,23 @@ namespace VRM [SerializeField] Color m_gizmoColor = Color.magenta; + public float UniformedLossyScale + { + get + { + return Mathf.Max( + transform.lossyScale.x, + transform.lossyScale.y, + transform.lossyScale.z + ); + } + } + private void OnDrawGizmosSelected() { Gizmos.color = m_gizmoColor; Matrix4x4 mat = transform.localToWorldMatrix; - var ls = Mathf.Max( - transform.lossyScale.x, - transform.lossyScale.y, - transform.lossyScale.z - ); + var ls = UniformedLossyScale; Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3( 1.0f / transform.lossyScale.x * ls, 1.0f / transform.lossyScale.y * ls, @@ -48,5 +58,17 @@ namespace VRM Gizmos.DrawWireSphere(y.Offset, y.Radius); } } + + public IEnumerable Validate() + { + if (transform.localScale != Vector3.one) + { + yield return Validation.Warning($"'{name}' GameObject has none 1 scaling"); + } + else if (transform.lossyScale != Vector3.one) + { + yield return Validation.Warning($"'{name}' parent GameObject has none 1 scaling"); + } + } } }