1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-08 12:40:44 +00:00

Fix mouse speed not changing fast enough

- Uses all accumulated movements when calculating speed
- Discards old accumulated movements
- Sets last mouse speed to zero when there is no movement
This commit is contained in:
Marcel Admiraal
2022-01-13 18:00:25 +00:00
parent e00a6d2b71
commit 3d96d7d9fb
4 changed files with 22 additions and 16 deletions

View File

@@ -42,32 +42,37 @@ void InputDefault::SpeedTrack::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.
speed = 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;
speed = (slice / min_ref_frame).linear_interpolate(speed, min_ref_frame / max_ref_frame);
}
speed = accum / accum_t;
accum = Vector2();
accum_t = 0;
}
void InputDefault::SpeedTrack::reset() {
last_tick = OS::get_singleton()->get_ticks_usec();
speed = Vector2();
accum = Vector2();
accum_t = 0;
}
InputDefault::SpeedTrack::SpeedTrack() {
min_ref_frame = 0.1;
max_ref_frame = 0.3;
max_ref_frame = 3.0;
reset();
}
@@ -559,7 +564,8 @@ void InputDefault::set_mouse_position(const Point2 &p_posf) {
Point2 InputDefault::get_mouse_position() const {
return mouse_pos;
}
Point2 InputDefault::get_last_mouse_speed() const {
Point2 InputDefault::get_last_mouse_speed() {
mouse_speed_track.update(Vector2());
return mouse_speed_track.speed;
}