This commit is contained in:
bird_egop
2026-06-05 20:47:57 +03:00
parent 195e6d71bd
commit 614787789e
11 changed files with 446 additions and 42 deletions
@@ -9,33 +9,49 @@ public sealed class ViewportInputController
private const float MouseZoomSpeed = 0.35f;
private bool _isRotatingViewport;
private bool _isPanningViewport;
public void Handle(
ViewportScene scene,
ViewportCamera camera,
bool viewportHovered,
bool viewportFocused,
Vector2 imageMin,
Vector2 imageSize)
{
var io = ImGui.GetIO();
if (viewportHovered && ImGui.IsMouseClicked(ImGuiMouseButton.Middle))
var wantsPanWithMiddle = io.KeyAlt && ImGui.IsMouseClicked(ImGuiMouseButton.Middle);
var wantsPanWithRight = ImGui.IsMouseClicked(ImGuiMouseButton.Right);
if (viewportHovered && wantsPanWithMiddle)
_isPanningViewport = true;
else if (viewportHovered && ImGui.IsMouseClicked(ImGuiMouseButton.Middle))
_isRotatingViewport = true;
if (viewportHovered && wantsPanWithRight)
_isPanningViewport = true;
if (!ImGui.IsMouseDown(ImGuiMouseButton.Middle))
_isRotatingViewport = false;
if (!ImGui.IsMouseDown(ImGuiMouseButton.Right) && !(io.KeyAlt && ImGui.IsMouseDown(ImGuiMouseButton.Middle)))
_isPanningViewport = false;
if (_isRotatingViewport)
{
camera.YawDegrees += io.MouseDelta.X * MouseRotationSpeed;
camera.YawDegrees += -io.MouseDelta.X * MouseRotationSpeed;
camera.PitchDegrees += io.MouseDelta.Y * MouseRotationSpeed;
camera.PitchDegrees = Math.Clamp(camera.PitchDegrees, -89.0f, 89.0f);
}
if (_isPanningViewport)
camera.Pan(io.MouseDelta, imageSize);
if (viewportHovered && Math.Abs(io.MouseWheel) > float.Epsilon)
{
camera.Distance -= io.MouseWheel * MouseZoomSpeed;
camera.Distance = Math.Clamp(camera.Distance, 1.5f, 40.0f);
camera.Distance -= io.MouseWheel * MouseZoomSpeed * MathF.Max(1.0f, camera.Distance * 0.15f);
camera.Distance = Math.Clamp(camera.Distance, 0.25f, 400.0f);
}
if (viewportHovered && ImGui.IsMouseClicked(ImGuiMouseButton.Left))
@@ -49,5 +65,27 @@ public sealed class ViewportInputController
localMouse,
imageSize);
}
if (viewportFocused || viewportHovered)
HandleKeyboardShortcuts(scene, camera);
}
private static void HandleKeyboardShortcuts(ViewportScene scene, ViewportCamera camera)
{
if (ImGui.IsKeyPressed(ImGuiKey.F))
{
if (scene.TryGetSelectedPieceWorldBounds(out var selectedBounds))
camera.FrameBounds(selectedBounds.Min, selectedBounds.Max);
else if (scene.TryGetSceneWorldBounds(out var sceneBounds))
camera.FrameBounds(sceneBounds.Min, sceneBounds.Max);
}
if (ImGui.IsKeyPressed(ImGuiKey.Home))
{
if (scene.TryGetSceneWorldBounds(out var sceneBounds))
camera.FrameBounds(sceneBounds.Min, sceneBounds.Max);
else
camera.Reset();
}
}
}