|
@@ -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;
|
|
|
}
|
|
|
|