From 6b1314c2427baa3ea23803926f1d7469227d3f23 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 29 Nov 2024 17:56:34 +0900 Subject: [PATCH 1/3] =?UTF-8?q?play=20=E4=B8=AD=E3=81=AE=20collider=20?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=A7=20ReconstructSpringBone=20=E3=82=92?= =?UTF-8?q?=E5=91=BC=E3=81=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpringBone/VRM10SpringBoneColliderEditor.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderEditor.cs index 73da1d312..8b0a2e52e 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderEditor.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderEditor.cs @@ -102,6 +102,8 @@ namespace UniVRM10 { HandleUtility.Repaint(); + bool updated = false; + if (s_selected == _target) { var c = _target; @@ -115,6 +117,7 @@ namespace UniVRM10 { Undo.RecordObject(c, "collider"); c.Tail = newTargetPosition; + updated = true; } } else @@ -125,9 +128,16 @@ namespace UniVRM10 { Undo.RecordObject(c, "collider"); c.Offset = newTargetPosition; + updated = true; } } } + + if (Application.isPlaying && updated) + { + // 反映! + _vrm.Runtime.SpringBone.ReconstructSpringBone(); + } } } } \ No newline at end of file From 1087bfe79ddd3c53677d688e8e3792396c1293d9 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 29 Nov 2024 17:59:34 +0900 Subject: [PATCH 2/3] =?UTF-8?q?static=20=E5=A4=89=E6=95=B0=E3=81=AB?= =?UTF-8?q?=E5=88=A5=E3=83=A2=E3=83=87=E3=83=AB=E3=81=AE=E5=8F=82=E7=85=A7?= =?UTF-8?q?=E3=81=8C=E6=AE=8B=E3=82=8B=E5=A0=B4=E5=90=88=E3=81=82=E3=82=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpringBone/VRM10SpringBoneColliderGroupEditor.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderGroupEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderGroupEditor.cs index d5e0ff876..079129434 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderGroupEditor.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderGroupEditor.cs @@ -11,10 +11,16 @@ namespace UniVRM10 [CustomEditor(typeof(VRM10SpringBoneColliderGroup))] class VRM10SpringBoneColliderGroupEditor : Editor { + VRM10SpringBoneColliderGroup m_target; ListView m_colliders; static VRM10SpringBoneCollider s_collider; + void OnEnable() + { + m_target = (VRM10SpringBoneColliderGroup)target; + } + public override VisualElement CreateInspectorGUI() { var root = new VisualElement(); @@ -66,8 +72,9 @@ namespace UniVRM10 return; } - if (s_collider is VRM10SpringBoneCollider c) + if (s_collider != null && m_target.Colliders.Contains(s_collider)) { + var c = s_collider; EditorGUI.BeginChangeCheck(); Handles.matrix = c.transform.localToWorldMatrix; var newTargetPosition = Handles.PositionHandle(c.Offset, Quaternion.identity); From 6cee7b3b7027e266ba32385d7f43fc6b5c746783 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 29 Nov 2024 19:00:09 +0900 Subject: [PATCH 3/3] =?UTF-8?q?capsule=20=E3=81=AE=E9=A0=AD=E5=81=B4?= =?UTF-8?q?=E3=82=82=20drag=20=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88?= =?UTF-8?q?=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 --- .../VRM10SpringBoneColliderEditor.cs | 133 ++++++++++++++---- .../SpringBone/VRM10SpringBoneCollider.cs | 5 + 2 files changed, 109 insertions(+), 29 deletions(-) diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderEditor.cs index 8b0a2e52e..0a45ee5c2 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderEditor.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneColliderEditor.cs @@ -14,8 +14,16 @@ namespace UniVRM10 SerializedProperty _colliderType; SerializedProperty _offset; SerializedProperty _tail; + Tool _last = Tool.None; + bool _openUtility = false; - static VRM10SpringBoneCollider s_selected; + enum HandleType + { + Offset, + Tail, + Normal, + } + static (VRM10SpringBoneCollider Collider, HandleType HandleType)? s_selected; private void OnEnable() { @@ -66,11 +74,39 @@ namespace UniVRM10 EditorGUILayout.BeginHorizontal(); { - if (GUILayout.Button("Drag handle")) + if (GUILayout.Button("Drag offset")) { - s_selected = _target; + s_selected = (_target, HandleType.Offset); } + if ( + _target.ColliderType == VRM10SpringBoneColliderTypes.Capsule + || _target.ColliderType == VRM10SpringBoneColliderTypes.CapsuleInside) + { + if (GUILayout.Button("Drag tail")) + { + s_selected = (_target, HandleType.Tail); + } + } + if (_target.ColliderType == VRM10SpringBoneColliderTypes.Plane) + { + if (GUILayout.Button("Drag normal")) + { + s_selected = (_target, HandleType.Normal); + } + } + using (new EditorGUI.DisabledScope(s_selected == default)) + { + if (GUILayout.Button("Drag end")) + { + s_selected = default; + } + } + } + EditorGUILayout.EndHorizontal(); + _openUtility = EditorGUILayout.Foldout(_openUtility, "utility"); + if (_openUtility) + { if (_target.transform.childCount > 0) { if (GUILayout.Button("Fit head-tail capsule")) @@ -83,7 +119,6 @@ namespace UniVRM10 } } } - EditorGUILayout.EndHorizontal(); if (serializedObject.ApplyModifiedProperties()) { @@ -104,39 +139,79 @@ namespace UniVRM10 bool updated = false; - if (s_selected == _target) + if (s_selected.HasValue && s_selected.Value.Collider == _target) { - var c = _target; - Handles.matrix = c.transform.localToWorldMatrix; - if (_target.ColliderType == VRM10SpringBoneColliderTypes.Capsule - || _target.ColliderType == VRM10SpringBoneColliderTypes.CapsuleInside) + if (Tools.current != Tool.None) { - EditorGUI.BeginChangeCheck(); - var newTargetPosition = Handles.PositionHandle(c.Tail, Quaternion.identity); - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(c, "collider"); - c.Tail = newTargetPosition; - updated = true; - } + _last = Tools.current; } - else + Tools.current = Tool.None; + + Handles.matrix = _target.transform.localToWorldMatrix; + switch (s_selected.Value.HandleType) { - EditorGUI.BeginChangeCheck(); - var newTargetPosition = Handles.PositionHandle(c.Offset, Quaternion.identity); - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(c, "collider"); - c.Offset = newTargetPosition; - updated = true; - } + case HandleType.Offset: + { + Handles.Label(_target.Offset, "Collider offset"); + EditorGUI.BeginChangeCheck(); + var newTargetPosition = Handles.PositionHandle(_target.Offset, Quaternion.identity); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(_target, "collider"); + _target.Offset = newTargetPosition; + updated = true; + } + } + break; + + case HandleType.Tail: + { + Handles.Label(_target.Tail, "Capsule tail"); + EditorGUI.BeginChangeCheck(); + var newTargetPosition = Handles.PositionHandle(_target.Tail, Quaternion.identity); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(_target, "collider"); + _target.Tail = newTargetPosition; + updated = true; + } + } + break; + + case HandleType.Normal: + { + Handles.Label(_target.Offset, "Plane normal"); + EditorGUI.BeginChangeCheck(); + var r = Quaternion.FromToRotation(Vector3.up, _target.Normal); + var newRotation = Handles.RotationHandle(r, _target.Offset); + Handles.DrawLine(_target.Offset, _target.Offset + _target.Normal); + if (EditorGUI.EndChangeCheck()) + { + Undo.RecordObject(_target, "collider"); + _target.Normal = newRotation * Vector3.up; + updated = true; + } + } + break; + } + } + else + { + if (_last != Tool.None) + { + Tools.current = _last; + _last = Tool.None; } } - if (Application.isPlaying && updated) + if (updated) { - // 反映! - _vrm.Runtime.SpringBone.ReconstructSpringBone(); + _target.OnValidate(); + if (Application.isPlaying && updated) + { + // 反映! + _vrm.Runtime.SpringBone.ReconstructSpringBone(); + } } } } diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs index 482707acc..0685eb687 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs @@ -34,6 +34,11 @@ namespace UniVRM10 public bool IsSelected => GetInstanceID() == SelectedGuid; + public void OnValidate() + { + Normal = Normal.normalized; + } + void OnDrawGizmosSelected() { DrawGizmos();