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