public void NoEditModeChange([Values] SplineEditMode mode) { ISimpleTestSpline2D testSpline2D = PrepareSpline(); float2 a = float2.zero; testSpline2D.AddControlPoint(a); testSpline2D.ChangeEditMode(0, mode); Assert.AreEqual(SplineEditMode.Standard, testSpline2D.GetEditMode(0)); }
public void NoEditModeChange([Values] SplineEditMode mode) { ITestSpline testSpline = PrepareSpline(); float3 a = float3.zero; AddControlPointLocalSpace(testSpline, a); testSpline.ChangeEditMode(0, mode); Assert.AreEqual(SplineEditMode.Standard, testSpline.GetEditMode(0)); }
/// <summary> /// Shared Inspector logic /// </summary> /// <param name="spline">spline to show inspector for</param> protected void OnInspectorGUI(ISpline2DEditor spline) { if (GUILayout.Button("Edit Points")) { m_editing = !m_editing; m_editControlPoint = null; m_editNewPointIndex = -1; m_lastTransPosition = m_sourceTrans?.position ?? Vector3.zero; SceneView.RepaintAll(); } if (!m_editing) { GUILayout.Space(5); EditorGUILayout.HelpBox( $"Points: {spline.ControlPointCount}\n" + $"Length: {spline.Length():N3}", MessageType.None); if (spline is ILoopingSpline loop) { EditorGUI.BeginChangeCheck(); loop.Looped = EditorGUILayout.Toggle("Loop", loop.Looped); if (EditorGUI.EndChangeCheck()) { SceneView.RepaintAll(); } } if (spline is IArkableSpline arked) { EditorGUI.BeginChangeCheck(); arked.ArkParameterization = EditorGUILayout.Toggle("Ark Parametrization", arked.ArkParameterization); if (EditorGUI.EndChangeCheck() && spline is Object objSpline) { EditorUtility.SetDirty(objSpline); } if (arked.ArkParameterization) { EditorGUI.BeginChangeCheck(); arked.ArkLength = EditorGUILayout.FloatField("Ark Length", arked.ArkLength); if (EditorGUI.EndChangeCheck() && spline is Object objSpline2) { EditorUtility.SetDirty(objSpline2); } } } GUILayout.Space(5); // Draw spline points - Draw a point every set interval to illustrate where bezier points will be EditorGUI.BeginChangeCheck(); m_debugPointQty = (int)EditorGUILayout.Slider("Draw points", m_debugPointQty, 0, 200); if (EditorGUI.EndChangeCheck()) { SceneView.RepaintAll(); } } else { if (m_sourceTrans != null) { bool value = EditorGUILayout.Toggle("Move Points with Transform", m_editMoveWithTrans); if (value != m_editMoveWithTrans) { m_editMoveWithTrans = value; m_lastTransPosition = m_sourceTrans.position; } MoveWithTransform(spline); } if (m_editNewPointIndex >= 0) { EditorGUILayout.LabelField($"New At Index: {m_editNewPointIndex}"); } if (m_editControlPoint == null) { EditorGUILayout.HelpBox($"No Control Point Selected!", MessageType.None); } else { m_editNewPointIndex = -1; EditorGUILayout.LabelField($"Control Point: {m_editControlPoint}"); // show the current control point location EditorGUI.BeginChangeCheck(); float2 currentPoint = spline.GetControlPoint2DLocal(m_editControlPoint.Value); currentPoint = EditorGUILayout.Vector2Field("Point", currentPoint); if (EditorGUI.EndChangeCheck()) { spline.UpdateControlPointLocal(m_editControlPoint.Value, currentPoint, SplinePoint.Point); SceneView.RepaintAll(); } SplineEditMode existingValue = spline.GetEditMode(m_editControlPoint.Value); SplineEditMode editMode = (SplineEditMode)EditorGUILayout.EnumPopup("Edit Mode", existingValue); if (editMode != existingValue && spline is Object objSpline) { Undo.RecordObject(objSpline, $"Change EditMode of Point {m_editControlPoint}"); EditorUtility.SetDirty(objSpline); spline.ChangeEditMode(m_editControlPoint.Value, editMode); SceneView.RepaintAll(); } GUILayout.Space(10); if (GUILayout.Button("Remove Point") || Event.current.isKey && Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Delete) { spline.RemoveControlPoint(m_editControlPoint.Value); m_editControlPoint = null; SceneView.RepaintAll(); if (Event.current.keyCode == KeyCode.Delete) { // Sadly this doesn't actually work :( dammit Unity GUIUtility.hotControl = 0; Event.current.Use(); } } } } }
protected void RenderControlPoints() { for (int i = 0; i < bezierSpline.ControlPointCount; i++) { bool selected = m_editControlPoint == i; if (selected) { Handles.color = Color.blue; } else { Handles.color = new Color(0f, 1f, 1f, 0.73f); } float3 point = bezierSpline.GetControlPoint3DWorld(i, SplinePoint.Point); Vector3 editorPosition = new Vector3(point.x, point.y, point.z); SplineEditMode editMode = bezierSpline.GetEditMode(i); // draw handles if (selected) { Vector3?lastPos = null; bool preExists = i > 0; bool postExists = i != bezierSpline.ControlPointCount - 1; if (preExists) { // pre Point float3 pre = bezierSpline.GetControlPoint3DWorld(i, SplinePoint.Pre); Vector3 pos = new Vector3(pre.x, pre.y, pre.z); lastPos = pos; EditorGUI.BeginChangeCheck(); pos = Handles.DoPositionHandle(pos, Quaternion.identity); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(bezierSpline, "Move Pre Point"); EditorUtility.SetDirty(bezierSpline); float3 newPos = new float3(pos.x, pos.y, pos.z); switch (editMode) { case SplineEditMode.Standard: { if (postExists) { float postMagnitude = math.length(point - bezierSpline.GetControlPoint3DWorld(i, SplinePoint.Post)); UpdateOppositePoint(postMagnitude, point, newPos, i, SplinePoint.Post); } bezierSpline.UpdateControlPointWorld(i, newPos, SplinePoint.Pre); break; } case SplineEditMode.Mirror: { if (postExists) { float preMagnitude = math.length(point - newPos); UpdateOppositePoint(preMagnitude, point, newPos, i, SplinePoint.Post); } bezierSpline.UpdateControlPointWorld(i, newPos, SplinePoint.Pre); break; } case SplineEditMode.Free: bezierSpline.UpdateControlPointWorld(i, newPos, SplinePoint.Pre); break; default: throw new ArgumentOutOfRangeException(); } SceneView.RepaintAll(); } } { // main point EditorGUI.BeginChangeCheck(); Vector3 pos = Handles.DoPositionHandle(editorPosition, Quaternion.identity); if (lastPos != null) { Handles.DrawLine(pos, lastPos.Value); } lastPos = pos; if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(bezierSpline, "Move Point"); EditorUtility.SetDirty(bezierSpline); float3 newPoint = new float3(pos.x, pos.y, pos.z); bezierSpline.UpdateControlPointWorld(i, newPoint, SplinePoint.Point); if (m_editMoveWithTrans) { //move the other points relative to this float3 delta = newPoint - point; void UpdatePoint(SplinePoint type) { float3 cp = bezierSpline.GetControlPoint3DWorld(i, type); bezierSpline.UpdateControlPointWorld(i, cp + delta, type); } if (preExists) { UpdatePoint(SplinePoint.Pre); } if (postExists) { UpdatePoint(SplinePoint.Post); } } SceneView.RepaintAll(); } } if (postExists) { // post Point float3 post = bezierSpline.GetControlPoint3DWorld(i, SplinePoint.Post); Vector3 pos = new Vector3(post.x, post.y, post.z); Handles.DrawLine(pos, lastPos.Value); EditorGUI.BeginChangeCheck(); pos = Handles.DoPositionHandle(pos, Quaternion.identity); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(bezierSpline, "Move Post Point"); EditorUtility.SetDirty(bezierSpline); float3 newPos = new float3(pos.x, pos.y, pos.z); switch (editMode) { case SplineEditMode.Standard: { if (preExists) { float preMagnitude = math.length(point - bezierSpline.GetControlPoint3DWorld(i, SplinePoint.Pre)); UpdateOppositePoint(preMagnitude, point, newPos, i, SplinePoint.Pre); } bezierSpline.UpdateControlPointWorld(i, newPos, SplinePoint.Post); break; } case SplineEditMode.Mirror: { if (preExists) { float postMagnitude = math.length(point - newPos); UpdateOppositePoint(postMagnitude, point, newPos, i, SplinePoint.Pre); } bezierSpline.UpdateControlPointWorld(i, newPos, SplinePoint.Post); break; } case SplineEditMode.Free: bezierSpline.UpdateControlPointWorld(i, newPos, SplinePoint.Post); break; default: throw new ArgumentOutOfRangeException(); } SceneView.RepaintAll(); } } } else { float size = HandleUtility.GetHandleSize(editorPosition) / 12f; if (Handles.Button(editorPosition, Quaternion.identity, size, size, Handles.DotHandleCap)) { m_editControlPoint = i; Repaint(); } } } }