From 7234430424c5565bc64c0ca3249e121bd440685a Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 28 Nov 2024 14:00:47 +0900 Subject: [PATCH 1/4] m_Script --- Assets/VRM10/Editor/Vrm10InstanceEditor.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs index 7166bd9d5..b58789e68 100644 --- a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs +++ b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs @@ -24,6 +24,7 @@ namespace UniVRM10 Vrm10Instance m_instance; + SerializedProperty m_script; SerializedProperty m_vrmObject; SerializedProperty m_updateType; @@ -41,6 +42,7 @@ namespace UniVRM10 void OnEnable() { m_instance = (Vrm10Instance)target; + m_script = serializedObject.FindProperty("m_Script"); m_vrmObject = serializedObject.FindProperty(nameof(m_instance.Vrm)); m_updateType = serializedObject.FindProperty(nameof(m_instance.UpdateType)); @@ -254,6 +256,11 @@ namespace UniVRM10 public override void OnInspectorGUI() { + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.PropertyField(m_script); + } + if (m_instance.Vrm == null) { SetupVRM10Object(m_instance); From 97355c6f86e87238d1820ef7b7423bde48d409f3 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 28 Nov 2024 16:10:18 +0900 Subject: [PATCH 2/4] =?UTF-8?q?VisualElement=20TabView=20=E3=82=82?= =?UTF-8?q?=E3=81=A9=E3=81=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/VRM10/Editor/Vrm10InstanceEditor.cs | 84 +++++++++++----------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs index b58789e68..ecfadda39 100644 --- a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs +++ b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs @@ -5,6 +5,9 @@ using UniGLTF; using UniGLTF.Utils; using UnityEditor; using UnityEngine; +using UnityEngine.UIElements; +using UnityEditor.UIElements; + namespace UniVRM10 { @@ -20,8 +23,6 @@ namespace UniVRM10 SpringBone, } - Tab m_tab; - Vrm10Instance m_instance; SerializedProperty m_script; @@ -251,57 +252,60 @@ namespace UniVRM10 } } - - static readonly string[] Tabs = ((Tab[])Enum.GetValues(typeof(Tab))).Select(x => x.ToString()).ToArray(); - - public override void OnInspectorGUI() + public override VisualElement CreateInspectorGUI() { - using (new EditorGUI.DisabledScope(true)) + var root = new VisualElement(); + + root.Bind(serializedObject); { - EditorGUILayout.PropertyField(m_script); + var s = new PropertyField { bindingPath = "m_Script" }; + s.SetEnabled(false); + root.Add(s); } - if (m_instance.Vrm == null) - { - SetupVRM10Object(m_instance); - } + var tabs = new EnumField("tab", default(Tab)); + root.Add(tabs); - var backup = GUI.enabled; - try + var body = new VisualElement(); + List<(Tab, VisualElement)> contents = new() { - GUI.enabled = true; - using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar)) + (Tab.VrmInstance, new IMGUIContainer(GUIVrmInstance)), + (Tab.LookAt, new IMGUIContainer(GUILookAt)), + (Tab.SpringBone, new IMGUIContainer(GUISpringBone)), + }; + foreach (var (tab, content) in contents) + { + // content.visible = tab == Tab.VrmInstance; + content.style.display = tab == Tab.VrmInstance + ? DisplayStyle.Flex + : DisplayStyle.None + ; + body.Add(content); + } + root.Add(body); + + tabs.RegisterValueChangedCallback(e => + { + var selected = (Tab)e.newValue; + foreach (var (tab, content) in contents) { - m_tab = (Tab)GUILayout.Toolbar((int)m_tab, Tabs, new GUIStyle(EditorStyles.toolbarButton), GUI.ToolbarButtonSize.FitToContents); + // content.visible = tab == selected; + content.style.display = tab == selected + ? DisplayStyle.Flex + : DisplayStyle.None + ; } - } - finally - { - GUI.enabled = backup; - } + }); - switch (m_tab) - { - case Tab.VrmInstance: - GUIVrmInstance(); - break; - - case Tab.LookAt: - GUILookAt(); - break; - - case Tab.SpringBone: - GUISpringBone(); - break; - - default: - throw new Exception(); - } - // base.OnInspectorGUI(); + return root; } void GUIVrmInstance() { + if (m_instance.Vrm == null) + { + SetupVRM10Object(m_instance); + } serializedObject.Update(); EditorGUILayout.PropertyField(m_vrmObject); EditorGUILayout.PropertyField(m_updateType); From 1f55d0dcfbbe062992f9e07f2c3f79f56183dc21 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 28 Nov 2024 19:41:39 +0900 Subject: [PATCH 3/4] GUISpringBone use VisualElement --- .../SpringBone/VRM10SpringBoneDrawer.cs | 2 +- Assets/VRM10/Editor/Vrm10InstanceEditor.cs | 114 ++++++------------ 2 files changed, 40 insertions(+), 76 deletions(-) diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneDrawer.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneDrawer.cs index bcfca3265..2a05cf802 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 ecfadda39..e0e61e480 100644 --- a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs +++ b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs @@ -15,6 +15,8 @@ namespace UniVRM10 public class Vrm10InstanceEditor : Editor { const string SaveTitle = "New folder for vrm-1.0 assets..."; + const string SpringsPath = "SpringBone.Springs"; + const string CollidersPath = "SpringBone.ColliderGroups"; enum Tab { @@ -33,13 +35,6 @@ namespace UniVRM10 SerializedProperty m_lookatTarget; SerializedProperty m_lookatTargetType; - SerializedProperty m_colliderGroups; - SerializedProperty m_springs; - UnityEditorInternal.ReorderableList m_springList; - // int m_springListIndex = 0; - SerializedProperty m_springSelected; - SerializedProperty m_springSelectedJoints; - void OnEnable() { m_instance = (Vrm10Instance)target; @@ -51,39 +46,6 @@ namespace UniVRM10 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_springSelectedJoints = m_springSelected.FindPropertyRelative("Joints"); - m_springSelectedJoints.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) @@ -263,7 +225,7 @@ namespace UniVRM10 root.Add(s); } - var tabs = new EnumField("tab", default(Tab)); + var tabs = new EnumField("select UI", default(Tab)); root.Add(tabs); var body = new VisualElement(); @@ -271,7 +233,7 @@ namespace UniVRM10 { (Tab.VrmInstance, new IMGUIContainer(GUIVrmInstance)), (Tab.LookAt, new IMGUIContainer(GUILookAt)), - (Tab.SpringBone, new IMGUIContainer(GUISpringBone)), + (Tab.SpringBone, GUISpringBone()), }; foreach (var (tab, content) in contents) { @@ -321,45 +283,47 @@ namespace UniVRM10 serializedObject.ApplyModifiedProperties(); } - void GUISpringBone() + VisualElement GUISpringBone() { - serializedObject.Update(); + var root = new VisualElement(); - EditorGUILayout.PropertyField(m_colliderGroups); - // EditorGUILayout.PropertyField(m_springs); - m_springList.DoLayoutList(); - - if (m_springSelected != null) + root.Add(new PropertyField { - EditorGUILayout.PropertyField(m_springSelected); + bindingPath = CollidersPath, + }); - if (m_springSelectedJoints.arraySize > 0 && GUILayout.Button("create joints to children")) + var springs = new ListView + { + bindingPath = SpringsPath, + makeItem = () => { - 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; - } - } - } - } + return new Label(); + }, + bindItem = (v, i) => + { + var prop = serializedObject.FindProperty($"{SpringsPath}.Array.data[{i}].Name"); + (v as Label).BindProperty(prop); + }, + }; + springs.headerTitle = "Springs"; + springs.showFoldoutHeader = true; + springs.showAddRemoveFooter = true; + root.Add(springs); - serializedObject.ApplyModifiedProperties(); + var selected = new PropertyField(); + springs.selectedIndicesChanged += (e) => + { + var values = e.ToArray(); + if (values.Length > 0) + { + var path = $"{SpringsPath}.Array.data[{values[0]}]"; + var prop = serializedObject.FindProperty(path); + selected.BindProperty(prop); + } + }; + root.Add(selected); + + return root; } static IEnumerable MakeJointsRecursive(VRM10SpringBoneJoint parent) From 7ec1951f3716b5772db06c7614f74bdc52baac85 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 28 Nov 2024 20:06:57 +0900 Subject: [PATCH 4/4] highlight selected spring --- Assets/VRM10/Editor/Vrm10InstanceEditor.cs | 37 ++++++++++++++++------ 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs index e0e61e480..2b1125235 100644 --- a/Assets/VRM10/Editor/Vrm10InstanceEditor.cs +++ b/Assets/VRM10/Editor/Vrm10InstanceEditor.cs @@ -35,6 +35,8 @@ namespace UniVRM10 SerializedProperty m_lookatTarget; SerializedProperty m_lookatTargetType; + ListView m_springs; + void OnEnable() { m_instance = (Vrm10Instance)target; @@ -287,12 +289,9 @@ namespace UniVRM10 { var root = new VisualElement(); - root.Add(new PropertyField - { - bindingPath = CollidersPath, - }); + root.Add(new PropertyField { bindingPath = CollidersPath }); - var springs = new ListView + m_springs = new ListView { bindingPath = SpringsPath, makeItem = () => @@ -305,13 +304,13 @@ namespace UniVRM10 (v as Label).BindProperty(prop); }, }; - springs.headerTitle = "Springs"; - springs.showFoldoutHeader = true; - springs.showAddRemoveFooter = true; - root.Add(springs); + m_springs.headerTitle = "Springs"; + m_springs.showFoldoutHeader = true; + m_springs.showAddRemoveFooter = true; + root.Add(m_springs); var selected = new PropertyField(); - springs.selectedIndicesChanged += (e) => + m_springs.selectedIndicesChanged += (e) => { var values = e.ToArray(); if (values.Length > 0) @@ -349,8 +348,26 @@ namespace UniVRM10 public void OnSceneGUI() { + HandleUtility.Repaint(); + // 親指のガイド DrawThumbGuide(target as Vrm10Instance); + + // 選択中の SpringBone + if (m_springs != null && m_springs.selectedIndex >= 0 && m_springs.selectedIndex < m_instance.SpringBone.Springs.Count) + { + Handles.color = Color.red; + var selected = m_instance.SpringBone.Springs[m_springs.selectedIndex]; + for (int i = 1; i < selected.Joints.Count; ++i) + { + var head = selected.Joints[i - 1]; + var tail = selected.Joints[i]; + if (head != null && tail != null) + { + Handles.DrawLine(head.transform.position, tail.transform.position); + } + } + } } static void DrawThumbGuide(Vrm10Instance instance)