public static void DrawCurveOrientations(IBezier3DSplineData splineData) { var sceneViewCameraPosition = SceneView.lastActiveSceneView.camera.transform.position; var maxViewDistance = CurvePreferences.MaximumViewDistance; for (var dist = 0f; dist < splineData.TotalLength; dist += 1) { var point = splineData.GetPosition(dist); if (Vector3.Distance(sceneViewCameraPosition, point) > maxViewDistance) { continue; } // Draw Up Vector var up = splineData.GetUp(dist); Handles.color = Handles.yAxisColor; Handles.DrawLine(point, point + up); // Draw Forward Vector var forward = splineData.GetForward(dist); Handles.color = Handles.zAxisColor; Handles.DrawLine(point, point + forward); // Draw Right Vector var right = splineData.GetRight(dist); Handles.color = Handles.xAxisColor; Handles.DrawLine(point, point + right); } }
public static void CheckGeneralHotkeys( IBezier3DSplineData splineData, Action <IReadOnly3DSplineData> onUpdateSpline) { var evt = Event.current; switch (evt.type) { // Undo Last Command case EventType.ValidateCommand: if (evt.commandName == UNDO_REDO_PERFORMED) { onUpdateSpline?.Invoke(splineData); } break; // Flip Spline case EventType.KeyDown: if (evt.keyCode == KeyCode.I) { if ((evt.modifiers & (EventModifiers.Control | EventModifiers.Command)) != 0) { splineData.Flip(); } } break; } }
public static void DrawCurveLinesGizmos(IBezier3DSplineData splineData, Transform transform = null) { Gizmos.color = Color.white; //Loop through each curve in spline var segments = splineData.InterpolationStepsPerCurve; var spacing = 1f / segments; for (var i = 0; i < splineData.CurveCount; i++) { var curve = splineData.GetCurve(i); //Get curve in world space Vector3 a, b, c, d; if (transform != null) { a = transform.TransformPoint(curve.StartPoint); b = transform.TransformPoint(curve.FirstHandle + curve.StartPoint); c = transform.TransformPoint(curve.SecondHandle + curve.EndPoint); d = transform.TransformPoint(curve.EndPoint); } else { a = curve.StartPoint; b = curve.FirstHandle + curve.StartPoint; c = curve.SecondHandle + curve.EndPoint; d = curve.EndPoint; } var prev = Bezier3DCurve.GetPoint( a, b, c, d, 0f); for (var k = 0; k <= segments; k++) { var cur = Bezier3DCurve.GetPoint( a, b, c, d, k * spacing); Gizmos.DrawLine(prev, cur); prev = cur; } } }
public static void CheckSelectedKnotHotkeys( IBezier3DSplineData splineData, Action <IReadOnly3DSplineData> onUpdateSpline) { var evt = Event.current; switch (evt.type) { case EventType.KeyDown: // Delete Selected Knot if (evt.keyCode == KeyCode.Delete) { if (splineData.KnotCount > 2) { Undo.RecordObject((UnityEngine.Object)splineData, "Remove Bezier Point"); splineData.RemoveKnot(CurveEditorState.SelectedKnotIndex); CurveEditorState.ClearKnotSelection(); onUpdateSpline?.Invoke(splineData); } evt.Use(); } // Focus Selected Knot if (evt.keyCode == KeyCode.F) { var dist = splineData.GetSplineDistanceForKnotIndex(CurveEditorState.SelectedKnotIndex); var pos = splineData.GetPosition(dist); SceneView.lastActiveSceneView.Frame(new Bounds(pos, Vector3.one * 5f), false); evt.Use(); } // Clear Knot Selection if (evt.keyCode == KeyCode.Escape) { CurveEditorState.ClearKnotSelection(); evt.Use(); } break; } }
public static void DrawMultiSelect( IBezier3DSplineData splineData, UnityEditor.Editor editorWindow, Transform transform = null) { Handles.color = Color.blue; for (var i = 0; i < CurveEditorState.SelectedKnots.Count; i++) { if (Handles.Button( transform == null ? splineData.GetKnot(CurveEditorState.SelectedKnots[i]).position : transform.TransformPoint(splineData.GetKnot(CurveEditorState.SelectedKnots[i]).position), Camera.current.transform.rotation, SceneGUIConstants.HandleSize, SceneGUIConstants.HandleSize, Handles.CircleHandleCap)) { CurveEditorState.SelectKnot(CurveEditorState.SelectedKnots[i], true); editorWindow.Repaint(); } } var handlePos = Vector3.zero; if (Tools.pivotMode == PivotMode.Center) { for (var i = 0; i < CurveEditorState.SelectedKnots.Count; i++) { handlePos += splineData.GetKnot(CurveEditorState.SelectedKnots[i]).position; } handlePos /= CurveEditorState.SelectedKnots.Count; } else { handlePos = splineData.GetKnot(CurveEditorState.SelectedKnotIndex).position; } if (transform != null) { handlePos = transform.TransformPoint(handlePos); } Handles.PositionHandle(handlePos, Tools.handleRotation); }
public static void DrawUnselectedKnots( IBezier3DSplineData splineData, UnityEditor.Editor editorWindow, Transform transform = null) { for (var i = 0; i < splineData.KnotCount; i++) { if (CurveEditorState.SelectedKnots.Contains(i)) { continue; } var knot = splineData.GetKnot(i); var knotWorldPos = transform == null ? knot.position : transform.TransformPoint(knot.position); if (knot.rotation.HasValue) { Handles.color = Handles.yAxisColor; var rot = knot.rotation.Value; Handles.ArrowHandleCap( 0, knotWorldPos, rot * Quaternion.AngleAxis(90, Vector3.left), 0.15f, EventType.Repaint); } Handles.color = Color.white; if (Handles.Button( knotWorldPos, Camera.current.transform.rotation, HandleUtility.GetHandleSize(knotWorldPos) * SceneGUIConstants.HandleSize, HandleUtility.GetHandleSize(knotWorldPos) * SceneGUIConstants.HandleSize, Handles.CircleHandleCap)) { CurveEditorState.SelectKnot(i, Event.current.control); editorWindow.Repaint(); } } }
public static void DrawCurveOrientations(IBezier3DSplineData splineData) { for (var dist = 0f; dist < splineData.TotalLength; dist += 1) { var point = splineData.GetPosition(dist); // Draw Up Vector var up = splineData.GetUp(dist); Handles.color = Handles.yAxisColor; Handles.DrawLine(point, point + up); // Draw Forward Vector var forward = splineData.GetForward(dist); Handles.color = Handles.zAxisColor; Handles.DrawLine(point, point + forward); // Draw Right Vector var right = splineData.GetRight(dist); Handles.color = Handles.xAxisColor; Handles.DrawLine(point, point + right); } }