119 lines
4.2 KiB
C#
119 lines
4.2 KiB
C#
|
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
|
||
|
}
|
||
|
}
|