From 9dc582150b9d930bd4dfe40ff05c66b0ac9767c2 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 6 Jul 2022 17:28:29 +0900 Subject: [PATCH] implement PositionHandle for VRM10SpringBoneCollider --- .../VRM10SpringBoneColliderEditorTool.cs | 86 +++++++++++++++++++ .../VRM10SpringBoneColliderEditorTool.cs.meta | 11 +++ .../SpringBone/VRM10SpringBoneCollider.cs | 1 + 3 files changed, 98 insertions(+) create mode 100644 Assets/VRM10/Editor/EditorTool/VRM10SpringBoneColliderEditorTool.cs create mode 100644 Assets/VRM10/Editor/EditorTool/VRM10SpringBoneColliderEditorTool.cs.meta diff --git a/Assets/VRM10/Editor/EditorTool/VRM10SpringBoneColliderEditorTool.cs b/Assets/VRM10/Editor/EditorTool/VRM10SpringBoneColliderEditorTool.cs new file mode 100644 index 000000000..036fb4098 --- /dev/null +++ b/Assets/VRM10/Editor/EditorTool/VRM10SpringBoneColliderEditorTool.cs @@ -0,0 +1,86 @@ +using UnityEditor; +using UnityEditor.EditorTools; +using UnityEngine; + +namespace UniVRM10 +{ + [EditorTool("vrm-1.0/SpringBoneCollider", typeof(UniVRM10.VRM10SpringBoneCollider))] + class VRM10SpringBoneColliderEditorTool : EditorTool + { + static GUIContent s_cachedIcon; + public override GUIContent toolbarIcon + { + get + { + if (s_cachedIcon == null) + { + s_cachedIcon = EditorGUIUtility.IconContent("d_editcollision_32", "|vrm-1.0 SpringBoneCollider"); + } + return s_cachedIcon; + } + } + + void OnEnable() + { + ToolManager.activeToolChanged += ActiveToolDidChange; + } + + void OnDisable() + { + ToolManager.activeToolChanged -= ActiveToolDidChange; + } + + void ActiveToolDidChange() + { + if (!ToolManager.IsActiveTool(this)) + { + return; + } + } + + public override void OnToolGUI(EditorWindow window) + { + if (Selection.activeTransform == null) + { + return; + } + var collider = Selection.activeTransform.GetComponent(); + if (collider == null) + { + return; + } + + Handles.matrix = collider.transform.localToWorldMatrix; + { + Handles.Label(collider.Offset, "Head"); + EditorGUI.BeginChangeCheck(); + var offset = Handles.PositionHandle(collider.Offset, Quaternion.identity); + var offsetChanged = EditorGUI.EndChangeCheck(); + if (offsetChanged) + { + Undo.RecordObject(collider, "SpringBoneCollider"); + + var delta = offset - collider.Offset; + collider.Offset = offset; + if (collider.ColliderType == VRM10SpringBoneColliderTypes.Capsule) + { + collider.Tail += delta; + } + } + + if (collider.ColliderType == VRM10SpringBoneColliderTypes.Capsule) + { + Handles.Label(collider.Tail, "Tail"); + EditorGUI.BeginChangeCheck(); + var tail = Handles.PositionHandle(collider.Tail, Quaternion.identity); + var tailChanged = EditorGUI.EndChangeCheck(); + if (tailChanged) + { + Undo.RecordObject(collider, "SpringBoneCollider"); + collider.Tail = tail; + } + } + } + } + } +} \ No newline at end of file diff --git a/Assets/VRM10/Editor/EditorTool/VRM10SpringBoneColliderEditorTool.cs.meta b/Assets/VRM10/Editor/EditorTool/VRM10SpringBoneColliderEditorTool.cs.meta new file mode 100644 index 000000000..77b9d0140 --- /dev/null +++ b/Assets/VRM10/Editor/EditorTool/VRM10SpringBoneColliderEditorTool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eb79df70485ab8548bdd417c7fcbe04a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs index 3f6f16e74..9a51c56da 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs @@ -41,6 +41,7 @@ namespace UniVRM10 Gizmos.color = Color.cyan; Gizmos.DrawWireSphere(Offset, Radius); Gizmos.DrawWireSphere(Tail, Radius); + Gizmos.DrawLine(Offset, Tail); break; } }