From 91a8ef204592cfdfbfc8612bf6c05e9de82fd7fd Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 6 Oct 2022 21:09:28 +0900 Subject: [PATCH] implement Joint gizmo --- .../SpringBone/VRM10SpringBoneCollider.cs | 2 +- .../SpringBone/VRM10SpringBoneJoint.cs | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs index 9a51c56da..578784f76 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs @@ -27,7 +27,7 @@ namespace UniVRM10 public bool IsSelected => GetInstanceID() == SelectedGuid; - private void OnDrawGizmosSelected() + public void OnDrawGizmosSelected() { Gizmos.matrix = transform.localToWorldMatrix; switch (ColliderType) diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs index 3af0b98cf..5a990c9ae 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs @@ -26,6 +26,9 @@ namespace UniVRM10 [SerializeField, Range(0, 0.5f), Header("Collision")] public float m_jointRadius = 0.02f; + [SerializeField] + public Color m_gizmoColor = Color.green; + void AddJointRecursive(Transform t, VRM10SpringBoneJoint src) { var joint = t.gameObject.GetComponent(); @@ -106,5 +109,68 @@ 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; + } + + private void OnDrawGizmosSelected() + { + var vrm = GetComponentInParent(); + if (vrm == null) + { + return; + } + + Gizmos.color = m_gizmoColor; + + // draw head + // Gizmos.DrawSphere(transform.position, m_jointRadius); + + 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) + { + // draw tail + Gizmos.DrawSphere(tail.transform.position, tail.m_jointRadius); + Gizmos.DrawLine(transform.position, tail.transform.position); + } + } + + foreach (var colliderGroup in spring.ColliderGroups) + { + foreach (var collider in colliderGroup.Colliders) + { + if (collider != null) + { + collider.OnDrawGizmosSelected(); + } + } + } + } } }