diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs index ea36f558a..6711b3606 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -1560,8 +1560,9 @@ namespace FlaxEditor.Viewport var center = Float2.Round(size * 0.5f); if (Mathf.Abs(_viewMousePos.X - center.X) > center.X * 0.8f || Mathf.Abs(_viewMousePos.Y - center.Y) > center.Y * 0.8f) { - _viewMousePos = center; - win.MousePosition = PointToWindow(_viewMousePos); + var windowPosition = SnapMousePositionToDevicePixels(PointToWindow(center), win.DpiScale); + _viewMousePos = PointFromWindow(windowPosition); + win.MousePosition = windowPosition * win.DpiScale; } #endif } @@ -1578,6 +1579,11 @@ namespace FlaxEditor.Viewport win.MouseMoveRelative -= OnMouseMoveRelative; } + internal static Float2 SnapMousePositionToDevicePixels(Float2 position, float dpiScale) + { + return Float2.Round(position * dpiScale) / dpiScale; + } + /// /// Called when left mouse button goes down (on press). /// @@ -1858,8 +1864,9 @@ namespace FlaxEditor.Viewport // Move mouse back to the root position if (centerMouse && (_input.IsMouseRightDown || _input.IsMouseLeftDown || _input.IsMouseMiddleDown || _isVirtualMouseRightDown)) { - var center = PointToWindow(_startPos); - win.MousePosition = center; + var windowPosition = SnapMousePositionToDevicePixels(PointToWindow(_startPos), win.Window.DpiScale); + _startPos = PointFromWindow(windowPosition); + win.MousePosition = windowPosition; } #endif diff --git a/Source/Engine/Tests/TestEditorViewport.cs b/Source/Engine/Tests/TestEditorViewport.cs new file mode 100644 index 000000000..9123cfd20 --- /dev/null +++ b/Source/Engine/Tests/TestEditorViewport.cs @@ -0,0 +1,28 @@ +// Copyright (c) Wojciech Figat. All rights reserved. + +#if FLAX_TESTS +using FlaxEditor.Viewport; +using FlaxEngine; +using NUnit.Framework; + +namespace FlaxEditor.Tests +{ + [TestFixture] + public class TestEditorViewport + { + [Test] + public void TestMouseAnchorSnapsToDevicePixels() + { + const float dpiScale = 1.25f; + var logicalPosition = new Float2(984.7999f, 580.7999f); + + var snapped = EditorViewport.SnapMousePositionToDevicePixels(logicalPosition, dpiScale); + var physicalPosition = snapped * dpiScale; + + Assert.AreEqual(1231.0f, physicalPosition.X, 0.0001f); + Assert.AreEqual(726.0f, physicalPosition.Y, 0.0001f); + Assert.AreEqual(snapped, EditorViewport.SnapMousePositionToDevicePixels(snapped, dpiScale)); + } + } +} +#endif