From 759a32eb0c6f5aca26a9a12e8c7e74d7d0f532b2 Mon Sep 17 00:00:00 2001 From: Riteo Date: Wed, 14 Feb 2024 22:37:51 +0100 Subject: [PATCH] Handle warped mouse motion as floating point Fixes certain issues where sub-pixel motions would get discarded while the mouse is captured, such as when free look is enabled in the editor (at least when turned on while holding right click). Very slightly compat breaking, as actual public APIs are changed, although with "compatible" types (Point2i->Point2). --- core/input/input.cpp | 12 ++++++------ core/input/input.h | 2 +- editor/plugins/node_3d_editor_plugin.cpp | 4 ++-- editor/plugins/node_3d_editor_plugin.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/input/input.cpp b/core/input/input.cpp index d87a8824f73..b7ba1d44be3 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -855,7 +855,7 @@ void Input::warp_mouse(const Vector2 &p_position) { warp_mouse_func(p_position); } -Point2i Input::warp_mouse_motion(const Ref &p_motion, const Rect2 &p_rect) { +Point2 Input::warp_mouse_motion(const Ref &p_motion, const Rect2 &p_rect) { // The relative distance reported for the next event after a warp is in the boundaries of the // size of the rect on that axis, but it may be greater, in which case there's no problem as fmod() // will warp it, but if the pointer has moved in the opposite direction between the pointer relocation @@ -865,14 +865,14 @@ Point2i Input::warp_mouse_motion(const Ref &p_motion, con // detect the warp: if the relative distance is greater than the half of the size of the relevant rect // (checked per each axis), it will be considered as the consequence of a former pointer warp. - const Point2i rel_sign(p_motion->get_relative().x >= 0.0f ? 1 : -1, p_motion->get_relative().y >= 0.0 ? 1 : -1); - const Size2i warp_margin = p_rect.size * 0.5f; - const Point2i rel_warped( + const Point2 rel_sign(p_motion->get_relative().x >= 0.0f ? 1 : -1, p_motion->get_relative().y >= 0.0 ? 1 : -1); + const Size2 warp_margin = p_rect.size * 0.5f; + const Point2 rel_warped( Math::fmod(p_motion->get_relative().x + rel_sign.x * warp_margin.x, p_rect.size.x) - rel_sign.x * warp_margin.x, Math::fmod(p_motion->get_relative().y + rel_sign.y * warp_margin.y, p_rect.size.y) - rel_sign.y * warp_margin.y); - const Point2i pos_local = p_motion->get_global_position() - p_rect.position; - const Point2i pos_warped(Math::fposmod(pos_local.x, p_rect.size.x), Math::fposmod(pos_local.y, p_rect.size.y)); + const Point2 pos_local = p_motion->get_global_position() - p_rect.position; + const Point2 pos_warped(Math::fposmod(pos_local.x, p_rect.size.x), Math::fposmod(pos_local.y, p_rect.size.y)); if (pos_warped != pos_local) { warp_mouse(pos_warped + p_rect.position); } diff --git a/core/input/input.h b/core/input/input.h index a7ae3349b2d..2422be0512b 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -308,7 +308,7 @@ public: BitField get_mouse_button_mask() const; void warp_mouse(const Vector2 &p_position); - Point2i warp_mouse_motion(const Ref &p_motion, const Rect2 &p_rect); + Point2 warp_mouse_motion(const Ref &p_motion, const Rect2 &p_rect); void parse_input_event(const Ref &p_event); diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 89035ca6c19..ab4b46a61e3 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -2572,8 +2572,8 @@ void Node3DEditorViewport::scale_freelook_speed(real_t scale) { surface->queue_redraw(); } -Point2i Node3DEditorViewport::_get_warped_mouse_motion(const Ref &p_ev_mouse_motion) const { - Point2i relative; +Point2 Node3DEditorViewport::_get_warped_mouse_motion(const Ref &p_ev_mouse_motion) const { + Point2 relative; if (bool(EDITOR_GET("editors/3d/navigation/warped_mouse_panning"))) { relative = Input::get_singleton()->warp_mouse_motion(p_ev_mouse_motion, surface->get_global_rect()); } else { diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index ed42e8e5aba..52051277ef8 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -431,7 +431,7 @@ private: void _selection_result_pressed(int); void _selection_menu_hide(); void _list_select(Ref b); - Point2i _get_warped_mouse_motion(const Ref &p_ev_mouse_motion) const; + Point2 _get_warped_mouse_motion(const Ref &p_ev_mouse_motion) const; Vector3 _get_instance_position(const Point2 &p_pos) const; static AABB _calculate_spatial_bounds(const Node3D *p_parent, const Node3D *p_top_level_parent = nullptr);