From a87ceb0fd42cc2fcd629c3947ab3f99b856e1943 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 2 Jul 2024 20:11:08 +0900 Subject: [PATCH] =?UTF-8?q?VRM10SpringBoneJoint=20=E3=81=AE=20Gizmo=20?= =?UTF-8?q?=E3=82=92=20Spring=20=E5=8D=98=E4=BD=8D=E3=81=AB=E3=81=BE?= =?UTF-8?q?=E3=81=A8=E3=82=81=E3=81=A6=E6=8F=8F=E7=94=BB=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 末端の joint を選択していても 根元から一連の joint を描画し、 末端を別色で highlight する。 --- .../SpringBone/VRM10SpringBoneJointEditor.cs | 1 + .../SpringBone/VRM10SpringBoneJoint.cs | 56 +++++-------------- .../Components/Vrm10Instance/Vrm10Instance.cs | 8 +++ .../Vrm10Instance/Vrm10InstanceSpringBone.cs | 38 ++++++++++++- 4 files changed, 60 insertions(+), 43 deletions(-) diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs index 9990f5fdf..00607bd75 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs @@ -23,6 +23,7 @@ namespace UniVRM10 return; } m_target = (VRM10SpringBoneJoint)target; + VRM10SpringBoneJoint.s_activeForGizmoDraw = m_target; m_stiffnessForceProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_stiffnessForce)); m_gravityPowerProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_gravityPower)); diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs index 867d3fcbd..0ea99000d 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; using UnityEngine; -#if UNITY_EDITOR -using UnityEditor; -#endif + namespace UniVRM10 { @@ -107,53 +105,27 @@ namespace UniVRM10 Debug.LogWarning($"{this} is found in {root}"); } - - (Vrm10InstanceSpringBone.Spring, int) FindTail(Vrm10Instance vrm, VRM10SpringBoneJoint head) - { - foreach (var spring in vrm.SpringBone.Springs) - { - var index = spring.Joints.IndexOf(head); - if (index != -1) - { - if (index + 1 < spring.Joints.Count) - { - return (spring, index); - } - else - { - break; - } - } - } - return default; - } + // 一個だけ色を変えられる + public static VRM10SpringBoneJoint s_activeForGizmoDraw; private void OnDrawGizmosSelected() { var vrm = GetComponentInParent(); - if (vrm == null) + if (vrm != null) { - return; - } - - var (spring, joint_index) = FindTail(vrm, this); - if (spring == null) - { - return; - } - - if (spring.Joints != null && joint_index + 1 < spring.Joints.Count) - { - var tail = spring.Joints[joint_index + 1]; - if (tail != null) + var found = vrm.SpringBone.FindJoint(this); + if (found.HasValue) { - // draw tail - Gizmos.color = Color.yellow; - // tail の radius は head の m_jointRadius で決まる - Gizmos.DrawWireSphere(tail.transform.position, m_jointRadius); - Gizmos.DrawLine(transform.position, tail.transform.position); + var (spring, i) = found.Value; + // Spring の房全体を描画する + spring.RequestDrawGizmos(); + return; } } + + // Spring から参照されていない孤立した Joint + Gizmos.color = new Color(1, 0.75f, 0f); + Gizmos.DrawSphere(transform.position, m_jointRadius); } } } diff --git a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs index 680d04825..8048544a3 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs @@ -162,6 +162,14 @@ namespace UniVRM10 return true; } + private void OnDrawGizmos() + { + foreach (var spring in SpringBone.Springs) + { + spring.DrawGizmos(); + } + } + #region Obsolete [Obsolete] diff --git a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10InstanceSpringBone.cs b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10InstanceSpringBone.cs index c00d4fcb1..0bb5e0dfb 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10InstanceSpringBone.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10InstanceSpringBone.cs @@ -61,12 +61,48 @@ namespace UniVRM10 } } } + + /// + /// VRM10SpringBoneJoint.OnDrawGizmosSelected から複数の描画 Request が来うる。 + /// Vrm10Instance.OnDrawGizmos 経由で1回だけ描画する。 + /// + int m_drawRequest; + public void RequestDrawGizmos() + { + m_drawRequest++; + } + + public void DrawGizmos() + { + if (m_drawRequest == 0) + { + return; + } + m_drawRequest = 0; + + VRM10SpringBoneJoint lastJoint = null; + foreach (var joint in Joints) + { + Gizmos.color = joint == VRM10SpringBoneJoint.s_activeForGizmoDraw ? Color.green : Color.yellow; + Gizmos.matrix = joint.transform.localToWorldMatrix; + if (lastJoint == null) + { + const float f = 0.005f; + Gizmos.DrawCube(Vector3.zero, new Vector3(f, f, f)); + } + else + { + Gizmos.DrawLine(Vector3.zero, -joint.transform.localPosition); + Gizmos.DrawWireSphere(Vector3.zero, joint.m_jointRadius); + } + lastJoint = joint; + } + } } [SerializeField] public List Springs = new List(); - public (Spring, int)? FindJoint(VRM10SpringBoneJoint joint) { for (int i = 0; i < Springs.Count; ++i)