From 9692549c34ba015027f7efff4495005ce3f91769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Sun, 14 Oct 2018 17:55:03 +0200 Subject: [PATCH] Track screen drag speed Following the universal input handling effort, this works the same for every platform, as long as the touch move event coming from it contains the relative movement. The same tracking algorithm used to track the mouse speed is used here, but tracking separately each touch index. Fixes #3623. --- main/input_default.cpp | 35 ++++++++++++++++++++++++++++++----- main/input_default.h | 1 + 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/main/input_default.cpp b/main/input_default.cpp index 913c143025a..33c422190d1 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -261,6 +261,13 @@ void InputDefault::parse_input_event(const Ref &p_event) { void InputDefault::_parse_input_event_impl(const Ref &p_event, bool p_is_emulated) { + // Notes on mouse-touch emulation: + // - Emulated mouse events are parsed, that is, re-routed to this method, so they make the same effects + // as true mouse events. The only difference is the situation is flagged as emulated so they are not + // emulated back to touch events in an endless loop. + // - Emulated touch events are handed right to the main loop (i.e., the SceneTree) because they don't + // require additional handling by this class. + _THREAD_SAFE_METHOD_ Ref k = p_event; @@ -316,11 +323,21 @@ void InputDefault::_parse_input_event_impl(const Ref &p_event, bool } } - if (emulate_mouse_from_touch) { + Ref st = p_event; - Ref st = p_event; + if (st.is_valid()) { + + if (st->is_pressed()) { + SpeedTrack &track = touch_speed_track[st->get_index()]; + track.reset(); + } else { + // Since a pointer index may not occur again (OSs may or may not reuse them), + // imperatively remove it from the map to keep no fossil entries in it + touch_speed_track.erase(st->get_index()); + } + + if (emulate_mouse_from_touch) { - if (st.is_valid()) { bool translate = false; if (st->is_pressed()) { if (mouse_from_touch_index == -1) { @@ -351,10 +368,18 @@ void InputDefault::_parse_input_event_impl(const Ref &p_event, bool _parse_input_event_impl(button_event, true); } } + } - Ref sd = p_event; + Ref sd = p_event; + + if (sd.is_valid()) { + + SpeedTrack &track = touch_speed_track[sd->get_index()]; + track.update(sd->get_relative()); + sd->set_speed(track.speed); + + if (emulate_mouse_from_touch && sd->get_index() == mouse_from_touch_index) { - if (sd.is_valid() && sd->get_index() == mouse_from_touch_index) { Ref motion_event; motion_event.instance(); diff --git a/main/input_default.h b/main/input_default.h index b420ec124b4..4964b9a83c2 100644 --- a/main/input_default.h +++ b/main/input_default.h @@ -117,6 +117,7 @@ class InputDefault : public Input { }; SpeedTrack mouse_speed_track; + Map touch_speed_track; Map joy_names; int fallback_mapping;