예제 #1
0
        protected static void RenderTransformationGizmos(SVGTransform2D selectionTransform)
        {
            Handles.color = COLOR_SELECTED;
            Quaternion capRotation = Quaternion.identity;
            //        Vector2 transformAnchor = Vector2.zero;

            Quaternion rotation = Quaternion.Euler(0f, 0f, selectionTransform.rotation + gizmoRotation);
//            Matrix4x4 rotationMatrix = Matrix4x4.TRS(Vector3.zero, rotation, Vector3.one);

            /*
             * Vector2 offset = Vector2.zero;
             *
             * if (_scaling && !Event.current.alt)
             * {
             *  if (p0_scale)
             *  {
             *      offset = rotationMatrix.MultiplyVector(Vector2.Scale(_startExtents, Vector2.one - selectionTransform.scale));
             *  } else if (p1_scale)
             *  {
             *      offset = rotationMatrix.MultiplyVector(Vector2.Scale(new Vector2(-_startExtents.x, _startExtents.y), Vector2.one - selectionTransform.scale));
             *  } else if (p2_scale)
             *  {
             *      offset = rotationMatrix.MultiplyVector(Vector2.Scale(new Vector2(_startExtents.x, -_startExtents.y), Vector2.one - selectionTransform.scale));
             *  } else if (p3_scale)
             *  {
             *      offset = rotationMatrix.MultiplyVector(Vector2.Scale(-_startExtents, Vector2.one - selectionTransform.scale));
             *  } else  if (!Event.current.shift && selectionTransform.scale.x != selectionTransform.scale.y)
             *  {
             *      if (_p0p1_scale || _p2p0_scale)
             *      {
             *          offset = rotationMatrix.MultiplyVector(Vector2.Scale(_startExtents, Vector2.one - selectionTransform.scale));
             *      } else if (_p1p3_scale || _p3p2_scale)
             *      {
             *          offset = rotationMatrix.MultiplyVector(Vector2.Scale(-_startExtents, Vector2.one - selectionTransform.scale));
             *      }
             *  } else
             *  {
             *      if (_p0p1_scale)
             *      {
             *          offset = rotationMatrix.MultiplyVector(Vector2.Scale(new Vector2(0f, _startExtents.y), Vector2.one - selectionTransform.scale));
             *      } else if (_p1p3_scale)
             *      {
             *          offset = rotationMatrix.MultiplyVector(Vector2.Scale(new Vector2(-_startExtents.x, 0f), Vector2.one - selectionTransform.scale));
             *      } else if (_p2p0_scale)
             *      {
             *          offset = rotationMatrix.MultiplyVector(Vector2.Scale(new Vector2(_startExtents.x, 0f), Vector2.one - selectionTransform.scale));
             *      } else if (_p3p2_scale)
             *      {
             *          offset = rotationMatrix.MultiplyVector(Vector2.Scale(new Vector2(0f, -_startExtents.y), Vector2.one - selectionTransform.scale));
             *      }
             *  }
             * }
             */

//            Debug.Log(offset);
            Matrix4x4 transMatrix = Matrix4x4.TRS(selectionTransform.position, rotation, selectionTransform.scale);
            Matrix4x4 selectionTransformMatrix = transMatrix;

            Vector2 p0 = selectionTransformMatrix.MultiplyPoint(new Vector2(-1f, -1f));
            Vector2 p1 = selectionTransformMatrix.MultiplyPoint(new Vector2(1f, -1f));
            Vector2 p2 = selectionTransformMatrix.MultiplyPoint(new Vector2(-1f, 1f));
            Vector2 p3 = selectionTransformMatrix.MultiplyPoint(new Vector2(1f, 1f));

            // Center
            //Handles.color = Color.blue;
            //Handles.CircleCap(0, new Vector3(selectedBounds.center.x, selectedBounds.center.y, 0f), Quaternion.identity, handleSize * 0.1f);

            Vector2 p0p1 = Vector2.Lerp(p0, p1, 0.5f);
            Vector2 p1p3 = Vector2.Lerp(p1, p3, 0.5f);
            Vector2 p3p2 = Vector2.Lerp(p3, p2, 0.5f);
            Vector2 p2p0 = Vector2.Lerp(p2, p0, 0.5f);

            Vector2 diagonalA  = (p0 - p3).normalized;
            Vector2 diagonalB  = (p1 - p2).normalized;
            Vector2 horizontal = (p2p0 - p1p3).normalized;
            Vector2 vertical   = (p3p2 - p0p1).normalized;

            Handles.DotCap(0, Vector2.Lerp(p2p0, p1p3, 0.5f), capRotation, transformCapSize);

            // p0
            SVGGizmos.ShowScaleCursor(p0, p3 - p0, transformCursorRadius);
            SVGGizmos.ShowCursor(p0 + diagonalA * transformRotationOffset, transformRotationHandleSize, MouseCursor.RotateArrow);
            if (_p0_scale || _p0_rotate)
            {
                Handles.color = COLOR_HIGHLIGHTED;
            }
            else
            {
                Handles.color = COLOR_SELECTED;
            }
            Handles.DotCap(0, p0, capRotation, transformCapSize);

            // p1
            SVGGizmos.ShowScaleCursor(p1, p2 - p1, transformCursorRadius);
            SVGGizmos.ShowCursor(p1 + diagonalB * transformRotationOffset, transformRotationHandleSize, MouseCursor.RotateArrow);
            if (_p1_scale || _p1_rotate)
            {
                Handles.color = COLOR_HIGHLIGHTED;
            }
            else
            {
                Handles.color = COLOR_SELECTED;
            }
            Handles.DotCap(0, p1, capRotation, transformCapSize);

            // p2
            SVGGizmos.ShowScaleCursor(p2, p1 - p2, transformCursorRadius);
            SVGGizmos.ShowCursor(p2 - diagonalB * transformRotationOffset, transformRotationHandleSize, MouseCursor.RotateArrow);
            if (_p2_scale || _p2_rotate)
            {
                Handles.color = COLOR_HIGHLIGHTED;
            }
            else
            {
                Handles.color = COLOR_SELECTED;
            }
            Handles.DotCap(0, p2, capRotation, transformCapSize);

            // p3
            SVGGizmos.ShowScaleCursor(p3, p0 - p3, transformCursorRadius);
            SVGGizmos.ShowCursor(p3 - diagonalA * transformRotationOffset, transformRotationHandleSize, MouseCursor.RotateArrow);
            if (_p3_scale || _p3_rotate)
            {
                Handles.color = COLOR_HIGHLIGHTED;
            }
            else
            {
                Handles.color = COLOR_SELECTED;
            }
            Handles.DotCap(0, p3, capRotation, transformCapSize);

            // p0-p1
            SVGGizmos.ShowScaleCursor(p0p1, p3p2 - p0p1, transformCursorRadius);
            SVGGizmos.ShowCursor(p0p1 - vertical * transformRotationOffset, transformRotationHandleSize, MouseCursor.RotateArrow);
            if (_p0p1_scale || _p0p1_scale)
            {
                Handles.color = COLOR_HIGHLIGHTED;
            }
            else
            {
                Handles.color = COLOR_SELECTED;
            }
            Handles.DotCap(0, p0p1, capRotation, transformCapSize);

            // p2-p0
            SVGGizmos.ShowScaleCursor(p2p0, p1p3 - p2p0, transformCursorRadius);
            SVGGizmos.ShowCursor(p2p0 + horizontal * transformRotationOffset, transformRotationHandleSize, MouseCursor.RotateArrow);
            if (_p2p0_scale || _p2p0_scale)
            {
                Handles.color = COLOR_HIGHLIGHTED;
            }
            else
            {
                Handles.color = COLOR_SELECTED;
            }
            Handles.DotCap(0, p2p0, capRotation, transformCapSize);

            // p3-p2
            SVGGizmos.ShowScaleCursor(p3p2, p0p1 - p3p2, transformCursorRadius);
            SVGGizmos.ShowCursor(p3p2 + vertical * transformRotationOffset, transformRotationHandleSize, MouseCursor.RotateArrow);
            if (_p3p2_scale || _p3p2_rotate)
            {
                Handles.color = COLOR_HIGHLIGHTED;
            }
            else
            {
                Handles.color = COLOR_SELECTED;
            }
            Handles.DotCap(0, p3p2, capRotation, transformCapSize);

            // p1-p3
            SVGGizmos.ShowScaleCursor(p1p3, p2p0 - p1p3, transformCursorRadius);
            SVGGizmos.ShowCursor(p1p3 - horizontal * transformRotationOffset, transformRotationHandleSize, MouseCursor.RotateArrow);
            if (p1p3_scale || p1p3_scale)
            {
                Handles.color = COLOR_HIGHLIGHTED;
            }
            else
            {
                Handles.color = COLOR_SELECTED;
            }
            Handles.DotCap(0, p1p3, capRotation, transformCapSize);

            Handles.color = COLOR_SELECTED;
            SVGGizmos.Line(new Vector2[] { p0, p1, p3, p2, p0 });

            /*
             * Handles.Label(p0, "   p0");
             * Handles.Label(p1, "   p1");
             * Handles.Label(p2, "   p2");
             * Handles.Label(p3, "   p3");
             */
        }
예제 #2
0
        protected static void OnMouseDown(SVGTransform2D selectionTransform)
        {
            Matrix4x4 selectionTransformMatrix = Matrix4x4.TRS(selectionTransform.position, Quaternion.Euler(0f, 0f, selectionTransform.rotation), new Vector3(selectionTransform.scale.x, selectionTransform.scale.y, 1f));
            Camera    editorCamera             = Camera.current;

            p0 = selectionTransformMatrix.MultiplyPoint(new Vector2(-1f, -1f));
            p1 = selectionTransformMatrix.MultiplyPoint(new Vector2(1f, -1f));
            p2 = selectionTransformMatrix.MultiplyPoint(new Vector2(-1f, 1f));
            p3 = selectionTransformMatrix.MultiplyPoint(new Vector2(1f, 1f));

            center = Vector2.Lerp(p0, p3, 0.5f);

            p0p1 = Vector2.Lerp(p0, p1, 0.5f);
            p1p3 = Vector2.Lerp(p1, p3, 0.5f);
            p3p2 = Vector2.Lerp(p3, p2, 0.5f);
            p2p0 = Vector2.Lerp(p2, p0, 0.5f);

            Vector2 diagonalA  = (p0 - p3).normalized;
            Vector2 diagonalB  = (p1 - p2).normalized;
            Vector2 horizontal = (p2p0 - p1p3).normalized;
            Vector2 vertical   = (p3p2 - p0p1).normalized;

            //Vector3 localMousePosition = transform.worldToLocalMatrix.MultiplyPoint(Camera.current.ScreenToWorldPoint(new Vector3(Event.current.mousePosition.x, Event.current.mousePosition.y, Mathf.Abs(transform.position.z - Camera.current.transform.position.z))));

            _startScale.x = Vector2.Distance(p2p0, p1p3);
            _startScale.y = Vector2.Distance(p0p1, p3p2);

            // p0
            _p0_scale  = SVGGizmos.MouseTestScreenRect(p0, transformCursorRadius);
            _p0_rotate = SVGGizmos.MouseTestScreenRect(p0 + diagonalA * transformRotationOffset, transformRotationHandleSize);

            // p1
            _p1_scale  = SVGGizmos.MouseTestScreenRect(p1, transformCursorRadius);
            _p1_rotate = SVGGizmos.MouseTestScreenRect(p1 + diagonalB * transformRotationOffset, transformRotationHandleSize);

            // p2
            _p2_scale  = SVGGizmos.MouseTestScreenRect(p2, transformCursorRadius);
            _p2_rotate = SVGGizmos.MouseTestScreenRect(p2 - diagonalB * transformRotationOffset, transformRotationHandleSize);

            // p3
            _p3_scale  = SVGGizmos.MouseTestScreenRect(p3, transformCursorRadius);
            _p3_rotate = SVGGizmos.MouseTestScreenRect(p3 - diagonalA * transformRotationOffset, transformRotationHandleSize);

            // p0-p1
            _p0p1_scale  = SVGGizmos.MouseTestScreenRect(p0p1, transformCursorRadius);
            _p0p1_rotate = SVGGizmos.MouseTestScreenRect(p0p1 - vertical * transformRotationOffset, transformRotationHandleSize);

            // p2-p0
            _p2p0_scale  = SVGGizmos.MouseTestScreenRect(p2p0, transformCursorRadius);
            _p2p0_rotate = SVGGizmos.MouseTestScreenRect(p2p0 + horizontal * transformRotationOffset, transformRotationHandleSize);

            // p3-p2
            _p3p2_scale  = SVGGizmos.MouseTestScreenRect(p3p2, transformCursorRadius);
            _p3p2_rotate = SVGGizmos.MouseTestScreenRect(p3p2 + vertical * transformRotationOffset, transformRotationHandleSize);

            // p1-p3
            _p1p3_scale  = SVGGizmos.MouseTestScreenRect(p1p3, transformCursorRadius);
            _p1p3_rotate = SVGGizmos.MouseTestScreenRect(p1p3 - horizontal * transformRotationOffset, transformRotationHandleSize);

            _editorHoldingTransform = _p0_scale || _p0_rotate || _p1_scale || _p1_rotate || _p2_scale || _p2_rotate || _p3_scale || _p3_rotate ||
                                      _p0p1_scale || _p0p1_rotate || _p2p0_scale || _p2p0_rotate || _p3p2_scale || _p3p2_rotate || _p1p3_scale || _p1p3_rotate;

            _scaling  = _p0_scale || _p1_scale || _p2_scale || _p3_scale || _p0p1_scale || _p2p0_scale || _p3p2_scale || _p1p3_scale;
            _rotating = _p0_rotate || _p1_rotate || _p2_rotate || _p3_rotate || _p0p1_rotate || _p2p0_rotate || _p3p2_rotate || _p1p3_rotate;

            float distanceFromCamera = Mathf.Abs(editorCamera.transform.position.z - worldTransformPosition.z);

            mouseStartWorldPosition = editorCamera.ScreenToWorldPoint(new Vector3(Event.current.mousePosition.x, editorCamera.pixelHeight - Event.current.mousePosition.y, distanceFromCamera));
            mouseStartLocalPosition = selectionTransformMatrix.inverse.MultiplyPoint(mouseStartWorldPosition);
            lastLocalToWorld        = selectionTransformMatrix;

            if (!_editorHoldingTransform)
            {
                Vector2 mouseTest = selectionTransformMatrix.inverse.MultiplyPoint(mouseStartWorldPosition);
                if (Mathf.Abs(mouseTest.x) <= 1f && Mathf.Abs(mouseTest.y) <= 1f)
                {
                    _editorHoldingTransform = true;
                    _move = true;
                }
            }


            UpdateAnchor();
        }