summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/BezierCurves/Editor/BezierPointEditor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/BezierCurves/Editor/BezierPointEditor.cs')
-rw-r--r--Assets/ThirdParty/BezierCurves/Editor/BezierPointEditor.cs152
1 files changed, 152 insertions, 0 deletions
diff --git a/Assets/ThirdParty/BezierCurves/Editor/BezierPointEditor.cs b/Assets/ThirdParty/BezierCurves/Editor/BezierPointEditor.cs
new file mode 100644
index 00000000..ce0962a7
--- /dev/null
+++ b/Assets/ThirdParty/BezierCurves/Editor/BezierPointEditor.cs
@@ -0,0 +1,152 @@
+using UnityEngine;
+using UnityEditor;
+using System.Collections;
+
+[CustomEditor(typeof(BezierPoint))]
+[CanEditMultipleObjects]
+public class BezierPointEditor : Editor {
+
+ BezierPoint point;
+
+ SerializedProperty handleTypeProp;
+ SerializedProperty handle1Prop;
+ SerializedProperty handle2Prop;
+
+ private delegate void HandleFunction(BezierPoint p);
+ private HandleFunction[] handlers = new HandleFunction[] { HandleConnected, HandleBroken, HandleAbsent };
+
+ void OnEnable(){
+ point = (BezierPoint)target;
+
+ handleTypeProp = serializedObject.FindProperty("handleStyle");
+ handle1Prop = serializedObject.FindProperty("_handle1");
+ handle2Prop = serializedObject.FindProperty("_handle2");
+ }
+
+ public override void OnInspectorGUI (){
+
+ serializedObject.Update();
+
+ BezierPoint.HandleStyle newHandleType = (BezierPoint.HandleStyle)EditorGUILayout.EnumPopup("Handle Type", (BezierPoint.HandleStyle)handleTypeProp.intValue);
+
+ if(newHandleType != (BezierPoint.HandleStyle)handleTypeProp.intValue)
+ {
+ handleTypeProp.intValue = (int)newHandleType;
+
+ if((int)newHandleType == 0)
+ {
+ if(handle1Prop.vector3Value != Vector3.zero) handle2Prop.vector3Value = -handle1Prop.vector3Value;
+ else if(handle2Prop.vector3Value != Vector3.zero) handle1Prop.vector3Value = -handle2Prop.vector3Value;
+ else
+ {
+ handle1Prop.vector3Value = new Vector3(0.1f, 0, 0);
+ handle2Prop.vector3Value = new Vector3(-0.1f, 0, 0);
+ }
+ }
+
+ else if((int)newHandleType == 1)
+ {
+ if(handle1Prop.vector3Value == Vector3.zero && handle2Prop.vector3Value == Vector3.zero)
+ {
+ handle1Prop.vector3Value = new Vector3(0.1f, 0, 0);
+ handle2Prop.vector3Value = new Vector3(-0.1f, 0, 0);
+ }
+ }
+
+ else if((int)newHandleType == 2)
+ {
+ handle1Prop.vector3Value = Vector3.zero;
+ handle2Prop.vector3Value = Vector3.zero;
+ }
+ }
+
+ if(handleTypeProp.intValue != 2)
+ {
+ Vector3 newHandle1 = EditorGUILayout.Vector3Field("Handle 1", handle1Prop.vector3Value);
+ Vector3 newHandle2 = EditorGUILayout.Vector3Field("Handle 2", handle2Prop.vector3Value);
+
+ if(handleTypeProp.intValue == 0){
+ if(newHandle1 != handle1Prop.vector3Value){
+ handle1Prop.vector3Value = newHandle1;
+ handle2Prop.vector3Value = -newHandle1;
+ }
+
+ else if(newHandle2 != handle2Prop.vector3Value){
+ handle1Prop.vector3Value = -newHandle2;
+ handle2Prop.vector3Value = newHandle2;
+ }
+ }
+
+ else{
+ handle1Prop.vector3Value = newHandle1;
+ handle2Prop.vector3Value = newHandle2;
+ }
+ }
+
+ if(GUI.changed){
+ serializedObject.ApplyModifiedProperties();
+ EditorUtility.SetDirty(target);
+ }
+ }
+
+ void OnSceneGUI()
+ {
+
+ Handles.color = Color.green;
+ Vector3 newPosition = Handles.FreeMoveHandle(point.position, point.transform.rotation, HandleUtility.GetHandleSize(point.position)*0.2f, Vector3.zero, Handles.CubeCap);
+ if(point.position != newPosition) point.position = newPosition;
+
+ handlers[(int)point.handleStyle](point);
+
+ Handles.color = Color.yellow;
+ Handles.DrawLine(point.position, point.globalHandle1);
+ Handles.DrawLine(point.position, point.globalHandle2);
+
+ BezierCurveEditor.DrawOtherPoints(point.curve, point);
+ }
+
+ private static void HandleConnected(BezierPoint p){
+ Handles.color = Color.cyan;
+
+ Vector3 newGlobal1 = Handles.FreeMoveHandle(p.globalHandle1, p.transform.rotation, HandleUtility.GetHandleSize(p.globalHandle1)*0.15f, Vector3.zero, Handles.SphereCap);
+
+ if(newGlobal1 != p.globalHandle1){
+ Undo.RegisterUndo(p, "Move Handle");
+ p.globalHandle1 = newGlobal1;
+ p.globalHandle2 = -(newGlobal1 - p.position) + p.position;
+ }
+
+ Vector3 newGlobal2 = Handles.FreeMoveHandle(p.globalHandle2, p.transform.rotation, HandleUtility.GetHandleSize(p.globalHandle2)*0.15f, Vector3.zero, Handles.SphereCap);
+
+ if(newGlobal2 != p.globalHandle2){
+ Undo.RegisterUndo(p, "Move Handle");
+ p.globalHandle1 = -(newGlobal2 - p.position) + p.position;
+ p.globalHandle2 = newGlobal2;
+ }
+ }
+
+ private static void HandleBroken(BezierPoint p){
+ Handles.color = Color.cyan;
+
+ Vector3 newGlobal1 = Handles.FreeMoveHandle(p.globalHandle1, Quaternion.identity, HandleUtility.GetHandleSize(p.globalHandle1)*0.15f, Vector3.zero, Handles.SphereCap);
+ Vector3 newGlobal2 = Handles.FreeMoveHandle(p.globalHandle2, Quaternion.identity, HandleUtility.GetHandleSize(p.globalHandle2)*0.15f, Vector3.zero, Handles.SphereCap);
+
+ if(newGlobal1 != p.globalHandle1)
+ {
+ Undo.RegisterUndo(p, "Move Handle");
+ p.globalHandle1 = newGlobal1;
+ }
+
+ if(newGlobal2 != p.globalHandle2)
+ {
+ Undo.RegisterUndo(p, "Move Handle");
+ p.globalHandle2 = newGlobal2;
+ }
+ }
+
+ private static void HandleAbsent(BezierPoint p)
+ {
+ p.handle1 = Vector3.zero;
+ p.handle2 = Vector3.zero;
+ }
+} \ No newline at end of file