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.
235 lines
8.0 KiB
C#
235 lines
8.0 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace Autohand {
|
|
[CustomEditor(typeof(EditorHand))]
|
|
public class EditorHandEditor : Editor {
|
|
|
|
float bendFingers = 0;
|
|
bool[] fingerStates = new bool[] { };
|
|
|
|
private void OnEnable() {
|
|
var hand = (target as EditorHand).hand;
|
|
|
|
if(fingerStates.Length == 0)
|
|
fingerStates = new bool[hand.fingers.Length];
|
|
for(int i = 0; i < fingerStates.Length; i++) {
|
|
fingerStates[i] = true;
|
|
}
|
|
|
|
hand.SetLayerRecursive(hand.transform, LayerMask.NameToLayer(hand.left ? Hand.leftHandLayerName : Hand.rightHandLayerName));
|
|
}
|
|
|
|
void OnSceneGUI() {
|
|
var hand = (target as EditorHand).hand;
|
|
|
|
Handles.BeginGUI();
|
|
GUILayout.BeginArea(new Rect(30, 30, 150, 300));
|
|
|
|
var rect1 = EditorGUILayout.BeginVertical();
|
|
GUI.color = Color.grey;
|
|
GUI.Box(rect1, GUIContent.none);
|
|
EditorGUILayout.EndVertical();
|
|
|
|
GUILayout.EndArea();
|
|
Handles.EndGUI();
|
|
|
|
|
|
Handles.BeginGUI();
|
|
|
|
GUILayout.BeginArea(new Rect(60, 30, 150, 300));
|
|
|
|
var rect = EditorGUILayout.BeginVertical();
|
|
GUI.color = Color.grey;
|
|
GUI.Box(rect, GUIContent.none);
|
|
GUI.Box(rect, GUIContent.none);
|
|
GUI.Box(rect, GUIContent.none);
|
|
|
|
GUI.color = Color.white;
|
|
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.Label("Hand Pose Tool", AutoHandExtensions.LabelStyle(TextAnchor.MiddleCenter, FontStyle.Bold, 16));
|
|
GUILayout.EndHorizontal();
|
|
|
|
for(int i = 0; i < fingerStates.Length; i++) {
|
|
GUILayout.BeginHorizontal();
|
|
|
|
|
|
fingerStates[i] = GUILayout.Toggle(fingerStates[i], hand.fingers[i].name);
|
|
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
|
|
|
|
GUILayout.Space(5f);
|
|
GUILayout.BeginHorizontal();
|
|
GUI.backgroundColor = new Color(0.9f, 0.3f, 0.3f, 1f);
|
|
|
|
if(GUILayout.Button("Grab")) {
|
|
for(int i = 0; i < hand.fingers.Length; i++) {
|
|
if(fingerStates[i])
|
|
hand.fingers[i].BendFingerUntilHit(100, ~LayerMask.GetMask(Hand.rightHandLayerName, Hand.leftHandLayerName));
|
|
}
|
|
}
|
|
GUILayout.EndHorizontal();
|
|
|
|
GUI.backgroundColor = new Color(0.9f, 0.3f, 0.3f, 1f);
|
|
|
|
if(GUILayout.Button("Invert Hand - X")) {
|
|
var scale = hand.transform.parent.localScale;
|
|
scale.x = -scale.x;
|
|
hand.transform.parent.localScale = scale;
|
|
hand.left = !hand.left;
|
|
}
|
|
if(GUILayout.Button("Invert Hand - Y")) {
|
|
var scale = hand.transform.parent.localScale;
|
|
scale.x = -scale.x;
|
|
hand.transform.parent.Rotate(new Vector3(0, 0, 180));
|
|
hand.transform.parent.localScale = scale;
|
|
hand.left = !hand.left;
|
|
}
|
|
if(GUILayout.Button("Invert Hand - Z")) {
|
|
var scale = hand.transform.parent.localScale;
|
|
hand.transform.parent.Rotate(new Vector3(0, 180, 0));
|
|
scale.x = -scale.x;
|
|
hand.transform.parent.localScale = scale;
|
|
hand.left = !hand.left;
|
|
}
|
|
|
|
GUILayout.BeginHorizontal();
|
|
|
|
GUI.backgroundColor = Color.white;
|
|
|
|
bendFingers = GUILayout.HorizontalSlider(bendFingers, 0, 1);
|
|
|
|
GUI.backgroundColor = new Color(0.9f, 0.3f, 0.3f, 1f);
|
|
if(GUILayout.Button("Set Bend")) {
|
|
for(int i = 0; i < hand.fingers.Length; i++) {
|
|
if(fingerStates[i])
|
|
hand.fingers[i].SetFingerBend(bendFingers);
|
|
}
|
|
}
|
|
|
|
GUILayout.EndHorizontal();
|
|
|
|
ShowSaveButtons();
|
|
|
|
GUI.backgroundColor = new Color(0.8f, 0.8f, 0.8f, 1f);
|
|
|
|
GUILayout.Space(6f);
|
|
if(GUILayout.Button("Select Grabbable")) {
|
|
if((target as EditorHand).grabbablePose != null)
|
|
Selection.activeGameObject = (target as EditorHand).grabbablePose.gameObject;
|
|
else
|
|
Selection.activeGameObject = (target as EditorHand).grabbablePoseArea.gameObject;
|
|
}
|
|
|
|
|
|
GUI.backgroundColor = new Color(1f, 0f, 0f, 1f);
|
|
|
|
if(GUILayout.Button("Delete Hand Copy")) {
|
|
if((target as EditorHand).grabbablePose != null)
|
|
Selection.activeGameObject = (target as EditorHand).grabbablePose.gameObject;
|
|
else
|
|
Selection.activeGameObject = (target as EditorHand).grabbablePoseArea.gameObject;
|
|
DestroyImmediate((target as EditorHand).hand.transform.parent.gameObject);
|
|
}
|
|
|
|
|
|
GUILayout.Space(3f);
|
|
EditorGUILayout.EndVertical();
|
|
|
|
|
|
GUILayout.EndArea();
|
|
|
|
Handles.EndGUI();
|
|
}
|
|
|
|
|
|
public void ShowSaveButtons() {
|
|
if((target as EditorHand).grabbablePose != null) {
|
|
var pose = (target as EditorHand).grabbablePose;
|
|
EditorGUILayout.Space();
|
|
EditorGUILayout.Space();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
if(pose.leftPoseSet)
|
|
GUI.backgroundColor = Color.green;
|
|
else
|
|
GUI.backgroundColor = Color.red;
|
|
|
|
|
|
if(GUILayout.Button("Save Left"))
|
|
{
|
|
if (pose.poseIndex != pose.editorHand.poseIndex)
|
|
{
|
|
Debug.Log("Automatically overriding local Pose Index to match hand Pose Index");
|
|
pose.poseIndex = pose.editorHand.poseIndex;
|
|
}
|
|
else
|
|
pose.EditorSaveGrabPose(pose.editorHand, true);
|
|
}
|
|
|
|
|
|
if(pose.rightPoseSet)
|
|
GUI.backgroundColor = Color.green;
|
|
else
|
|
GUI.backgroundColor = Color.red;
|
|
|
|
|
|
if(GUILayout.Button("Save Right")) {
|
|
if (pose.poseIndex != pose.editorHand.poseIndex)
|
|
{
|
|
Debug.Log("Automatically overriding local Pose Index to match hand Pose Index");
|
|
pose.poseIndex = pose.editorHand.poseIndex;
|
|
}
|
|
else
|
|
pose.EditorSaveGrabPose(pose.editorHand, false);
|
|
}
|
|
|
|
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
else {
|
|
var pose = (target as EditorHand).grabbablePoseArea;
|
|
EditorGUILayout.Space();
|
|
EditorGUILayout.Space();
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
if(pose.leftPoseSet)
|
|
GUI.backgroundColor = Color.green;
|
|
else
|
|
GUI.backgroundColor = Color.red;
|
|
|
|
|
|
if(GUILayout.Button("Save Left")) {
|
|
if(pose.poseIndex != pose.editorHand.poseIndex)
|
|
Debug.LogError("CANNOT SAVE: Your hand's \"Pose Index\" value does not match the local \"Pose Index\" value");
|
|
else
|
|
pose.EditorSaveGrabPose(pose.editorHand, true);
|
|
}
|
|
|
|
|
|
if(pose.rightPoseSet)
|
|
GUI.backgroundColor = Color.green;
|
|
else
|
|
GUI.backgroundColor = Color.red;
|
|
|
|
|
|
if(GUILayout.Button("Save Right")) {
|
|
if(pose.poseIndex != pose.editorHand.poseIndex)
|
|
Debug.LogError("CANNOT SAVE: Your hand's \"Pose Index\" value does not match the local \"Pose Index\" value");
|
|
else
|
|
pose.EditorSaveGrabPose(pose.editorHand, false);
|
|
}
|
|
|
|
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
}
|
|
}
|
|
} |