holopy3/Assets/Plugins/RootMotion/Editor/FinalIK/RotationLimitAngleInspector.cs
2020-12-10 15:25:12 +01:00

93 lines
2.8 KiB
C#

using UnityEditor;
using UnityEngine;
using System.Collections;
namespace RootMotion.FinalIK
{
/*
* Custom inspector for RotationLimitAngle.
* */
[CustomEditor(typeof(RotationLimitAngle))]
[CanEditMultipleObjects]
public class RotationLimitAngleInspector : RotationLimitInspector
{
private RotationLimitAngle script { get { return target as RotationLimitAngle; } }
#region Inspector
public override void OnInspectorGUI()
{
GUI.changed = false;
// Draw the default inspector
DrawDefaultInspector();
script.limit = Mathf.Clamp(script.limit, 0, 180);
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;
DrawRotationSphere(script.transform.position);
// Display the main axis
DrawArrow(script.transform.position, Direction(script.axis), colorDefault, "Axis", 0.02f);
Vector3 swing = script.axis.normalized;
// Display limits
lastPoint = script.transform.position;
for (int i = 0; i < 360; i += 2)
{
Quaternion offset = Quaternion.AngleAxis(i, swing);
Quaternion limitedRotation = Quaternion.AngleAxis(script.limit, offset * script.crossAxis);
Vector3 limitedDirection = Direction(limitedRotation * swing);
Handles.color = colorDefaultTransparent;
Vector3 limitPoint = script.transform.position + limitedDirection;
if (i == 0) zeroPoint = limitPoint;
Handles.DrawLine(script.transform.position, limitPoint);
if (i > 0)
{
Handles.color = colorDefault;
Handles.DrawLine(limitPoint, lastPoint);
if (i == 358) Handles.DrawLine(limitPoint, zeroPoint);
}
lastPoint = limitPoint;
}
Handles.color = Color.white;
}
private Vector3 lastPoint, zeroPoint;
/*
* 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
}
}