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#
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();
|
|
}
|
|
|
|
}
|
|
}
|