holopy3/Assets/UniGLTF/UniHumanoid/Scripts/Editor/HumanPoseTransferEditor.cs
Lena Biresch 490ef558ef CleanUp
2021-01-28 13:07:52 +01:00

151 lines
5.2 KiB
C#

using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace UniHumanoid
{
[CustomEditor(typeof(HumanPoseTransfer))]
public class HumanPoseTransferEditor : Editor
{
//HumanPoseTransfer m_target;
SerializedProperty m_avatarProp;
SerializedProperty m_typeProp;
SerializedProperty m_clipProp;
SerializedProperty m_transferProp;
static string[] SOURCE_TYPES = ((HumanPoseTransfer.HumanPoseTransferSourceType[])
Enum.GetValues(typeof(HumanPoseTransfer.HumanPoseTransferSourceType)))
.Select(x => x.ToString())
.ToArray();
private void OnEnable()
{
//m_target = (HumanPoseTransfer)target;
m_typeProp = serializedObject.FindProperty("SourceType");
m_clipProp = serializedObject.FindProperty("PoseClip");
m_avatarProp = serializedObject.FindProperty("Avatar");
m_transferProp = serializedObject.FindProperty("Source");
}
public override void OnInspectorGUI()
{
//base.OnInspectorGUI();
serializedObject.Update();
EditorGUILayout.PropertyField(m_avatarProp);
/*
m_typeProp.intValue =
GUILayout.Toolbar(m_typeProp.intValue, SOURCE_TYPES);
*/
m_typeProp.intValue =
EditorGUILayout.Popup("SourceType", m_typeProp.intValue, SOURCE_TYPES);
switch ((HumanPoseTransfer.HumanPoseTransferSourceType)m_typeProp.intValue)
{
case HumanPoseTransfer.HumanPoseTransferSourceType.None:
serializedObject.ApplyModifiedProperties();
break;
case HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseClip:
PoseClipInspector();
break;
case HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer:
PoseHandler();
break;
}
GUILayout.Space(20);
// CreatePose
if (GUILayout.Button("Pose to HumanPoseClip"))
{
var path = EditorUtility.SaveFilePanel(
"Save humanpose",
Application.dataPath,
string.Format("{0}.pose.asset", serializedObject.targetObject.name),
"asset");
var assetPath = ToAssetPath(path);
if (!string.IsNullOrEmpty(path))
{
var pose = ((HumanPoseTransfer)serializedObject.targetObject).CreatePose();
var clip = ScriptableObject.CreateInstance<HumanPoseClip>();
clip.ApplyPose(ref pose);
AssetDatabase.CreateAsset(clip, assetPath);
Selection.activeObject = clip;
}
}
// CreatePose
if (GUILayout.Button("Pose to AnimationClip"))
{
var path = EditorUtility.SaveFilePanel(
"Save animnationClip",
Application.dataPath,
string.Format("{0}.pose.anim", serializedObject.targetObject.name),
"anim");
var assetPath = ToAssetPath(path);
if (!string.IsNullOrEmpty(path))
{
var pose = ((HumanPoseTransfer)serializedObject.targetObject).CreatePose();
var clip = AnimationClipUtility.CreateAnimationClipFromHumanPose(pose);
AssetDatabase.CreateAsset(clip, assetPath);
Selection.activeObject = clip;
}
}
}
public static string ToAssetPath(string src)
{
src = src.Replace("\\", "/");
var basePath = Path.GetFullPath(Application.dataPath + "/..").Replace("\\", "/");
if (!src.StartsWith(basePath))
{
return null;
}
return src.Substring(basePath.Length + 1);
}
void PoseClipInspector()
{
var old = (HumanPoseClip)m_clipProp.objectReferenceValue;
EditorGUILayout.PropertyField(m_clipProp);
serializedObject.ApplyModifiedProperties();
var _target = (HumanPoseTransfer)target;
if (_target.PoseClip != old)
{
//Debug.Log("clip != old");
if (_target.PoseClip != null)
{
var pose = _target.PoseClip.GetPose();
_target.SetPose(pose);
}
}
#if false
if (_target.PoseClip != null)
{
if (GUILayout.Button("Apply PoseClip"))
{
Debug.Log("apply");
var pose = default(HumanPose);
_target.PoseClip.GetPose(out pose);
_target.SetPose(pose);
}
}
#endif
}
void PoseHandler()
{
EditorGUILayout.PropertyField(m_transferProp);
serializedObject.ApplyModifiedProperties();
}
}
}