Skip to content

Commit

Permalink
Merge pull request #541 from ousttrue/feature/backport_humanoid
Browse files Browse the repository at this point in the history
1.0 からバックポート。こっちで管理する。
  • Loading branch information
ousttrue authored Sep 2, 2020
2 parents 0386f6b + 8015a67 commit b0305b3
Show file tree
Hide file tree
Showing 9 changed files with 1,307 additions and 3 deletions.
324 changes: 324 additions & 0 deletions Assets/MeshUtility/Editor/HumanoidEditor.cs
Original file line number Diff line number Diff line change
@@ -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 is 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);
}
}
}
11 changes: 11 additions & 0 deletions Assets/MeshUtility/Editor/HumanoidEditor.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit b0305b3

Please sign in to comment.