You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
6.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Experimental.SceneManagement;
using UnityEngine;
using UnityEditor.SceneManagement;
namespace Autohand {
[CustomEditor(typeof(GrabbablePose), true), CanEditMultipleObjects]
public class GrabPoseEditor : Editor{
GrabbablePose grabbablePose;
private void OnEnable() {
grabbablePose = target as GrabbablePose;
}
public override void OnInspectorGUI() {
DrawDefaultInspector();
var startBackground = GUI.backgroundColor;
if(grabbablePose.gameObject.scene.name == null) {
EditorGUILayout.LabelField("This must be saved in the scene");
EditorGUILayout.LabelField("-> then use override to prefab to save");
return;
}
else if(Application.isPlaying) {
EditorGUILayout.LabelField("Cannot edit during runtime");
return;
}
if(grabbablePose.gameObject != null && PrefabStageUtility.GetPrefabStage(grabbablePose.gameObject) == null) {
grabbablePose.showEditorTools = DrawAutoToggleHeader("Show Editor Tools", grabbablePose.showEditorTools);
if(grabbablePose.showEditorTools) {
ShowScriptableSaveButton();
ShowHandEditorHand();
ShowSaveButtons();
DrawHorizontalLine();
ShowDeleteOptions();
}
}
GUI.backgroundColor = startBackground;
}
public void ShowScriptableSaveButton() {
EditorGUILayout.Space();
EditorGUILayout.Space();
grabbablePose.poseScriptable = (HandPoseScriptable)EditorGUILayout.ObjectField(new GUIContent("Pose Scriptable", "Allows you to save the pose to a scriptable pose, create scriptable pose by right clicking in project [Create > Auto hand > Custom Pose]"), grabbablePose.poseScriptable, typeof(HandPoseScriptable), true);
if(grabbablePose.poseScriptable != null) {
var rect = EditorGUILayout.GetControlRect();
if(GUI.Button(rect, "Overwrite Scriptable")) {
EditorUtility.SetDirty(grabbablePose.poseScriptable);
grabbablePose.SaveScriptable();
}
EditorGUILayout.Space();
}
EditorGUILayout.Space();
}
public void ShowDeleteOptions() {
GUI.backgroundColor = Color.red;
if(GUILayout.Button("Delete Hand Copy")) {
if(string.Equals(grabbablePose.editorHand.transform.parent.name, "HAND COPY CONTAINER DELETE"))
DestroyImmediate(grabbablePose.editorHand.transform.parent.gameObject);
else
Debug.LogError("Not a copy - Will not delete");
}
if(GUILayout.Button("Clear Saved Poses")) {
EditorUtility.SetDirty(grabbablePose);
grabbablePose.EditorClearPoses();
}
}
public void ShowHandEditorHand() {
grabbablePose.editorHand = (Hand)EditorGUILayout.ObjectField(new GUIContent("Editor Hand", "This will be used as a reference to create a hand copy that can be used to model your new pose"), grabbablePose.editorHand, typeof(Hand), true);
if(GUILayout.Button("Create Hand Copy")) {
EditorUtility.SetDirty(grabbablePose);
grabbablePose.EditorCreateCopySetPose(grabbablePose.editorHand, grabbablePose.transform);
}
if(GUILayout.Button("Select Hand Copy")) {
EditorUtility.SetDirty(grabbablePose);
Selection.activeGameObject = grabbablePose.editorHand.gameObject;
}
}
public void DrawHorizontalLine() {
var rect = EditorGUILayout.GetControlRect();
rect.y += rect.height / 2f;
rect.height /= 10f;
EditorGUI.DrawRect(rect, Color.grey);
}
public bool DrawAutoToggleHeader(string label, bool value) {
EditorGUILayout.Space();
EditorGUILayout.Space();
// draw header background and label
var headerRect = EditorGUILayout.GetControlRect();
var biggerRect = new Rect(headerRect);
biggerRect.width += biggerRect.x * 2;
biggerRect.x = 0;
biggerRect.y -= 5f;
biggerRect.height += 10f;
EditorGUI.DrawRect(biggerRect, Constants.BackgroundColor);
var labelStyle = Constants.LabelStyle;
var oldColor1 = GUI.color;
if(!value) {
var newColor = new Color(0.65f, 0.65f, 0.65f, 1f);
newColor.a = 1;
GUI.contentColor = newColor;
}
EditorGUI.LabelField(headerRect, new GUIContent(" " + label), labelStyle);
GUI.contentColor = oldColor1;
var oldColor = GUI.color;
GUI.color = value ? new Color(0.7f, 1f, 0.7f) : new Color(1f, 0.7f, 0.7f);
var newRect = new Rect(headerRect);
newRect.position = new Vector2(newRect.x + newRect.width - 18, newRect.y);
value = EditorGUI.Toggle(newRect, value);
GUI.color = oldColor;
return value;
}
public void ShowSaveButtons() {
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
if(grabbablePose.leftPoseSet || (grabbablePose.poseScriptable != null && grabbablePose.poseScriptable.leftSaved))
GUI.backgroundColor = Color.green;
else
GUI.backgroundColor = Color.red;
if(GUILayout.Button("Save Left")) {
EditorUtility.SetDirty(grabbablePose);
if(grabbablePose.poseIndex != grabbablePose.editorHand.poseIndex)
Debug.LogError("CANNOT SAVE: Your hand's \"Pose Index\" value does not match the local \"Pose Index\" value");
else
grabbablePose.EditorSaveGrabPose(grabbablePose.editorHand, true);
}
if(grabbablePose.rightPoseSet || (grabbablePose.poseScriptable != null && grabbablePose.poseScriptable.rightSaved))
GUI.backgroundColor = Color.green;
else
GUI.backgroundColor = Color.red;
if(GUILayout.Button("Save Right")) {
EditorUtility.SetDirty(grabbablePose);
if(grabbablePose.poseIndex != grabbablePose.editorHand.poseIndex)
Debug.LogError("CANNOT SAVE: Your hand's \"Pose Index\" value does not match the local \"Pose Index\" value");
else
grabbablePose.EditorSaveGrabPose(grabbablePose.editorHand, false);
}
GUILayout.EndHorizontal();
}
}
}