コード例 #1
0
ファイル: SceneGUITools.cs プロジェクト: zapdot/unity-curves
        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);
            }
        }
コード例 #2
0
ファイル: HotkeyTools.cs プロジェクト: zapdot/unity-curves
        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;
            }
        }
コード例 #3
0
        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;
                }
            }
        }
コード例 #4
0
ファイル: HotkeyTools.cs プロジェクト: zapdot/unity-curves
        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;
            }
        }
コード例 #5
0
ファイル: SceneGUITools.cs プロジェクト: zapdot/unity-curves
        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);
        }
コード例 #6
0
ファイル: SceneGUITools.cs プロジェクト: zapdot/unity-curves
        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();
                }
            }
        }
コード例 #7
0
        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);
            }
        }