summaryrefslogtreecommitdiff
path: root/core/input
diff options
context:
space:
mode:
authorMarcel Admiraal <madmiraal@users.noreply.github.com>2022-01-13 18:13:50 +0000
committerMarcel Admiraal <madmiraal@users.noreply.github.com>2022-01-13 18:51:34 +0000
commit5c3600b29fbc02e92a3ccbd86a9da46efd03bac2 (patch)
treecf66d4699e9b68482d09cb468f3858e96e588818 /core/input
parent2dee116ba7a2aafe303229c5f15abfd6674e56bf (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.cpp30
-rw-r--r--core/input/input.h2
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);