Пример #1
0
        //Plane3d dPlane = new Plane3d();
        public void OnSceneGUI()
        {
            if (spriteDeformerEditor.selectedPoints.Count <= 0)
            {
                return;
            }
            // dPlane = new Plane3d(spriteDeformerEditor.spriteDeformer.transform.position, spriteDeformerEditor.spriteDeformer.transform.rotation);
            CurrentTool nextTool                 = CurrentTool.NONE;
            float       newHandleSize            = HandleUtility.GetHandleSize(pos2Dto3D(pivot));
            Vector2     newPivotHandle           = pivot - oriantDirUp * newHandleSize / 3f;
            Vector2     newOriantHandle          = pivot + oriantDir * newHandleSize * 1.5f;
            float       newScaleStandartDistance = newHandleSize * 1.3f;
            Vector2     newScaleVerticalHandle   = pivot + oriantDirUp * newScaleStandartDistance;
            Vector2     newScaleHorizontalHandle = pivot + oriantDir * newScaleStandartDistance;
            Vector2     newRotateHandle          = pivot + oriantDirUp * newHandleSize * 1.5f;

            if (spriteDeformerEditor.currentTool == CurrentTool.NONE)
            {
                if (Vector3.Distance(Event.current.mousePosition, pos2DtoScreen(pivot)) < 7f)
                {
                    nextTool = CurrentTool.MOVE_POINTS;
                }
                else
                {
                    Vector2 l1Screen   = pos2DtoScreen(pivot);
                    Vector2 l2Screen   = pos2DtoScreen(pivot + oriantDir * newHandleSize);
                    Vector2 l2UpScreen = pos2DtoScreen(pivot + oriantDirUp * newHandleSize);
                    float   d          = Vector2.Distance(Line.ClosestPointOnSegment(l1Screen, l2Screen, Event.current.mousePosition), Event.current.mousePosition);
                    float   dUP        = Vector2.Distance(Line.ClosestPointOnSegment(l1Screen, l2UpScreen, Event.current.mousePosition), Event.current.mousePosition);
                    if (Mathf.Min(d, dUP) < 6f)
                    {
                        nextTool = d < dUP ? CurrentTool.MOVE_RIGHT : CurrentTool.MOVE_UP;
                    }
                    else if (Vector2.Distance(pos2DtoScreen(newPivotHandle), Event.current.mousePosition) < 6)
                    {
                        nextTool = CurrentTool.MOVE_PIVOT;
                    }
                    else if (Vector2.Distance(pos2DtoScreen(newScaleHorizontalHandle), Event.current.mousePosition) < 6)
                    {
                        nextTool = CurrentTool.SCALE_HORIZONTAL;
                        calculateLocalPositions();
                    }
                    else if (Vector2.Distance(pos2DtoScreen(newScaleVerticalHandle), Event.current.mousePosition) < 6)
                    {
                        nextTool = CurrentTool.SCALE_VERTICAL;
                        calculateLocalPositions();
                    }
                    else if (Vector2.Distance(pos2DtoScreen(newOriantHandle), Event.current.mousePosition) < 6)
                    {
                        nextTool = CurrentTool.ORIANT;
                    }
                    else if (Vector2.Distance(pos2DtoScreen(newRotateHandle), Event.current.mousePosition) < 6)
                    {
                        nextTool = CurrentTool.ROTATE;
                        calculateLocalPositions();
                    }
                }

                pivotDeltaClick = mouse2Dpos - pivot;
            }


            if (Event.current.type == EventType.MouseDown && nextTool != CurrentTool.NONE)
            {
                spriteDeformerEditor.currentTool = nextTool;
            }
            if (spriteDeformerEditor.currentTool == CurrentTool.MOVE_POINTS)
            {
                Vector2 newPos = mouse2Dpos - pivotDeltaClick;
                movePoints(pivot, newPos);
                pivot = newPos;
            }
            if (spriteDeformerEditor.currentTool == CurrentTool.MOVE_RIGHT || spriteDeformerEditor.currentTool == CurrentTool.MOVE_UP)
            {
                Vector2 cDir        = spriteDeformerEditor.currentTool == CurrentTool.MOVE_RIGHT ? oriantDir : oriantDirUp;
                Vector2 newPivotPos = Line3d.closestPointInLine(mouse2Dpos - pivotDeltaClick, pivot, pivot + cDir);
                movePoints(pivot, newPivotPos);
                pivot = newPivotPos;
            }
            if (spriteDeformerEditor.currentTool == CurrentTool.MOVE_PIVOT)
            {
                pivot = mouse2Dpos - pivotDeltaClick;
            }
            if (spriteDeformerEditor.currentTool == CurrentTool.SCALE_HORIZONTAL
                ||
                spriteDeformerEditor.currentTool == CurrentTool.SCALE_VERTICAL)
            {
                Vector2 lineStart = pivot;
                Vector2 line      = spriteDeformerEditor.currentTool == CurrentTool.SCALE_HORIZONTAL ? oriantDir : oriantDirUp;
                float   t         = Vector2.Dot(mouse2Dpos - lineStart, line);
                if (spriteDeformerEditor.currentTool == CurrentTool.SCALE_HORIZONTAL)
                {
                    newScaleHorizontalHandle = lineStart + line * t;
                    setPointsFromPointsInPivotLocal(new Vector2(t / newScaleStandartDistance, 1f));
                }
                else
                {
                    newScaleVerticalHandle = lineStart + line * t;
                    setPointsFromPointsInPivotLocal(new Vector2(1f, t / newScaleStandartDistance));
                }
            }
            if (spriteDeformerEditor.currentTool == CurrentTool.ORIANT)
            {
                Vector2 mlp = mouse2Dpos;
                oriant = Mathf.Atan2(mlp.y - pivot.y, mlp.x - pivot.x);
            }
            if (spriteDeformerEditor.currentTool == CurrentTool.ROTATE)
            {
                calculateLocalPositions();
                Vector2 mlp = mouse2Dpos;
                float   a   = Mathf.Atan2(mlp.y - pivot.y, mlp.x - pivot.x) - Mathf.PI / 2f;
                setPointsFromPointsInPivotLocal(new Vector2(1f, 1f), a - oriant);
                oriant = a;
            }


            Color overColor     = spriteDeformerEditor.colorSets[ColorSet.DEFORMER_TOOL].over;
            Color standartColor = spriteDeformerEditor.colorSets[ColorSet.DEFORMER_TOOL].standart;

            Handles.color = nextTool == CurrentTool.MOVE_RIGHT ? overColor : standartColor;
            List <CurrentTool> candraw = new List <CurrentTool>()
            {
                CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_RIGHT, CurrentTool.ROTATE
            };

            if (candraw.Contains(spriteDeformerEditor.currentTool))
            {
                Handles.ArrowCap(15, pos2Dto3D(pivot), spriteDeformerEditor.spriteDeformer.transform.rotation * Quaternion.Euler(0 - oriant * Mathf.Rad2Deg, 90, 0), newHandleSize);
            }

            Handles.color = nextTool == CurrentTool.MOVE_UP ? overColor : standartColor;
            candraw       = new List <CurrentTool>()
            {
                CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_UP, CurrentTool.ROTATE
            };
            if (candraw.Contains(spriteDeformerEditor.currentTool))
            {
                Handles.ArrowCap(15, pos2Dto3D(pivot), spriteDeformerEditor.spriteDeformer.transform.rotation * Quaternion.Euler(-90 - oriant * Mathf.Rad2Deg, 90, 0), newHandleSize);
            }

            Handles.color = nextTool == CurrentTool.MOVE_POINTS ? overColor : standartColor;
            Handles.CylinderCap(15, pos2Dto3D(pivot), spriteDeformerEditor.spriteDeformer.transform.rotation, newHandleSize / 5f);

            candraw = new List <CurrentTool>()
            {
                CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_PIVOT
            };
            Handles.color = nextTool == CurrentTool.MOVE_PIVOT ? overColor : standartColor;
            if (candraw.Contains(spriteDeformerEditor.currentTool))
            {
                Handles.SphereCap(0, pos2Dto3D(newPivotHandle), Quaternion.identity, newHandleSize / 10f);
            }

            Handles.color = nextTool == CurrentTool.SCALE_HORIZONTAL ? overColor : standartColor;
            candraw       = new List <CurrentTool>()
            {
                CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.SCALE_HORIZONTAL
            };
            if (candraw.Contains(spriteDeformerEditor.currentTool))
            {
                Handles.CubeCap(0, pos2Dto3D(newScaleHorizontalHandle), spriteDeformerEditor.spriteDeformer.transform.rotation * Quaternion.Euler(0, 0, oriant * Mathf.Rad2Deg), newHandleSize / 7f);
            }

            Handles.color = nextTool == CurrentTool.SCALE_VERTICAL ? overColor : standartColor;
            candraw       = new List <CurrentTool>()
            {
                CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.SCALE_VERTICAL
            };
            if (candraw.Contains(spriteDeformerEditor.currentTool))
            {
                Handles.CubeCap(0, pos2Dto3D(newScaleVerticalHandle), spriteDeformerEditor.spriteDeformer.transform.rotation * Quaternion.Euler(0, 0, oriant * Mathf.Rad2Deg), newHandleSize / 7f);
            }

            Handles.color = nextTool == CurrentTool.ORIANT ? overColor : standartColor;
            candraw       = new List <CurrentTool>()
            {
                CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_PIVOT
            };
            if (candraw.Contains(spriteDeformerEditor.currentTool))
            {
                Handles.ConeCap(0, pos2Dto3D(newOriantHandle), Quaternion.LookRotation(pos2Dto3D(newOriantHandle) - pos2Dto3D(pivot)), newHandleSize / 6f);
            }

            Handles.color = nextTool == CurrentTool.ROTATE ? overColor : standartColor;
            candraw       = new List <CurrentTool>()
            {
                CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_PIVOT, CurrentTool.ROTATE
            };
            if (candraw.Contains(spriteDeformerEditor.currentTool))
            {
                Handles.ConeCap(0, pos2Dto3D(newRotateHandle), Quaternion.LookRotation(pos2Dto3D(newOriantHandle) - pos2Dto3D(pivot)), newHandleSize / 6f);
            }
        }