From 11a53c967a1c559788a783213cfbd96e44bc84c1 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sat, 9 Nov 2024 00:37:28 +0900 Subject: [PATCH 1/4] Vrm10InstanceEditor 3tabs. VrmInstance, LookAt, SpringBone --- Assets/VRM10/Editor/Vrm10InstanceEditor.cs | 92 ++++++++++++++++++++-- 1 file changed, 84 insertions(+), 8 deletions(-) diff --git a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs index 2a75a41e6..d5fa337e0 100644 --- a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs +++ b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using UniGLTF; @@ -11,7 +12,31 @@ namespace UniVRM10 public class Vrm10InstanceEditor : Editor { const string SaveTitle = "New folder for vrm-1.0 assets..."; - static string[] SaveExtensions = new string[] { "asset" }; + + Vrm10Instance m_instance; + + SerializedProperty m_vrmObject; + SerializedProperty m_updateType; + + SerializedPropertyEditor m_springboneEditor; + + SerializedProperty m_drawLookatGizmo; + SerializedProperty m_lookatTarget; + SerializedProperty m_lookatTargetType; + + void OnEnable() + { + m_instance = (Vrm10Instance)target; + + m_vrmObject = serializedObject.FindProperty(nameof(m_instance.Vrm)); + m_updateType = serializedObject.FindProperty(nameof(m_instance.UpdateType)); + + m_springboneEditor = SerializedPropertyEditor.Create(serializedObject, nameof(m_instance.SpringBone)); + + m_drawLookatGizmo = serializedObject.FindProperty(nameof(m_instance.DrawLookAtGizmo)); + m_lookatTarget = serializedObject.FindProperty(nameof(m_instance.LookAtTarget)); + m_lookatTargetType = serializedObject.FindProperty(nameof(m_instance.LookAtTargetType)); + } static VRM10Object CreateAsset(string path, Dictionary expressions, Vrm10Instance instance) { @@ -179,18 +204,69 @@ namespace UniVRM10 } } + enum Tab + { + VrmInstance, + LookAt, + SpringBone, + } + + Tab m_tab; + + static readonly string[] Tabs = ((Tab[])Enum.GetValues(typeof(Tab))).Select(x => x.ToString()).ToArray(); + public override void OnInspectorGUI() { - - if (target is Vrm10Instance instance) + if (m_instance.Vrm == null) { - if (instance.Vrm == null) - { - SetupVRM10Object(instance); - } + SetupVRM10Object(m_instance); } - base.OnInspectorGUI(); + using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar)) + { + m_tab = (Tab)GUILayout.Toolbar((int)m_tab, Tabs, new GUIStyle(EditorStyles.toolbarButton), GUI.ToolbarButtonSize.FitToContents); + } + + switch (m_tab) + { + case Tab.VrmInstance: + GUIVrmInstance(); + break; + + case Tab.SpringBone: + GUISpringbon(); + break; + + case Tab.LookAt: + GUILookAt(); + break; + + default: + throw new Exception(); + } + // base.OnInspectorGUI(); + } + + void GUIVrmInstance() + { + serializedObject.Update(); + EditorGUILayout.PropertyField(m_vrmObject); + EditorGUILayout.PropertyField(m_updateType); + serializedObject.ApplyModifiedProperties(); + } + + void GUISpringbon() + { + m_springboneEditor.OnInspectorGUI(); + } + + void GUILookAt() + { + serializedObject.Update(); + EditorGUILayout.PropertyField(m_drawLookatGizmo); + EditorGUILayout.PropertyField(m_lookatTarget); + EditorGUILayout.PropertyField(m_lookatTargetType); + serializedObject.ApplyModifiedProperties(); } public void OnSceneGUI() From 01b34c4b89c1c02dae1d539ad65a0209ca549c44 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sat, 9 Nov 2024 01:42:08 +0900 Subject: [PATCH 2/4] update SpringBone editor --- .../SpringBone/VRM10SpringBoneDrawer.cs | 2 +- Assets/VRM10/Editor/Vrm10InstanceEditor.cs | 84 +++++++++++++++---- 2 files changed, 70 insertions(+), 16 deletions(-) diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneDrawer.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneDrawer.cs index 2a05cf802..bcfca3265 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneDrawer.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneDrawer.cs @@ -8,7 +8,7 @@ namespace UniVRM10 { using static Vrm10InstanceSpringBone; - [CustomPropertyDrawer(typeof(Spring))] + // [CustomPropertyDrawer(typeof(Spring))] public class VRM10SpringBoneDrawer : PropertyDrawer { public override float GetPropertyHeight(SerializedProperty property, GUIContent label) diff --git a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs index d5fa337e0..51ba7721b 100644 --- a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs +++ b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs @@ -18,12 +18,16 @@ namespace UniVRM10 SerializedProperty m_vrmObject; SerializedProperty m_updateType; - SerializedPropertyEditor m_springboneEditor; - SerializedProperty m_drawLookatGizmo; SerializedProperty m_lookatTarget; SerializedProperty m_lookatTargetType; + SerializedProperty m_colliderGroups; + SerializedProperty m_springs; + UnityEditorInternal.ReorderableList m_springList; + // int m_springListIndex = 0; + SerializedProperty m_springSelected; + void OnEnable() { m_instance = (Vrm10Instance)target; @@ -31,11 +35,41 @@ namespace UniVRM10 m_vrmObject = serializedObject.FindProperty(nameof(m_instance.Vrm)); m_updateType = serializedObject.FindProperty(nameof(m_instance.UpdateType)); - m_springboneEditor = SerializedPropertyEditor.Create(serializedObject, nameof(m_instance.SpringBone)); - m_drawLookatGizmo = serializedObject.FindProperty(nameof(m_instance.DrawLookAtGizmo)); m_lookatTarget = serializedObject.FindProperty(nameof(m_instance.LookAtTarget)); m_lookatTargetType = serializedObject.FindProperty(nameof(m_instance.LookAtTargetType)); + + m_colliderGroups = serializedObject.FindProperty($"{nameof(m_instance.SpringBone)}.{nameof(m_instance.SpringBone.ColliderGroups)}"); + m_springs = serializedObject.FindProperty($"{nameof(m_instance.SpringBone)}.{nameof(m_instance.SpringBone.Springs)}"); + m_springList = new(serializedObject, m_springs); + m_springList.drawHeaderCallback += rect => + { + EditorGUI.LabelField(rect, m_springs.displayName); + }; + Action updateSelected = (list) => + { + var index = list.index; + if (index < 0) + { + index = 0; + } + else if (index >= list.count) + { + index = list.count - 1; + } + if (list.index >= 0 && list.index < list.count) + { + m_springSelected = m_springs.GetArrayElementAtIndex(list.index); + m_springSelected.FindPropertyRelative("ColliderGroups").isExpanded = true; + m_springSelected.FindPropertyRelative("Joints").isExpanded = true; + } + else + { + m_springSelected = null; + } + }; + m_springList.onSelectCallback = new(updateSelected); + m_springList.onChangedCallback = new(updateSelected); } static VRM10Object CreateAsset(string path, Dictionary expressions, Vrm10Instance instance) @@ -222,9 +256,18 @@ namespace UniVRM10 SetupVRM10Object(m_instance); } - using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar)) + var backup = GUI.enabled; + try { - m_tab = (Tab)GUILayout.Toolbar((int)m_tab, Tabs, new GUIStyle(EditorStyles.toolbarButton), GUI.ToolbarButtonSize.FitToContents); + GUI.enabled = true; + using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar)) + { + m_tab = (Tab)GUILayout.Toolbar((int)m_tab, Tabs, new GUIStyle(EditorStyles.toolbarButton), GUI.ToolbarButtonSize.FitToContents); + } + } + finally + { + GUI.enabled = backup; } switch (m_tab) @@ -233,14 +276,14 @@ namespace UniVRM10 GUIVrmInstance(); break; - case Tab.SpringBone: - GUISpringbon(); - break; - case Tab.LookAt: GUILookAt(); break; + case Tab.SpringBone: + GUISpringBone(); + break; + default: throw new Exception(); } @@ -255,11 +298,6 @@ namespace UniVRM10 serializedObject.ApplyModifiedProperties(); } - void GUISpringbon() - { - m_springboneEditor.OnInspectorGUI(); - } - void GUILookAt() { serializedObject.Update(); @@ -269,6 +307,22 @@ namespace UniVRM10 serializedObject.ApplyModifiedProperties(); } + void GUISpringBone() + { + serializedObject.Update(); + + EditorGUILayout.PropertyField(m_colliderGroups); + // EditorGUILayout.PropertyField(m_springs); + m_springList.DoLayoutList(); + + if (m_springSelected != null) + { + EditorGUILayout.PropertyField(m_springSelected); + } + + serializedObject.ApplyModifiedProperties(); + } + public void OnSceneGUI() { // 親指のガイド From 8798af484a39ac9a2e9b287ec5b8efa7f71b6614 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sat, 9 Nov 2024 01:56:05 +0900 Subject: [PATCH 3/4] =?UTF-8?q?VRM10SpringBoneDrawer=20=E3=81=AE=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/VRM10/Editor/Vrm10InstanceEditor.cs | 50 +++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs index 51ba7721b..32f744646 100644 --- a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs +++ b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs @@ -27,6 +27,7 @@ namespace UniVRM10 UnityEditorInternal.ReorderableList m_springList; // int m_springListIndex = 0; SerializedProperty m_springSelected; + SerializedProperty m_springSelectedJoints; void OnEnable() { @@ -61,7 +62,8 @@ namespace UniVRM10 { m_springSelected = m_springs.GetArrayElementAtIndex(list.index); m_springSelected.FindPropertyRelative("ColliderGroups").isExpanded = true; - m_springSelected.FindPropertyRelative("Joints").isExpanded = true; + m_springSelectedJoints = m_springSelected.FindPropertyRelative("Joints"); + m_springSelectedJoints.isExpanded = true; } else { @@ -318,11 +320,57 @@ namespace UniVRM10 if (m_springSelected != null) { EditorGUILayout.PropertyField(m_springSelected); + + if (m_springSelectedJoints.arraySize > 0 && GUILayout.Button("create joints to children")) + { + if (EditorUtility.DisplayDialog("auto joints", + "先頭の joint の子孫をリストに追加します。\n既存のリストは上書きされます。", + "ok", + "cancel")) + { + var joints = m_springSelectedJoints; + var root = (VRM10SpringBoneJoint)joints.GetArrayElementAtIndex(0).objectReferenceValue; + joints.ClearArray(); + int i = 0; + // 0 + joints.InsertArrayElementAtIndex(i); + joints.GetArrayElementAtIndex(i).objectReferenceValue = root; + ++i; + // 1... + foreach (var joint in MakeJointsRecursive(root)) + { + joints.InsertArrayElementAtIndex(i); + joints.GetArrayElementAtIndex(i).objectReferenceValue = joint; + ++i; + } + } + } } serializedObject.ApplyModifiedProperties(); } + static IEnumerable MakeJointsRecursive(VRM10SpringBoneJoint parent) + { + if (parent.transform.childCount > 0) + { + var child = parent.transform.GetChild(0); + var joint = child.gameObject.GetOrAddComponent(); + // set params + joint.m_dragForce = parent.m_dragForce; + joint.m_gravityDir = parent.m_gravityDir; + joint.m_gravityPower = parent.m_gravityPower; + joint.m_jointRadius = parent.m_jointRadius; + joint.m_stiffnessForce = parent.m_stiffnessForce; + + yield return joint; + foreach (var x in MakeJointsRecursive(joint)) + { + yield return x; + } + } + } + public void OnSceneGUI() { // 親指のガイド From daff196277cd4148529d01acdb7e520f5d09aaa3 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 12 Nov 2024 14:56:17 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=E4=B8=8A=E3=82=88=E3=81=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/VRM10/Editor/Vrm10InstanceEditor.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs index 32f744646..7166bd9d5 100644 --- a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs +++ b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs @@ -13,6 +13,15 @@ namespace UniVRM10 { const string SaveTitle = "New folder for vrm-1.0 assets..."; + enum Tab + { + VrmInstance, + LookAt, + SpringBone, + } + + Tab m_tab; + Vrm10Instance m_instance; SerializedProperty m_vrmObject; @@ -240,14 +249,6 @@ namespace UniVRM10 } } - enum Tab - { - VrmInstance, - LookAt, - SpringBone, - } - - Tab m_tab; static readonly string[] Tabs = ((Tab[])Enum.GetValues(typeof(Tab))).Select(x => x.ToString()).ToArray();