diff options
Diffstat (limited to 'src/input_common/drivers/mouse.cpp')
| -rw-r--r-- | src/input_common/drivers/mouse.cpp | 107 |
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() { |
