diff options
author | Marcel Admiraal <madmiraal@users.noreply.github.com> | 2022-01-13 18:13:50 +0000 |
---|---|---|
committer | Marcel Admiraal <madmiraal@users.noreply.github.com> | 2022-01-13 18:51:34 +0000 |
commit | 5c3600b29fbc02e92a3ccbd86a9da46efd03bac2 (patch) | |
tree | cf66d4699e9b68482d09cb468f3858e96e588818 /core/input | |
parent | 2dee116ba7a2aafe303229c5f15abfd6674e56bf (diff) |
Fix mouse velocity not changing fast enough
- Uses all accumulated movements when calculating velocity
- Discards old accumulated movements
- Sets last mouse velocity to zero when there is no movement
Diffstat (limited to 'core/input')
-rw-r--r-- | core/input/input.cpp | 30 | ||||
-rw-r--r-- | core/input/input.h | 2 |
2 files changed, 19 insertions, 13 deletions
diff --git a/core/input/input.cpp b/core/input/input.cpp index 26df16792d..b543e273fe 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -189,32 +189,37 @@ void Input::VelocityTrack::update(const Vector2 &p_delta_p) { float delta_t = tdiff / 1000000.0; last_tick = tick; + if (delta_t > max_ref_frame) { + // First movement in a long time, reset and start again. + velocity = Vector2(); + accum = p_delta_p; + accum_t = 0; + return; + } + accum += p_delta_p; accum_t += delta_t; - if (accum_t > max_ref_frame * 10) { - accum_t = max_ref_frame * 10; + if (accum_t < min_ref_frame) { + // Not enough time has passed to calculate speed precisely. + return; } - while (accum_t >= min_ref_frame) { - float slice_t = min_ref_frame / accum_t; - Vector2 slice = accum * slice_t; - accum = accum - slice; - accum_t -= min_ref_frame; - - velocity = (slice / min_ref_frame).lerp(velocity, min_ref_frame / max_ref_frame); - } + velocity = accum / accum_t; + accum = Vector2(); + accum_t = 0; } void Input::VelocityTrack::reset() { last_tick = OS::get_singleton()->get_ticks_usec(); velocity = Vector2(); + accum = Vector2(); accum_t = 0; } Input::VelocityTrack::VelocityTrack() { min_ref_frame = 0.1; - max_ref_frame = 0.3; + max_ref_frame = 3.0; reset(); } @@ -704,7 +709,8 @@ Point2 Input::get_mouse_position() const { return mouse_pos; } -Point2 Input::get_last_mouse_velocity() const { +Point2 Input::get_last_mouse_velocity() { + mouse_velocity_track.update(Vector2()); return mouse_velocity_track.velocity; } diff --git a/core/input/input.h b/core/input/input.h index 8b1d7d6161..b661560b37 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -274,7 +274,7 @@ public: Vector3 get_gyroscope() const; Point2 get_mouse_position() const; - Vector2 get_last_mouse_velocity() const; + Vector2 get_last_mouse_velocity(); MouseButton get_mouse_button_mask() const; void warp_mouse_position(const Vector2 &p_to); |