diff options
Diffstat (limited to 'Assets/ThirdParty/VRM/MeshUtility/Editor/HumanoidEditor.cs')
-rw-r--r-- | Assets/ThirdParty/VRM/MeshUtility/Editor/HumanoidEditor.cs | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/Assets/ThirdParty/VRM/MeshUtility/Editor/HumanoidEditor.cs b/Assets/ThirdParty/VRM/MeshUtility/Editor/HumanoidEditor.cs new file mode 100644 index 00000000..f9a99cfc --- /dev/null +++ b/Assets/ThirdParty/VRM/MeshUtility/Editor/HumanoidEditor.cs @@ -0,0 +1,324 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using UnityEditor; +using UnityEngine; +using System; + +namespace MeshUtility +{ + [CustomEditor(typeof(Humanoid))] + public class HumanoidEditor : Editor + { + const int LABEL_WIDTH = 100; + + Humanoid m_target; + + SerializedProperty m_Hips; + #region leg + SerializedProperty m_LeftUpperLeg; + SerializedProperty m_RightUpperLeg; + SerializedProperty m_LeftLowerLeg; + SerializedProperty m_RightLowerLeg; + SerializedProperty m_LeftFoot; + SerializedProperty m_RightFoot; + SerializedProperty m_LeftToes; + SerializedProperty m_RightToes; + + #endregion + + #region spine + SerializedProperty m_Spine; + SerializedProperty m_Chest; + SerializedProperty m_UpperChest; + SerializedProperty m_Neck; + SerializedProperty m_Head; + SerializedProperty m_LeftEye; + SerializedProperty m_RightEye; + SerializedProperty m_Jaw; + + #endregion + + #region arm + SerializedProperty m_LeftShoulder; + SerializedProperty m_RightShoulder; + SerializedProperty m_LeftUpperArm; + SerializedProperty m_RightUpperArm; + SerializedProperty m_LeftLowerArm; + SerializedProperty m_RightLowerArm; + SerializedProperty m_LeftHand; + SerializedProperty m_RightHand; + + #endregion + + #region fingers + SerializedProperty m_LeftThumbProximal; + SerializedProperty m_LeftThumbIntermediate; + SerializedProperty m_LeftThumbDistal; + SerializedProperty m_LeftIndexProximal; + SerializedProperty m_LeftIndexIntermediate; + SerializedProperty m_LeftIndexDistal; + SerializedProperty m_LeftMiddleProximal; + SerializedProperty m_LeftMiddleIntermediate; + SerializedProperty m_LeftMiddleDistal; + SerializedProperty m_LeftRingProximal; + SerializedProperty m_LeftRingIntermediate; + SerializedProperty m_LeftRingDistal; + SerializedProperty m_LeftLittleProximal; + SerializedProperty m_LeftLittleIntermediate; + SerializedProperty m_LeftLittleDistal; + SerializedProperty m_RightThumbProximal; + SerializedProperty m_RightThumbIntermediate; + SerializedProperty m_RightThumbDistal; + SerializedProperty m_RightIndexProximal; + SerializedProperty m_RightIndexIntermediate; + SerializedProperty m_RightIndexDistal; + SerializedProperty m_RightMiddleProximal; + SerializedProperty m_RightMiddleIntermediate; + SerializedProperty m_RightMiddleDistal; + SerializedProperty m_RightRingProximal; + SerializedProperty m_RightRingIntermediate; + SerializedProperty m_RightRingDistal; + SerializedProperty m_RightLittleProximal; + SerializedProperty m_RightLittleIntermediate; + SerializedProperty m_RightLittleDistal; + + #endregion + + void OnEnable() + { + m_target = target as Humanoid; + m_Hips = serializedObject.FindProperty($"m_{nameof(Humanoid.Hips)}"); + + #region legs + m_LeftUpperLeg = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftUpperLeg)}"); + m_RightUpperLeg = serializedObject.FindProperty($"m_{nameof(Humanoid.RightUpperLeg)}"); + m_LeftLowerLeg = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLowerLeg)}"); + m_RightLowerLeg = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLowerLeg)}"); + m_LeftFoot = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftFoot)}"); + m_RightFoot = serializedObject.FindProperty($"m_{nameof(Humanoid.RightFoot)}"); + m_LeftToes = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftToes)}"); + m_RightToes = serializedObject.FindProperty($"m_{nameof(Humanoid.RightToes)}"); + #endregion + + #region spine + m_Spine = serializedObject.FindProperty($"m_{nameof(Humanoid.Spine)}"); + m_Chest = serializedObject.FindProperty($"m_{nameof(Humanoid.Chest)}"); + m_UpperChest = serializedObject.FindProperty($"m_{nameof(Humanoid.UpperChest)}"); + m_Neck = serializedObject.FindProperty($"m_{nameof(Humanoid.Neck)}"); + m_Head = serializedObject.FindProperty($"m_{nameof(Humanoid.Head)}"); + m_LeftEye = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftEye)}"); + m_RightEye = serializedObject.FindProperty($"m_{nameof(Humanoid.RightEye)}"); + m_Jaw = serializedObject.FindProperty($"m_{nameof(Humanoid.Jaw)}"); + + #endregion + + #region arm + m_LeftShoulder = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftShoulder)}"); + m_RightShoulder = serializedObject.FindProperty($"m_{nameof(Humanoid.RightShoulder)}"); + m_LeftUpperArm = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftUpperArm)}"); + m_RightUpperArm = serializedObject.FindProperty($"m_{nameof(Humanoid.RightUpperArm)}"); + m_LeftLowerArm = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLowerArm)}"); + m_RightLowerArm = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLowerArm)}"); + m_LeftHand = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftHand)}"); + m_RightHand = serializedObject.FindProperty($"m_{nameof(Humanoid.RightHand)}"); + + #endregion + + #region fingers + m_LeftThumbProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftThumbProximal)}"); + m_LeftThumbIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftThumbIntermediate)}"); + m_LeftThumbDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftThumbDistal)}"); + m_LeftIndexProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftIndexProximal)}"); + m_LeftIndexIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftIndexIntermediate)}"); + m_LeftIndexDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftIndexDistal)}"); + m_LeftMiddleProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftMiddleProximal)}"); + m_LeftMiddleIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftMiddleIntermediate)}"); + m_LeftMiddleDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftMiddleDistal)}"); + m_LeftRingProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftRingProximal)}"); + m_LeftRingIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftRingIntermediate)}"); + m_LeftRingDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftRingDistal)}"); + m_LeftLittleProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLittleProximal)}"); + m_LeftLittleIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLittleIntermediate)}"); + m_LeftLittleDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.LeftLittleDistal)}"); + m_RightThumbProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightThumbProximal)}"); + m_RightThumbIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightThumbIntermediate)}"); + m_RightThumbDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightThumbDistal)}"); + m_RightIndexProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightIndexProximal)}"); + m_RightIndexIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightIndexIntermediate)}"); + m_RightIndexDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightIndexDistal)}"); + m_RightMiddleProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightMiddleProximal)}"); + m_RightMiddleIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightMiddleIntermediate)}"); + m_RightMiddleDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightMiddleDistal)}"); + m_RightRingProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightRingProximal)}"); + m_RightRingIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightRingIntermediate)}"); + m_RightRingDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightRingDistal)}"); + m_RightLittleProximal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLittleProximal)}"); + m_RightLittleIntermediate = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLittleIntermediate)}"); + m_RightLittleDistal = serializedObject.FindProperty($"m_{nameof(Humanoid.RightLittleDistal)}"); + #endregion + } + + struct Horizontal : IDisposable + { + public static Horizontal Using() + { + EditorGUILayout.BeginHorizontal(); + return default; + } + public void Dispose() + { + EditorGUILayout.EndHorizontal(); + } + } + + static void HorizontalFields(string label, params SerializedProperty[] props) + { + try + { + EditorGUILayout.BeginHorizontal(); + + GUILayout.Label(label, GUILayout.Width(LABEL_WIDTH)); + GUILayout.FlexibleSpace(); + + foreach (var prop in props) + { + EditorGUILayout.PropertyField(prop, GUIContent.none, true, GUILayout.MinWidth(100)); + } + } + finally + { + EditorGUILayout.EndHorizontal(); + } + } + + static bool s_spineFold; + static bool s_legFold; + static bool s_armFold; + static bool s_fingerFold; + static string GetDialogDir(UnityEngine.Object obj) + { + var prefab = PrefabUtility.GetCorrespondingObjectFromSource(obj); + if (prefab == null) + { + return null; + } + return UnityPath.FromAsset(prefab).FullPath; + } + + public override void OnInspectorGUI() + { + foreach (var validation in m_target.Validate()) + { + EditorGUILayout.HelpBox(validation.Message, validation.IsError ? MessageType.Error : MessageType.Warning); + } + + // prefer + serializedObject.Update(); + + EditorGUILayout.PropertyField(m_Hips); + + s_spineFold = EditorGUILayout.Foldout(s_spineFold, "Body"); + if (s_spineFold) + { + EditorGUILayout.PropertyField(m_Spine); + EditorGUILayout.PropertyField(m_Chest); + EditorGUILayout.PropertyField(m_UpperChest); + EditorGUILayout.PropertyField(m_Neck); + EditorGUILayout.PropertyField(m_Head); + EditorGUILayout.PropertyField(m_Jaw); + HorizontalFields("Eye", m_LeftEye, m_RightEye); + } + + s_legFold = EditorGUILayout.Foldout(s_legFold, "Leg"); + if (s_legFold) + { + HorizontalFields("UpperLeg", m_LeftUpperLeg, m_RightUpperLeg); + HorizontalFields("LowerLeg", m_LeftLowerLeg, m_RightLowerLeg); + HorizontalFields("Foot", m_LeftFoot, m_RightFoot); + HorizontalFields("Toes", m_LeftToes, m_RightToes); + } + + s_armFold = EditorGUILayout.Foldout(s_armFold, "Arm"); + if (s_armFold) + { + HorizontalFields("Shoulder", m_LeftShoulder, m_RightShoulder); + HorizontalFields("UpperArm", m_LeftUpperArm, m_RightUpperArm); + HorizontalFields("LowerArm", m_LeftLowerArm, m_RightLowerArm); + HorizontalFields("Hand", m_LeftHand, m_RightHand); + } + + s_fingerFold = EditorGUILayout.Foldout(s_fingerFold, "Finger"); + if (s_fingerFold) + { + HorizontalFields("LeftThumb", m_LeftThumbProximal, m_LeftThumbIntermediate, m_LeftThumbDistal); + HorizontalFields("LeftIndex", m_LeftIndexProximal, m_LeftIndexIntermediate, m_LeftIndexDistal); + HorizontalFields("LeftMiddle", m_LeftMiddleProximal, m_LeftMiddleIntermediate, m_LeftMiddleDistal); + HorizontalFields("LeftRing", m_LeftRingProximal, m_LeftRingIntermediate, m_LeftRingDistal); + HorizontalFields("LeftLittle", m_LeftLittleProximal, m_LeftLittleIntermediate, m_LeftLittleDistal); + HorizontalFields("RightThumb", m_RightThumbProximal, m_RightThumbIntermediate, m_RightThumbDistal); + HorizontalFields("RightIndex", m_RightIndexProximal, m_RightIndexIntermediate, m_RightIndexDistal); + HorizontalFields("RightMiddle", m_RightMiddleProximal, m_RightMiddleIntermediate, m_RightMiddleDistal); + HorizontalFields("RightRing", m_RightRingProximal, m_RightRingIntermediate, m_RightRingDistal); + HorizontalFields("RightLittle", m_RightLittleProximal, m_RightLittleIntermediate, m_RightLittleDistal); + } + + serializedObject.ApplyModifiedProperties(); + + // create avatar + if (GUILayout.Button("Create UnityEngine.Avatar")) + { + var path = EditorUtility.SaveFilePanel( + "Save avatar", + GetDialogDir(m_target), + string.Format("{0}.avatar.asset", serializedObject.targetObject.name), + "asset"); + if (!string.IsNullOrEmpty(path)) + { + var avatar = m_target.CreateAvatar(); + if (avatar != null) + { + var unityPath = UnityPath.FromFullpath(path); + avatar.name = "avatar"; + Debug.LogFormat("Create avatar {0}", unityPath); + AssetDatabase.CreateAsset(avatar, unityPath.Value); + AssetDatabase.ImportAsset(unityPath.Value); + + // replace + var animator = m_target.GetComponent<Animator>(); + if (animator == null) + { + animator = m_target.gameObject.AddComponent<Animator>(); + } + animator.avatar = avatar; + + Selection.activeObject = avatar; + } + } + } + } + + void OnSceneGUI() + { + // var bones = m_target.Bones; + // if (bones != null) + // { + // for (int i = 0; i < bones.Length; ++i) + // { + // DrawBone((HumanBodyBones)i, bones[i]); + // } + // foreach (var x in m_bones) + // { + // x.Draw(); + // } + // } + + var forward = m_target.GetForward(); + + var begin = m_target.transform.position; + var end = begin + forward; + Handles.DrawLine(begin, end); + } + } +} |