aboutsummaryrefslogtreecommitdiff
path: root/src/input_common/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/drivers')
-rw-r--r--src/input_common/drivers/mouse.cpp107
-rw-r--r--src/input_common/drivers/mouse.h7
2 files changed, 55 insertions, 59 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() {
diff --git a/src/input_common/drivers/mouse.h b/src/input_common/drivers/mouse.h
index 25f75109b9..1f7cb7e966 100644
--- a/src/input_common/drivers/mouse.h
+++ b/src/input_common/drivers/mouse.h
@@ -7,7 +7,9 @@
#pragma once
#include <thread>
+#include <chrono>
+#include "common/steady_clock.h"
#include "common/polyfill_thread.h"
#include "common/vector_math.h"
#include "input_common/input_engine.h"
@@ -101,8 +103,8 @@ public:
Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override;
private:
- void UpdateStickInput();
- void UpdateMotionInput();
+ void UpdateStickInput(Common::SteadyClock::time_point timestamp);
+ void UpdateMotionInput(Common::SteadyClock::time_point timestamp);
bool IsMousePanningEnabled();
Common::Input::ButtonNames GetUIButtonName(const Common::ParamPackage& params) const;
@@ -112,6 +114,7 @@ private:
Common::Vec<float, 2> last_mouse_change;
Common::Vec<float, 3> last_motion_change;
Common::Vec<int, 2> wheel_position;
+ Common::SteadyClock::time_point last_notify_timestamp{};
bool button_pressed = false;
};