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"); */ }
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(); }