using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
[CustomEditor(typeof(BezierCurve))]
|
|
public class BezierCurveInspector : Editor {
|
|
|
|
private const int lineSteps = 10;
|
|
private const float directionScale = 0.5f;
|
|
|
|
private BezierCurve curve;
|
|
private Transform handleTransform;
|
|
private Quaternion handleRotation;
|
|
|
|
private void OnSceneGUI () {
|
|
curve = target as BezierCurve;
|
|
handleTransform = curve.transform;
|
|
handleRotation = Tools.pivotRotation == PivotRotation.Local ?
|
|
handleTransform.rotation : Quaternion.identity;
|
|
|
|
Vector3 p0 = ShowPoint(0);
|
|
Vector3 p1 = ShowPoint(1);
|
|
Vector3 p2 = ShowPoint(2);
|
|
Vector3 p3 = ShowPoint(3);
|
|
|
|
Handles.color = Color.gray;
|
|
Handles.DrawLine(p0, p1);
|
|
Handles.DrawLine(p2, p3);
|
|
|
|
ShowDirections();
|
|
Handles.DrawBezier(p0, p3, p1, p2, Color.white, null, 2f);
|
|
}
|
|
|
|
private void ShowDirections () {
|
|
Handles.color = Color.green;
|
|
Vector3 point = curve.GetPoint(0f);
|
|
Handles.DrawLine(point, point + curve.GetDirection(0f) * directionScale);
|
|
for (int i = 1; i <= lineSteps; i++) {
|
|
point = curve.GetPoint(i / (float)lineSteps);
|
|
Handles.DrawLine(point, point + curve.GetDirection(i / (float)lineSteps) * directionScale);
|
|
}
|
|
}
|
|
|
|
private Vector3 ShowPoint (int index) {
|
|
Vector3 point = handleTransform.TransformPoint(curve.points[index]);
|
|
EditorGUI.BeginChangeCheck();
|
|
point = Handles.DoPositionHandle(point, handleRotation);
|
|
if (EditorGUI.EndChangeCheck()) {
|
|
Undo.RecordObject(curve, "Move Point");
|
|
EditorUtility.SetDirty(curve);
|
|
curve.points[index] = handleTransform.InverseTransformPoint(point);
|
|
}
|
|
return point;
|
|
}
|
|
}
|