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
This commit is contained in:
parent
2dee116ba7
commit
5c3600b29f
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -141,10 +141,10 @@
|
||||
Returns the strength of the joypad vibration: x is the strength of the weak motor, and y is the strength of the strong motor.
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_last_mouse_velocity" qualifiers="const">
|
||||
<method name="get_last_mouse_velocity">
|
||||
<return type="Vector2" />
|
||||
<description>
|
||||
Returns the mouse velocity for the last time the cursor was moved, and this until the next frame where the mouse moves. This means that even if the mouse is not moving, this function will still return the value of the last motion.
|
||||
Returns the last mouse velocity. To provide a precise and jitter-free velocity, mouse velocity is only calculated every 0.1s. Therefore, mouse velocity will lag mouse movements.
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_magnetometer" qualifiers="const">
|
||||
|
Loading…
Reference in New Issue
Block a user