|
|
@ -4,17 +4,16 @@ |
|
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
|
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
|
#include <chrono>
|
|
|
#include <fmt/ranges.h>
|
|
|
#include <fmt/ranges.h>
|
|
|
#include <math.h>
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
|
#include "common/param_package.h"
|
|
|
#include "common/param_package.h"
|
|
|
#include "common/settings.h"
|
|
|
#include "common/settings.h"
|
|
|
#include "common/thread.h"
|
|
|
|
|
|
|
|
|
#include "common/steady_clock.h"
|
|
|
#include "input_common/drivers/mouse.h"
|
|
|
#include "input_common/drivers/mouse.h"
|
|
|
|
|
|
|
|
|
namespace InputCommon { |
|
|
namespace InputCommon { |
|
|
constexpr int update_time = 10; |
|
|
|
|
|
constexpr float default_panning_sensitivity = 0.0010f; |
|
|
constexpr float default_panning_sensitivity = 0.0010f; |
|
|
constexpr float default_stick_sensitivity = 0.0006f; |
|
|
constexpr float default_stick_sensitivity = 0.0006f; |
|
|
constexpr float default_deadzone_counterweight = 0.01f; |
|
|
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 = {}; |
|
|
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 = |
|
|
const float sensitivity = |
|
|
IsMousePanningEnabled() ? default_motion_panning_sensitivity : default_motion_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; |
|
|
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()) { |
|
|
if (IsMousePanningEnabled()) { |
|
|
last_motion_change[0] = 0; |
|
|
last_motion_change[0] = 0; |
|
|
last_motion_change[1] = 0; |
|
|
last_motion_change[1] = 0; |
|
|
} |
|
|
} |
|
|
last_motion_change[2] = 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) { |
|
|
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 /= length; |
|
|
last_mouse_change *= deadzone_cw; |
|
|
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() { |
|
|
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) { |
|
|
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[0] += x; |
|
|
wheel_position[1] += y; |
|
|
wheel_position[1] += y; |
|
|
last_motion_change[2] += static_cast<f32>(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() { |
|
|
void Mouse::ReleaseAllButtons() { |
|
|
|