From 3f9071f679ffa5a0718d2189b975d6c2a7d2b026 Mon Sep 17 00:00:00 2001
From: 0b5vr <0b5vr@0b5vr.com>
Date: Thu, 8 Dec 2022 20:27:57 +0900
Subject: [PATCH 1/6] feature (VRM1, SpringBone): add limit break slider to
spring bone joint properties
---
.../SpringBone/VRM10SpringBoneJointEditor.cs | 98 +++++++++++++++++++
.../VRM10SpringBoneJointEditor.cs.meta | 11 +++
.../SpringBone/VRM10SpringBoneJoint.cs | 6 +-
3 files changed, 112 insertions(+), 3 deletions(-)
create mode 100644 Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
create mode 100644 Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs.meta
diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
new file mode 100644
index 000000000..d43d38d16
--- /dev/null
+++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
@@ -0,0 +1,98 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace UniVRM10
+{
+ [CustomEditor(typeof(VRM10SpringBoneJoint))]
+ class VRM10SpringBoneJointEditor : Editor
+ {
+ private VRM10SpringBoneJoint m_target;
+ private SerializedProperty m_stiffnessForceProp;
+ private SerializedProperty m_gravityPowerProp;
+ private SerializedProperty m_gravityDirProp;
+ private SerializedProperty m_dragForceProp;
+ private SerializedProperty m_jointRadiusProp;
+
+ void OnEnable()
+ {
+ if (target == null)
+ {
+ return;
+ }
+ m_target = (VRM10SpringBoneJoint)target;
+
+ m_stiffnessForceProp = serializedObject.FindProperty("m_stiffnessForce");
+ m_gravityPowerProp = serializedObject.FindProperty("m_gravityPower");
+ m_gravityDirProp = serializedObject.FindProperty("m_gravityDir");
+ m_dragForceProp = serializedObject.FindProperty("m_dragForce");
+ m_jointRadiusProp = serializedObject.FindProperty("m_jointRadius");
+ }
+
+ public override void OnInspectorGUI()
+ {
+ serializedObject.Update();
+
+ EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
+
+ LimitBreakSlider(m_stiffnessForceProp, 0.0f, 4.0f, 0.0f, Mathf.Infinity);
+ LimitBreakSlider(m_gravityPowerProp, 0.0f, 2.0f, 0.0f, Mathf.Infinity);
+ EditorGUILayout.PropertyField(m_gravityDirProp);
+ EditorGUILayout.PropertyField(m_dragForceProp);
+
+ EditorGUILayout.Space();
+
+ EditorGUILayout.LabelField("Collision", EditorStyles.boldLabel);
+
+ LimitBreakSlider(m_jointRadiusProp, 0.0f, 0.5f, 0.0f, Mathf.Infinity);
+
+ serializedObject.ApplyModifiedProperties();
+ }
+
+ ///
+ /// スライダーと数値入力で限界値の違う、所謂「限界突破スライダー」を作成する
+ /// `EditorGUILayout.PropertyField` の代替として利用する
+ ///
+ private static void LimitBreakSlider(SerializedProperty property, float sliderLeft, float sliderRight, float numberLeft, float numberRight)
+ {
+ var label = new GUIContent(property.displayName);
+ var currentValue = property.floatValue;
+
+ var rect = EditorGUILayout.GetControlRect();
+
+ EditorGUI.BeginProperty(rect, label, property);
+
+ rect = EditorGUI.PrefixLabel(rect, label);
+
+ // slider
+ {
+ EditorGUI.BeginChangeCheck();
+
+ var sliderRect = rect;
+ sliderRect.width -= 55.0f;
+ rect.xMin += rect.width - 50.0f;
+
+ var clampedvalue = Mathf.Clamp(currentValue, sliderLeft, sliderRight);
+ var sliderValue = GUI.HorizontalSlider(sliderRect, clampedvalue, sliderLeft, sliderRight);
+
+ if (EditorGUI.EndChangeCheck())
+ {
+ property.floatValue = sliderValue;
+ }
+ }
+
+ // number
+ {
+ EditorGUI.BeginChangeCheck();
+
+ var numberValue = Mathf.Clamp(EditorGUI.FloatField(rect, currentValue), numberLeft, numberRight);
+
+ if (EditorGUI.EndChangeCheck())
+ {
+ property.floatValue = numberValue;
+ }
+ }
+
+ EditorGUI.EndProperty();
+ }
+ }
+}
diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs.meta b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs.meta
new file mode 100644
index 000000000..5dba9344a
--- /dev/null
+++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cb6829ce1ea93194fbd08e175456a797
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs
index 289087dda..867d3fcbd 100644
--- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs
+++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs
@@ -11,10 +11,10 @@ namespace UniVRM10
[DisallowMultipleComponent]
public class VRM10SpringBoneJoint : MonoBehaviour
{
- [SerializeField, Range(0, 4), Header("Settings")]
+ [SerializeField]
public float m_stiffnessForce = 1.0f;
- [SerializeField, Range(0, 2)]
+ [SerializeField]
public float m_gravityPower = 0;
[SerializeField]
@@ -23,7 +23,7 @@ namespace UniVRM10
[SerializeField, Range(0, 1)]
public float m_dragForce = 0.4f;
- [SerializeField, Range(0, 0.5f), Header("Collision")]
+ [SerializeField]
public float m_jointRadius = 0.02f;
void AddJointRecursive(Transform t, VRM10SpringBoneJoint src)
From cd88d0744ffa014113b96368fe6e8f5c38b34b23 Mon Sep 17 00:00:00 2001
From: 0b5vr <0b5vr@0b5vr.com>
Date: Thu, 8 Dec 2022 20:40:15 +0900
Subject: [PATCH 2/6] feature (VRM0, SpringBone): add limit break slider to
spring bone joint properties
---
.../Editor/SpringBone/VRMSpringBoneEditor.cs | 121 ++++++++++++++++++
.../SpringBone/VRMSpringBoneEditor.cs.meta | 11 ++
.../VRM/Runtime/SpringBone/VRMSpringBone.cs | 6 +-
3 files changed, 133 insertions(+), 5 deletions(-)
create mode 100644 Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
create mode 100644 Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs.meta
diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
new file mode 100644
index 000000000..70f1c66ab
--- /dev/null
+++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
@@ -0,0 +1,121 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace VRM
+{
+ [CustomEditor(typeof(VRMSpringBone))]
+ class VRM10SpringBoneJointEditor : Editor
+ {
+ private VRMSpringBone m_target;
+
+ private SerializedProperty m_commentProp;
+ private SerializedProperty m_gizmoColorProp;
+ private SerializedProperty m_stiffnessForceProp;
+ private SerializedProperty m_gravityPowerProp;
+ private SerializedProperty m_gravityDirProp;
+ private SerializedProperty m_dragForceProp;
+ private SerializedProperty m_centerProp;
+ private SerializedProperty m_rootBonesProp;
+ private SerializedProperty m_hitRadiusProp;
+ private SerializedProperty m_colliderGroupsProp;
+ private SerializedProperty m_updateTypeProp;
+
+ void OnEnable()
+ {
+ if (target == null)
+ {
+ return;
+ }
+ m_target = (VRMSpringBone)target;
+
+ m_commentProp = serializedObject.FindProperty("m_comment");
+ m_gizmoColorProp = serializedObject.FindProperty("m_gizmoColor");
+ m_stiffnessForceProp = serializedObject.FindProperty("m_stiffnessForce");
+ m_gravityPowerProp = serializedObject.FindProperty("m_gravityPower");
+ m_gravityDirProp = serializedObject.FindProperty("m_gravityDir");
+ m_dragForceProp = serializedObject.FindProperty("m_dragForce");
+ m_centerProp = serializedObject.FindProperty("m_center");
+ m_rootBonesProp = serializedObject.FindProperty("RootBones");
+ m_hitRadiusProp = serializedObject.FindProperty("m_hitRadius");
+ m_colliderGroupsProp = serializedObject.FindProperty("ColliderGroups");
+ m_updateTypeProp = serializedObject.FindProperty("m_updateType");
+ }
+
+ public override void OnInspectorGUI()
+ {
+ serializedObject.Update();
+
+ EditorGUILayout.PropertyField(m_commentProp);
+ EditorGUILayout.PropertyField(m_gizmoColorProp);
+
+ EditorGUILayout.Space();
+
+ EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
+
+ LimitBreakSlider(m_stiffnessForceProp, 0.0f, 4.0f, 0.0f, Mathf.Infinity);
+ LimitBreakSlider(m_gravityPowerProp, 0.0f, 2.0f, 0.0f, Mathf.Infinity);
+ EditorGUILayout.PropertyField(m_gravityDirProp);
+ EditorGUILayout.PropertyField(m_dragForceProp);
+ EditorGUILayout.PropertyField(m_centerProp);
+ EditorGUILayout.PropertyField(m_rootBonesProp);
+
+ EditorGUILayout.Space();
+
+ EditorGUILayout.LabelField("Collision", EditorStyles.boldLabel);
+
+ LimitBreakSlider(m_hitRadiusProp, 0.0f, 0.5f, 0.0f, Mathf.Infinity);
+ EditorGUILayout.PropertyField(m_colliderGroupsProp);
+ EditorGUILayout.PropertyField(m_updateTypeProp);
+
+
+ serializedObject.ApplyModifiedProperties();
+ }
+
+ ///
+ /// スライダーと数値入力で限界値の違う、所謂「限界突破スライダー」を作成する
+ /// `EditorGUILayout.PropertyField` の代替として利用する
+ ///
+ private static void LimitBreakSlider(SerializedProperty property, float sliderLeft, float sliderRight, float numberLeft, float numberRight)
+ {
+ var label = new GUIContent(property.displayName);
+ var currentValue = property.floatValue;
+
+ var rect = EditorGUILayout.GetControlRect();
+
+ EditorGUI.BeginProperty(rect, label, property);
+
+ rect = EditorGUI.PrefixLabel(rect, label);
+
+ // slider
+ {
+ EditorGUI.BeginChangeCheck();
+
+ var sliderRect = rect;
+ sliderRect.width -= 55.0f;
+ rect.xMin += rect.width - 50.0f;
+
+ var clampedvalue = Mathf.Clamp(currentValue, sliderLeft, sliderRight);
+ var sliderValue = GUI.HorizontalSlider(sliderRect, clampedvalue, sliderLeft, sliderRight);
+
+ if (EditorGUI.EndChangeCheck())
+ {
+ property.floatValue = sliderValue;
+ }
+ }
+
+ // number
+ {
+ EditorGUI.BeginChangeCheck();
+
+ var numberValue = Mathf.Clamp(EditorGUI.FloatField(rect, currentValue), numberLeft, numberRight);
+
+ if (EditorGUI.EndChangeCheck())
+ {
+ property.floatValue = numberValue;
+ }
+ }
+
+ EditorGUI.EndProperty();
+ }
+ }
+}
diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs.meta b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs.meta
new file mode 100644
index 000000000..64402c885
--- /dev/null
+++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bcc37b2e1c446d4448718e89fcba946b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs
index 06e5ad58f..5e9d8c7d0 100644
--- a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs
+++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs
@@ -19,11 +19,9 @@ namespace VRM
[SerializeField] private Color m_gizmoColor = Color.yellow;
[SerializeField]
- [Range(0, 4)]
- [Header("Settings")]
public float m_stiffnessForce = 1.0f;
- [SerializeField][Range(0, 2)] public float m_gravityPower;
+ [SerializeField] public float m_gravityPower;
[SerializeField] public Vector3 m_gravityDir = new Vector3(0, -1.0f, 0);
@@ -35,8 +33,6 @@ namespace VRM
Dictionary m_initialLocalRotationMap;
[SerializeField]
- [Range(0, 0.5f)]
- [Header("Collider")]
public float m_hitRadius = 0.02f;
[SerializeField]
From 907f8ec33faf548d5e1b1e68d2628d0ac841caeb Mon Sep 17 00:00:00 2001
From: 0b5vr <0b5vr@0b5vr.com>
Date: Fri, 9 Dec 2022 15:59:17 +0900
Subject: [PATCH 3/6] fix: rename `VRM10SpringBoneJointEditor` ->
`VRMSpringBoneEditor`
Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044132637
---
Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
index 70f1c66ab..feae81158 100644
--- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
+++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
@@ -4,7 +4,7 @@ using UnityEngine;
namespace VRM
{
[CustomEditor(typeof(VRMSpringBone))]
- class VRM10SpringBoneJointEditor : Editor
+ class VRMSpringBoneEditor : Editor
{
private VRMSpringBone m_target;
From a56bdbb3fe314d3da172237407d10ce817207de4 Mon Sep 17 00:00:00 2001
From: 0b5vr <0b5vr@0b5vr.com>
Date: Fri, 9 Dec 2022 15:59:56 +0900
Subject: [PATCH 4/6] fix: Add [CanEditMultipleObjects] to VRMSpringBoneEditor
Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044140283
---
Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
index feae81158..0eaa35e8f 100644
--- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
+++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
@@ -4,6 +4,7 @@ using UnityEngine;
namespace VRM
{
[CustomEditor(typeof(VRMSpringBone))]
+ [CanEditMultipleObjects]
class VRMSpringBoneEditor : Editor
{
private VRMSpringBone m_target;
From 9c194d55e72a3a71a4fedb4cbb6a9c91130a259d Mon Sep 17 00:00:00 2001
From: 0b5vr <0b5vr@0b5vr.com>
Date: Fri, 9 Dec 2022 16:03:45 +0900
Subject: [PATCH 5/6] refactor: SpringBoneEditor, change FindProperty specifier
from string literal to nameof
Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044133280
Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044133784
---
.../Editor/SpringBone/VRMSpringBoneEditor.cs | 20 +++++++++----------
.../SpringBone/VRM10SpringBoneJointEditor.cs | 10 +++++-----
2 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
index 0eaa35e8f..68e2027fc 100644
--- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
+++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneEditor.cs
@@ -29,17 +29,17 @@ namespace VRM
}
m_target = (VRMSpringBone)target;
- m_commentProp = serializedObject.FindProperty("m_comment");
+ m_commentProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_comment));
m_gizmoColorProp = serializedObject.FindProperty("m_gizmoColor");
- m_stiffnessForceProp = serializedObject.FindProperty("m_stiffnessForce");
- m_gravityPowerProp = serializedObject.FindProperty("m_gravityPower");
- m_gravityDirProp = serializedObject.FindProperty("m_gravityDir");
- m_dragForceProp = serializedObject.FindProperty("m_dragForce");
- m_centerProp = serializedObject.FindProperty("m_center");
- m_rootBonesProp = serializedObject.FindProperty("RootBones");
- m_hitRadiusProp = serializedObject.FindProperty("m_hitRadius");
- m_colliderGroupsProp = serializedObject.FindProperty("ColliderGroups");
- m_updateTypeProp = serializedObject.FindProperty("m_updateType");
+ m_stiffnessForceProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_stiffnessForce));
+ m_gravityPowerProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gravityPower));
+ m_gravityDirProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_gravityDir));
+ m_dragForceProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_dragForce));
+ m_centerProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_center));
+ m_rootBonesProp = serializedObject.FindProperty(nameof(VRMSpringBone.RootBones));
+ m_hitRadiusProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_hitRadius));
+ m_colliderGroupsProp = serializedObject.FindProperty(nameof(VRMSpringBone.ColliderGroups));
+ m_updateTypeProp = serializedObject.FindProperty(nameof(VRMSpringBone.m_updateType));
}
public override void OnInspectorGUI()
diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
index d43d38d16..f28dd88e7 100644
--- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
+++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
@@ -21,11 +21,11 @@ namespace UniVRM10
}
m_target = (VRM10SpringBoneJoint)target;
- m_stiffnessForceProp = serializedObject.FindProperty("m_stiffnessForce");
- m_gravityPowerProp = serializedObject.FindProperty("m_gravityPower");
- m_gravityDirProp = serializedObject.FindProperty("m_gravityDir");
- m_dragForceProp = serializedObject.FindProperty("m_dragForce");
- m_jointRadiusProp = serializedObject.FindProperty("m_jointRadius");
+ m_stiffnessForceProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_stiffnessForce));
+ m_gravityPowerProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_gravityPower));
+ m_gravityDirProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_gravityDir));
+ m_dragForceProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_dragForce));
+ m_jointRadiusProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_jointRadius));
}
public override void OnInspectorGUI()
From e8942a4f42fb86e39029006a87aa217e5728d543 Mon Sep 17 00:00:00 2001
From: 0b5vr <0b5vr@0b5vr.com>
Date: Fri, 9 Dec 2022 16:05:39 +0900
Subject: [PATCH 6/6] fix: Add [CanEditMultipleObjects] to
VRM10SpringBoneJointEditor
Addressing https://github.com/vrm-c/UniVRM/pull/1952#discussion_r1044140952
---
.../Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
index f28dd88e7..5f2e5329e 100644
--- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
+++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs
@@ -4,6 +4,7 @@ using UnityEngine;
namespace UniVRM10
{
[CustomEditor(typeof(VRM10SpringBoneJoint))]
+ [CanEditMultipleObjects]
class VRM10SpringBoneJointEditor : Editor
{
private VRM10SpringBoneJoint m_target;