mirror of
https://github.com/godotengine/godot.git
synced 2026-01-05 06:11:29 +03:00
Merge pull request #88343 from Riteo/warped-mouse-float
Handle warped mouse motion as floating point
This commit is contained in:
@@ -858,7 +858,7 @@ void Input::warp_mouse(const Vector2 &p_position) {
|
||||
warp_mouse_func(p_position);
|
||||
}
|
||||
|
||||
Point2i Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, const Rect2 &p_rect) {
|
||||
Point2 Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &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
|
||||
@@ -868,14 +868,14 @@ Point2i Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user