123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- using UnityEditor;
- using UnityEngine;
- using System.Collections;
- namespace RootMotion.FinalIK
- {
- /*
- * Custom inspector for RotationLimitHinge
- * */
- [CustomEditor(typeof(RotationLimitHinge))]
- [CanEditMultipleObjects]
- public class RotationLimitHingeInspector : RotationLimitInspector
- {
- private RotationLimitHinge script { get { return target as RotationLimitHinge; } }
- #region Inspector
- public override void OnInspectorGUI()
- {
- GUI.changed = false;
- // Draw the default inspector
- DrawDefaultInspector();
- if (GUI.changed) EditorUtility.SetDirty(script);
- }
- #endregion Inspector
- #region Scene
- void OnSceneGUI()
- {
- // Set defaultLocalRotation so that the initial local rotation will be the zero point for the rotation limit
- if (!Application.isPlaying && !script.defaultLocalRotationOverride) script.defaultLocalRotation = script.transform.localRotation;
- if (script.axis == Vector3.zero) return;
- // Quick Editing Tools
- Handles.BeginGUI();
- GUILayout.BeginArea(new Rect(10, 10, 200, 50), "Rotation Limit Hinge", "Window");
- // Rotating display
- if (GUILayout.Button("Rotate display 90 degrees"))
- {
- if (!Application.isPlaying) Undo.RecordObject(script, "Rotate Display");
- script.zeroAxisDisplayOffset += 90;
- if (script.zeroAxisDisplayOffset >= 360) script.zeroAxisDisplayOffset = 0;
- }
- GUILayout.EndArea();
- Handles.EndGUI();
- // Normalize the main axes
- Vector3 axis = Direction(script.axis.normalized);
- Vector3 cross = Direction(Quaternion.AngleAxis(script.zeroAxisDisplayOffset, script.axis) * script.crossAxis.normalized);
- // Axis vector
- DrawArrow(script.transform.position, axis, colorDefault, "Axis", 0.02f);
- if (script.useLimits)
- {
- // Zero rotation vector
- DrawArrow(script.transform.position, cross * 0.5f, colorDefault, " 0", 0.02f);
- // Arcs for the rotation limit
- Handles.color = colorDefaultTransparent;
- Handles.DrawSolidArc(script.transform.position, axis, cross, script.min, 0.5f);
- Handles.DrawSolidArc(script.transform.position, axis, cross, script.max, 0.5f);
- }
- Handles.color = colorDefault;
- GUI.color = colorDefault;
- Inspector.CircleCap(0, script.transform.position, Quaternion.LookRotation(axis, cross), 0.5f);
- if (!script.useLimits) return;
- // Handles for adjusting rotation limits in the scene
- Quaternion minRotation = Quaternion.AngleAxis(script.min, axis);
- Handles.DrawLine(script.transform.position, script.transform.position + minRotation * cross);
- Quaternion maxRotation = Quaternion.AngleAxis(script.max, axis);
- Handles.DrawLine(script.transform.position, script.transform.position + maxRotation * cross);
- // Undoable scene handles
- float min = script.min;
- min = DrawLimitHandle(min, script.transform.position + minRotation * cross, Quaternion.identity, 0.5f, "Min", -10);
- if (min != script.min)
- {
- if (!Application.isPlaying) Undo.RecordObject(script, "Min Limit");
- script.min = min;
- }
- float max = script.max;
- max = DrawLimitHandle(max, script.transform.position + maxRotation * cross, Quaternion.identity, 0.5f, "Max", 10);
- if (max != script.max)
- {
- if (!Application.isPlaying) Undo.RecordObject(script, "Max Limit");
- script.max = max;
- }
- Handles.color = Color.white;
- GUI.color = Color.white;
- }
- /*
- * Converting directions from local space to world space
- * */
- private Vector3 Direction(Vector3 v)
- {
- if (script.transform.parent == null) return script.defaultLocalRotation * v;
- return script.transform.parent.rotation * (script.defaultLocalRotation * v);
- }
- #endregion Scene
- }
- }
|