Exemple #1
0
        private static float   SnapScale(float aOriginalScale, float aNewScale, PathSnap aSnapMode = PathSnap.Unity)
        {
            float result = aNewScale;

            if (!Event.current.control)
            {
                return(result);
            }

            float snap = EditorTools.GetUnityScaleSnap();

            if (aSnapMode == PathSnap.Local || aSnapMode == PathSnap.World)
            {
                result = SnapScalar(aNewScale, snap);
            }

            if (aSnapMode == PathSnap.Relative)
            {
                result = aOriginalScale + SnapScalar(aNewScale - aOriginalScale, snap);
            }

            return(result);
        }
Exemple #2
0
        private static Vector2 Snap(Vector2 aOriginalPoint, Vector2 aNewPoint, Matrix4x4 aTransform, Matrix4x4 aInvTransform, PathSnap aSnapMode = PathSnap.Unity)
        {
            Vector2 result = aNewPoint;

            if (!Event.current.control)
            {
                return(result);
            }

            Vector3 snap = EditorTools.GetUnitySnap();

            if (aSnapMode == PathSnap.Local)
            {
                result = SnapVector(aNewPoint, snap);
            }

            if (aSnapMode == PathSnap.World)
            {
                result = aInvTransform.MultiplyPoint(SnapVector(aTransform.MultiplyPoint(aNewPoint), snap));
            }

            if (aSnapMode == PathSnap.Relative)
            {
                result = aOriginalPoint + SnapVector(aNewPoint - aOriginalPoint, snap);
            }

            return(result);
        }
Exemple #3
0
        public static void OnSceneGUIEasy(SerializedProperty aPath, Path2D.Plane aPlane = Path2D.Plane.XY, PathSnap aSnapMode = PathSnap.Unity, float aSmartSnapDist = 0, PathEditorVisuals aVisuals = null)
        {
            SerializedObject obj = aPath.serializedObject;
            Transform        t   = ((Component)obj.targetObject).transform;
            Path2D           raw = EditorTools.GetTargetObjectOfProperty(aPath) as Path2D;

            OnSceneGUI(t.localToWorldMatrix, t.worldToLocalMatrix, aPath, raw, true, null, null, aPlane, aSnapMode, aSmartSnapDist, KeyCode.C, aVisuals);
            DoDragSelect(t.localToWorldMatrix, raw, new Rect(0, 0, Screen.width, Screen.height), aVisuals);
            obj.ApplyModifiedProperties();
        }
Exemple #4
0
        private static Vector2 SnapRadial(Vector3 aWorldPt, Vector2 aOriginalPoint, Vector2 aNewPoint, Matrix4x4 aTransform, Matrix4x4 aInvTransform, PathSnap aSnapMode = PathSnap.Unity)
        {
            Vector2 result = aNewPoint;

            if (!Event.current.control)
            {
                return(result);
            }

            float   angleSnap     = EditorTools.GetUnityRotationSnap();
            float   magnitudeSnap = EditorTools.GetUnityScaleSnap();
            Vector2 src           = aNewPoint;

            if (aSnapMode == PathSnap.Local)
            {
                src = aNewPoint;
            }
            if (aSnapMode == PathSnap.World)
            {
                src = aInvTransform.MultiplyVector(aNewPoint);
            }
            if (aSnapMode == PathSnap.Relative)
            {
                src = aNewPoint;
            }

            Vector2 polar     = new Vector2(PathUtil.ClockwiseAngle(src, Vector2.right), src.magnitude);
            Vector3 polarSnap = new Vector3(angleSnap, magnitudeSnap, 0);

            polar    = SnapVector(polar, polarSnap);
            polar.x *= Mathf.Deg2Rad;

            result = new Vector2(Mathf.Cos(polar.x) * polar.y, Mathf.Sin(polar.x) * polar.y);

            if (aSnapMode == PathSnap.World)
            {
                result = aInvTransform.MultiplyVector(result);
            }

            return(result);
        }
Exemple #5
0
        private static void ShowPoint(Path2D aPathRaw, int aIndex, Selection aSelection, Matrix4x4 aTransform, Matrix4x4 aInvTransform, SerializedProperty aPath, Path2D.Plane aPlane, Plane aEditPlane, PathSnap aSnapMode, float aSmartSnapDist, PathEditorVisuals aVisuals)
        {
            Handles.color = aVisuals.colorHandle * _activeHandleTint;
            Handles.CapFunction cap = aVisuals.capVertex;
            if (aVisuals.capVertexTypes != null)
            {
                cap = aVisuals.capVertexTypes[(int)aPathRaw.GetControls(aIndex).type];
            }

            Vector3 v  = aTransform.MultiplyPoint3x4(Plane(aPathRaw[aIndex], aPlane));
            Vector3 nV = Handles.FreeMoveHandle(v,
                                                SceneView.lastActiveSceneView.camera.transform.rotation,
                                                HandleUtility.GetHandleSize(v) * aVisuals.sizeVertex,
                                                Vector3.zero,
                                                cap);

            if (nV != v)
            {
                nV = EditorTools.ProjectPoint(nV, aEditPlane);
                nV = aInvTransform.MultiplyPoint3x4(nV);
                Vector2 newPos = Deplane(nV, aPlane);
                newPos = Snap(aPathRaw[aIndex], newPos, aTransform, aInvTransform, aSnapMode);
                if (!Event.current.control && aSmartSnapDist != 0)
                {
                    newPos = SmartSnap(newPos, aPathRaw, aIndex, aSelection.ids, aSmartSnapDist);
                }

                Vector2 delta = newPos - aPathRaw[aIndex];
                aSelection.Each(aIndex, i => aPath.FindPropertyRelative("_points").GetArrayElementAtIndex(i).vector2Value += delta);

                GUI.changed     = true;
                _recentInteract = aIndex;
            }
        }
Exemple #6
0
        public static void OnSceneGUI(Matrix4x4 aTransform, Matrix4x4 aInvTransform, SerializedProperty aPath, Path2D aPathRaw, bool aShowShiftAdd = true, Action <SerializedProperty, int> aOnAddPoint = null, Action <SerializedProperty, int> aOnRemovePoint = null, Path2D.Plane aPlane = Path2D.Plane.XY, PathSnap aSnapMode = PathSnap.Unity, float aSmartSnapDist = 0, KeyCode aVertModeKey = KeyCode.C, PathEditorVisuals aVisuals = null)
        {
            if (aVisuals == null)
            {
                aVisuals = _defaultVisuals;
            }

            // get the current selection list
            Selection selection = GetSelection(aPathRaw);

            bool showControls = !Event.current.shift && !Event.current.alt;

            // check for point type switching mode
            if (Event.current.type == EventType.KeyDown && Event.current.keyCode == aVertModeKey)
            {
                _vMode = true;
                Event.current.Use();
            }
            if (Event.current.type == EventType.KeyUp && Event.current.keyCode == aVertModeKey)
            {
                _vMode = false;
                Event.current.Use();
            }
            bool deleteMode = Event.current.alt;

            // draw all the curve and handle lines
            if (Event.current.type == EventType.Repaint)
            {
                ShowPathLines(aPathRaw, aTransform, showControls, aPlane, aVisuals);
            }

            // create the plane on which all edits occur
            Plane editPlane;

            if (aPlane == Path2D.Plane.XY)
            {
                editPlane = new Plane(aTransform.MultiplyPoint3x4(Vector3.zero), aTransform.MultiplyPoint3x4(Vector3.right), aTransform.MultiplyPoint3x4(Vector3.up));
            }
            else
            {
                editPlane = new Plane(aTransform.MultiplyPoint3x4(Vector3.zero), aTransform.MultiplyPoint3x4(Vector3.right), aTransform.MultiplyPoint3x4(Vector3.forward));
            }

            // check for shift-add point to path
            if (Event.current.shift && aShowShiftAdd && Event.current.button != 1 && !Event.current.control)
            {
                ShowShiftAdd(aPathRaw, aTransform, aInvTransform, aPath, aOnAddPoint, aPlane, editPlane, aVisuals);
            }

            // draw the handles for each point
            for (int i = 0; i < aPathRaw.Count; i++)
            {
                if (selection.Count > 0)
                {
                    _activeHandleTint = selection.IsSelected(i) ? aVisuals.colorSelectionTint : aVisuals.colorUnselectedTint;
                }
                else
                {
                    _activeHandleTint = aVisuals.colorNoSelectionTint;
                }

                if (deleteMode)
                {
                    ShowPointDeleteMode(aPathRaw, i, selection, aTransform, aPath, aOnRemovePoint, aPlane, aVisuals);
                }
                else if (_vMode)
                {
                    ShowPointTypeMode(aPathRaw, i, selection, aTransform, aInvTransform, aPath, aPlane, aVisuals);
                }
                else
                {
                    ShowPoint(aPathRaw, i, selection, aTransform, aInvTransform, aPath, aPlane, editPlane, aSnapMode, aSmartSnapDist, aVisuals);
                }
                if (showControls)
                {
                    ShowHandles(aPathRaw, i, aTransform, aInvTransform, aPath, i == _recentInteract, _vMode, aPlane, editPlane, aVisuals);
                }
            }

            if (GUI.changed)
            {
                SetDirty(aPath);
            }

            Handles.color = Color.white;
        }