public void UpdateControlPoint(ISpline2D spline, int index, float3 newPoint, SplinePoint pointType) { ISpline2DEditor spline2D = spline as ISpline2DEditor; Assert.NotNull(spline2D); spline2D.UpdateControlPointLocal(index, newPoint.xy, pointType); }
/// <summary> /// Renders a blue dot at each control point of the spline /// </summary> /// <param name="spline">spline to render control points for</param> protected void RenderControlPoints(ISpline2DEditor spline) { for (int i = 0; i < spline.ControlPointCount; i++) { bool selected = m_editControlPoint == i; Handles.color = selected ? Color.blue : new Color(0f, 1f, 1f, 0.73f); float2 point = spline.GetControlPoint2DWorld(i); float3 editorPosition = new float3(point, 0f); // draw handles if (selected) { // main point EditorGUI.BeginChangeCheck(); Vector3 pos = Handles.DoPositionHandle(editorPosition, Quaternion.identity); if (EditorGUI.EndChangeCheck() && spline is Object objSpline) { Undo.RecordObject(objSpline, "Move Point"); EditorUtility.SetDirty(objSpline); float3 origin = ((MonoBehaviour)spline).transform.position; float2 newPoint = new float2(pos.x, pos.y) - origin.xy; spline.UpdateControlPointLocal(i, newPoint, SplinePoint.Point); SceneView.RepaintAll(); } } else { float size = HandleUtility.GetHandleSize(editorPosition) / 12f; if (Handles.Button(editorPosition, Quaternion.identity, size, size, Handles.DotHandleCap)) { m_editControlPoint = i; Repaint(); } } } }
/// <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(); } } } } }