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));
        }
Beispiel #3
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();
                        }
                    }
                }
            }
        }
Beispiel #4
0
        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();
                    }
                }
            }
        }