Skip to content

Commit

Permalink
fix: correct mouse coordinates in stretch mode
Browse files Browse the repository at this point in the history
Added a method to transform mouse coordinates for games using
fullscreen stretch mode, updated mouse driver extensions to transform
coordinates when constructing InputEvents. Fixes mouse clicks not
being correctly delivered in fullscreen stretch mode.
  • Loading branch information
wlsnmrk committed Jul 1, 2024
1 parent a2efb65 commit 8fd1aea
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions GodotTestDriver/Input/MouseInputExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,13 @@ public static void ClickMouseAt(this Viewport viewport, Vector2 position, MouseB
public static void MoveMouseTo(this Viewport viewport, Vector2 position)
{
var oldPosition = viewport.GetMousePosition();
var stretchedPosition = viewport.StretchedPosition(position);

viewport.WarpMouse(position);
var inputEvent = new InputEventMouseMotion
{
GlobalPosition = position,
Position = position,
GlobalPosition = stretchedPosition,
Position = stretchedPosition,
Relative = position - oldPosition
};
Input.ParseInputEvent(inputEvent);
Expand Down Expand Up @@ -88,12 +90,14 @@ public static void ReleaseMouse(this Viewport _, MouseButton button = MouseButto
private static void PressMouseAt(this Viewport viewport, Vector2 position, MouseButton button = MouseButton.Left)
{
viewport.MoveMouseTo(position);
var stretchedPosition = viewport.StretchedPosition(position);

var action = new InputEventMouseButton
{
ButtonIndex = button,
Pressed = true,
Position = position
Position = stretchedPosition,
GlobalPosition = stretchedPosition
};
Input.ParseInputEvent(action);
Input.FlushBufferedEvents();
Expand All @@ -102,14 +106,24 @@ private static void PressMouseAt(this Viewport viewport, Vector2 position, Mouse
private static void ReleaseMouseAt(this Viewport viewport, Vector2 position, MouseButton button = MouseButton.Left)
{
viewport.MoveMouseTo(position);
var stretchedPosition = viewport.StretchedPosition(position);

var action = new InputEventMouseButton
{
ButtonIndex = button,
Pressed = false,
Position = position
Position = stretchedPosition,
GlobalPosition = stretchedPosition
};
Input.ParseInputEvent(action);
Input.FlushBufferedEvents();
}

// Correct for viewport's stretch transform
// see https://docs.godotengine.org/en/stable/tutorials/2d/2d_transforms.html#stretch-transform
private static Vector2 StretchedPosition(this Viewport viewport, Vector2 position)
{
var screenTransform = viewport.GetFinalTransform();
return screenTransform.BasisXform(position) + screenTransform.Origin;
}
}

0 comments on commit 8fd1aea

Please sign in to comment.