RMB look doesn't pitch up sometimes on weird scaling/dpi combo

# Conflicts:
#	Source/Editor/Viewport/EditorViewport.cs
This commit is contained in:
Roman Zhu
2026-09-16 12:27:38 +02:00
committed by mafiesto4
parent 82ee8713f5
commit 7a6190944c
2 changed files with 39 additions and 4 deletions
+11 -4
View File
@@ -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;
}
/// <summary>
/// Called when left mouse button goes down (on press).
/// </summary>
@@ -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
+28
View File
@@ -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