aboutsummaryrefslogtreecommitdiff
path: root/src/input_common/drivers/mouse.cpp
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-09-14 03:26:22 +0200
committercrueter <crueter@eden-emu.dev>2026-09-14 03:26:22 +0200
commitd9159fefdd9e8850e550dd47cc59d7da999a2380 (patch)
tree42c94450eadbc5b67e87ee185d417b18f0118385 /src/input_common/drivers/mouse.cpp
parent099547b3f4578bf1fc0b39988aefbe2d54b540cc (diff)
[input] Fix mouse drift on Qt/SDL frontends (#4352)
Fixes regression from #4229 Mouse wasn't updated periodically to prevent "infinite drift". Timer for polling is now controlled by frontend directly, this should reduce latency considerably and wasted cycles spinwaiting, it also removes an extra thread which is always welcome. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4352 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Diffstat (limited to 'src/input_common/drivers/mouse.cpp')
-rw-r--r--src/input_common/drivers/mouse.cpp107
1 files changed, 50 insertions, 57 deletions
diff --git a/src/input_common/drivers/mouse.cpp b/src/input_common/drivers/mouse.cpp
index 4444f0ac3b..4ac259d03b 100644
--- a/src/input_common/drivers/mouse.cpp
+++ b/src/input_common/drivers/mouse.cpp
@@ -4,17 +4,16 @@
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include <thread>
+#include <chrono>
#include <fmt/ranges.h>
#include <math.h>
#include "common/param_package.h"
#include "common/settings.h"
-#include "common/thread.h"
+#include "common/steady_clock.h"
#include "input_common/drivers/mouse.h"
namespace InputCommon {
-constexpr int update_time = 10;
constexpr float default_panning_sensitivity = 0.0010f;
constexpr float default_stick_sensitivity = 0.0006f;
constexpr float default_deadzone_counterweight = 0.01f;
@@ -74,33 +73,31 @@ Mouse::Mouse(std::string input_engine_) : InputEngine(std::move(input_engine_))
last_motion_change = {};
}
-void Mouse::UpdateStickInput() {
- if (!IsMousePanningEnabled()) {
- return;
- }
-
- const float length = last_mouse_change.Length();
+void Mouse::UpdateStickInput(Common::SteadyClock::time_point timestamp) {
+ if (IsMousePanningEnabled()) {
+ const float length = last_mouse_change.Length();
- // Prevent input from exceeding the max range (1.0f) too much,
- // but allow some room to make it easier to sustain
- if (length > maximum_stick_range) {
- last_mouse_change /= length;
- last_mouse_change *= maximum_stick_range;
- }
+ // Prevent input from exceeding the max range (1.0f) too much,
+ // but allow some room to make it easier to sustain
+ if (length > maximum_stick_range) {
+ last_mouse_change /= length;
+ last_mouse_change *= maximum_stick_range;
+ }
- SetAxis(identifier, mouse_axis_x, last_mouse_change[0]);
- SetAxis(identifier, mouse_axis_y, -last_mouse_change[1]);
+ SetAxis(identifier, mouse_axis_x, last_mouse_change[0]);
+ SetAxis(identifier, mouse_axis_y, -last_mouse_change[1]);
- // Decay input over time
- const float clamped_length = (std::min)(1.0f, length);
- const float decay_strength = Settings::values.mouse_panning_decay_strength.GetValue();
- const float decay = 1 - clamped_length * clamped_length * decay_strength * 0.01f;
- const float min_decay = Settings::values.mouse_panning_min_decay.GetValue();
- const float clamped_decay = (std::min)(1 - min_decay / 100.0f, decay);
- last_mouse_change *= clamped_decay;
+ // Decay input over time
+ const float clamped_length = (std::min)(1.0f, length);
+ const float decay_strength = Settings::values.mouse_panning_decay_strength.GetValue();
+ const float decay = 1 - clamped_length * clamped_length * decay_strength * 0.01f;
+ const float min_decay = Settings::values.mouse_panning_min_decay.GetValue();
+ const float clamped_decay = (std::min)(1 - min_decay / 100.0f, decay);
+ last_mouse_change *= clamped_decay;
+ }
}
-void Mouse::UpdateMotionInput() {
+void Mouse::UpdateMotionInput(Common::SteadyClock::time_point timestamp) {
const float sensitivity =
IsMousePanningEnabled() ? default_motion_panning_sensitivity : default_motion_sensitivity;
@@ -114,23 +111,21 @@ void Mouse::UpdateMotionInput() {
last_motion_change[1] = last_motion_change[1] * multiplier;
}
- const BasicMotion motion_data{
- .gyro_x = last_motion_change[0] * sensitivity,
- .gyro_y = last_motion_change[1] * sensitivity,
- .gyro_z = last_motion_change[2] * sensitivity,
- .accel_x = 0,
- .accel_y = 0,
- .accel_z = 0,
- .delta_timestamp = update_time * 1000,
- };
-
if (IsMousePanningEnabled()) {
last_motion_change[0] = 0;
last_motion_change[1] = 0;
}
last_motion_change[2] = 0;
- SetMotion(motion_identifier, 0, motion_data);
+ SetMotion(motion_identifier, 0, BasicMotion{
+ .gyro_x = last_motion_change[0] * sensitivity,
+ .gyro_y = last_motion_change[1] * sensitivity,
+ .gyro_z = last_motion_change[2] * sensitivity,
+ .accel_x = 0,
+ .accel_y = 0,
+ .accel_z = 0,
+ .delta_timestamp = u64(std::chrono::duration_cast<std::chrono::microseconds>(timestamp - last_notify_timestamp).count()),
+ });
}
void Mouse::Move(int x, int y, int center_x, int center_y) {
@@ -149,29 +144,27 @@ void Mouse::Move(int x, int y, int center_x, int center_y) {
last_mouse_change /= length;
last_mouse_change *= deadzone_cw;
}
- return;
- }
-
- if (button_pressed) {
- const auto mouse_move = Common::Vec<int, 2>(x, y) - mouse_origin;
- const float x_sensitivity =
- Settings::values.mouse_panning_x_sensitivity.GetValue() * default_stick_sensitivity;
- const float y_sensitivity =
- Settings::values.mouse_panning_y_sensitivity.GetValue() * default_stick_sensitivity;
- SetAxis(identifier, mouse_axis_x, float(mouse_move[0]) * x_sensitivity);
- SetAxis(identifier, mouse_axis_y, float(-mouse_move[1]) * y_sensitivity);
-
- last_motion_change = {
- float(-mouse_move[1]) * x_sensitivity,
- float(-mouse_move[0]) * y_sensitivity,
- last_motion_change[2],
- };
+ } else {
+ if (button_pressed) {
+ const auto mouse_move = Common::Vec<int, 2>(x, y) - mouse_origin;
+ const float x_sensitivity = Settings::values.mouse_panning_x_sensitivity.GetValue() * default_stick_sensitivity;
+ const float y_sensitivity = Settings::values.mouse_panning_y_sensitivity.GetValue() * default_stick_sensitivity;
+ SetAxis(identifier, mouse_axis_x, float(mouse_move[0]) * x_sensitivity);
+ SetAxis(identifier, mouse_axis_y, float(-mouse_move[1]) * y_sensitivity);
+ last_motion_change = {
+ float(-mouse_move[1]) * x_sensitivity,
+ float(-mouse_move[0]) * y_sensitivity,
+ last_motion_change[2],
+ };
+ }
}
}
void Mouse::NotifyChanged() {
- UpdateStickInput();
- UpdateMotionInput();
+ auto const timestamp = Common::SteadyClock::Now();
+ UpdateStickInput(timestamp);
+ UpdateMotionInput(timestamp);
+ last_notify_timestamp = timestamp;
}
void Mouse::MouseMove(f32 touch_x, f32 touch_y) {
@@ -223,8 +216,8 @@ void Mouse::MouseWheelChange(int x, int y) {
wheel_position[0] += x;
wheel_position[1] += y;
last_motion_change[2] += static_cast<f32>(y);
- SetAxis(identifier, wheel_axis_x, static_cast<f32>(wheel_position[0]));
- SetAxis(identifier, wheel_axis_y, static_cast<f32>(wheel_position[1]));
+ SetAxis(identifier, wheel_axis_x, f32(wheel_position[0]));
+ SetAxis(identifier, wheel_axis_y, f32(wheel_position[1]));
}
void Mouse::ReleaseAllButtons() {