input_common/mouse_input: Add mouse-as-joystick option
This commit is contained in:
@@ -519,6 +519,9 @@ struct Values {
|
|||||||
|
|
||||||
BasicSetting<bool> mouse_panning{false, "mouse_panning"};
|
BasicSetting<bool> mouse_panning{false, "mouse_panning"};
|
||||||
BasicRangedSetting<u8> mouse_panning_sensitivity{10, 1, 100, "mouse_panning_sensitivity"};
|
BasicRangedSetting<u8> mouse_panning_sensitivity{10, 1, 100, "mouse_panning_sensitivity"};
|
||||||
|
BasicSetting<bool> mouse_as_joystick{false, "mouse_as_joystick"};
|
||||||
|
BasicRangedSetting<u16> max_mouse_movement{500, 0, 65535, "max_mouse_movement"};
|
||||||
|
BasicRangedSetting<u8> mouse_as_joystick_deadzone{20, 1, 100, "mouse_as_joystick_deadzone"};
|
||||||
BasicSetting<bool> mouse_enabled{false, "mouse_enabled"};
|
BasicSetting<bool> mouse_enabled{false, "mouse_enabled"};
|
||||||
std::string mouse_device;
|
std::string mouse_device;
|
||||||
MouseButtonsRaw mouse_buttons;
|
MouseButtonsRaw mouse_buttons;
|
||||||
|
|||||||
@@ -32,6 +32,30 @@ void Mouse::UpdateThread(std::stop_token stop_token) {
|
|||||||
info.tilt_speed = 0;
|
info.tilt_speed = 0;
|
||||||
info.data.motion = info.motion.GetMotion();
|
info.data.motion = info.motion.GetMotion();
|
||||||
if (Settings::values.mouse_panning) {
|
if (Settings::values.mouse_panning) {
|
||||||
|
if (Settings::values.mouse_as_joystick) {
|
||||||
|
float axis_x = 0.0f;
|
||||||
|
float axis_y = 0.0f;
|
||||||
|
float max_mouse_movement =
|
||||||
|
static_cast<float>(Settings::values.max_mouse_movement.GetValue());
|
||||||
|
float deadzone = Settings::values.mouse_as_joystick_deadzone.GetValue() /
|
||||||
|
100.0f * max_mouse_movement;
|
||||||
|
if (fabs(info.last_mouse_change.x) > deadzone) {
|
||||||
|
axis_x = info.last_mouse_change.x -
|
||||||
|
(info.last_mouse_change.x > 0 ? deadzone : -deadzone);
|
||||||
|
axis_x /= max_mouse_movement;
|
||||||
|
axis_x *= 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fabs(info.last_mouse_change.y) > deadzone) {
|
||||||
|
axis_y = info.last_mouse_change.y -
|
||||||
|
(info.last_mouse_change.y > 0 ? deadzone : -deadzone);
|
||||||
|
axis_y /= max_mouse_movement;
|
||||||
|
axis_y *= 8;
|
||||||
|
}
|
||||||
|
info.data.axis = {static_cast<int>(16 * axis_x),
|
||||||
|
static_cast<int>(16 * -axis_y)};
|
||||||
|
continue;
|
||||||
|
}
|
||||||
info.last_mouse_change *= 0.96f;
|
info.last_mouse_change *= 0.96f;
|
||||||
info.data.axis = {static_cast<int>(16 * info.last_mouse_change.x),
|
info.data.axis = {static_cast<int>(16 * info.last_mouse_change.x),
|
||||||
static_cast<int>(16 * -info.last_mouse_change.y)};
|
static_cast<int>(16 * -info.last_mouse_change.y)};
|
||||||
@@ -40,8 +64,10 @@ void Mouse::UpdateThread(std::stop_token stop_token) {
|
|||||||
if (configuring) {
|
if (configuring) {
|
||||||
UpdateYuzuSettings();
|
UpdateYuzuSettings();
|
||||||
}
|
}
|
||||||
if (mouse_panning_timout++ > 20) {
|
if (!Settings::values.mouse_as_joystick) {
|
||||||
StopPanning();
|
if (mouse_panning_timout++ > 20) {
|
||||||
|
StopPanning();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(update_time));
|
std::this_thread::sleep_for(std::chrono::milliseconds(update_time));
|
||||||
}
|
}
|
||||||
@@ -92,6 +118,19 @@ void Mouse::MouseMove(int x, int y, int center_x, int center_y) {
|
|||||||
if (mouse_change.y == 0 && mouse_change.x == 0) {
|
if (mouse_change.y == 0 && mouse_change.x == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (Settings::values.mouse_as_joystick) {
|
||||||
|
info.last_mouse_change += mouse_change;
|
||||||
|
|
||||||
|
float max_movement =
|
||||||
|
static_cast<float>(Settings::values.max_mouse_movement.GetValue());
|
||||||
|
info.last_mouse_change = {
|
||||||
|
std::clamp(info.last_mouse_change.x, -max_movement, max_movement),
|
||||||
|
std::clamp(info.last_mouse_change.y, -max_movement, max_movement)};
|
||||||
|
|
||||||
|
info.tilt_direction = info.last_mouse_change;
|
||||||
|
info.tilt_speed = info.tilt_direction.Normalize() * info.sensitivity;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const auto mouse_change_length = mouse_change.Length();
|
const auto mouse_change_length = mouse_change.Length();
|
||||||
if (mouse_change_length < 3.0f) {
|
if (mouse_change_length < 3.0f) {
|
||||||
mouse_change /= mouse_change_length / 3.0f;
|
mouse_change /= mouse_change_length / 3.0f;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <stop_token>
|
#include <stop_token>
|
||||||
|
|||||||
@@ -570,6 +570,9 @@ void Config::ReadControlValues() {
|
|||||||
ReadBasicSetting(Settings::values.emulate_analog_keyboard);
|
ReadBasicSetting(Settings::values.emulate_analog_keyboard);
|
||||||
Settings::values.mouse_panning = false;
|
Settings::values.mouse_panning = false;
|
||||||
ReadBasicSetting(Settings::values.mouse_panning_sensitivity);
|
ReadBasicSetting(Settings::values.mouse_panning_sensitivity);
|
||||||
|
ReadBasicSetting(Settings::values.mouse_as_joystick);
|
||||||
|
ReadBasicSetting(Settings::values.max_mouse_movement);
|
||||||
|
ReadBasicSetting(Settings::values.mouse_as_joystick_deadzone);
|
||||||
|
|
||||||
ReadBasicSetting(Settings::values.tas_enable);
|
ReadBasicSetting(Settings::values.tas_enable);
|
||||||
ReadBasicSetting(Settings::values.tas_loop);
|
ReadBasicSetting(Settings::values.tas_loop);
|
||||||
@@ -1204,6 +1207,9 @@ void Config::SaveControlValues() {
|
|||||||
WriteBasicSetting(Settings::values.keyboard_enabled);
|
WriteBasicSetting(Settings::values.keyboard_enabled);
|
||||||
WriteBasicSetting(Settings::values.emulate_analog_keyboard);
|
WriteBasicSetting(Settings::values.emulate_analog_keyboard);
|
||||||
WriteBasicSetting(Settings::values.mouse_panning_sensitivity);
|
WriteBasicSetting(Settings::values.mouse_panning_sensitivity);
|
||||||
|
WriteBasicSetting(Settings::values.mouse_as_joystick);
|
||||||
|
WriteBasicSetting(Settings::values.max_mouse_movement);
|
||||||
|
WriteBasicSetting(Settings::values.mouse_as_joystick_deadzone);
|
||||||
|
|
||||||
WriteBasicSetting(Settings::values.tas_enable);
|
WriteBasicSetting(Settings::values.tas_enable);
|
||||||
WriteBasicSetting(Settings::values.tas_loop);
|
WriteBasicSetting(Settings::values.tas_loop);
|
||||||
|
|||||||
@@ -129,6 +129,10 @@ void ConfigureInputAdvanced::ApplyConfiguration() {
|
|||||||
Settings::values.mouse_panning = ui->mouse_panning->isChecked();
|
Settings::values.mouse_panning = ui->mouse_panning->isChecked();
|
||||||
Settings::values.mouse_panning_sensitivity =
|
Settings::values.mouse_panning_sensitivity =
|
||||||
static_cast<float>(ui->mouse_panning_sensitivity->value());
|
static_cast<float>(ui->mouse_panning_sensitivity->value());
|
||||||
|
Settings::values.mouse_as_joystick = ui->mouse_as_joystick->isChecked();
|
||||||
|
Settings::values.max_mouse_movement = static_cast<float>(ui->max_mouse_movement->value());
|
||||||
|
Settings::values.mouse_as_joystick_deadzone =
|
||||||
|
static_cast<float>(ui->mouse_as_joystick_deadzone->value());
|
||||||
Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked();
|
Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked();
|
||||||
Settings::values.enable_raw_input = ui->enable_raw_input->isChecked();
|
Settings::values.enable_raw_input = ui->enable_raw_input->isChecked();
|
||||||
}
|
}
|
||||||
@@ -159,6 +163,10 @@ void ConfigureInputAdvanced::LoadConfiguration() {
|
|||||||
ui->emulate_analog_keyboard->setChecked(Settings::values.emulate_analog_keyboard.GetValue());
|
ui->emulate_analog_keyboard->setChecked(Settings::values.emulate_analog_keyboard.GetValue());
|
||||||
ui->mouse_panning->setChecked(Settings::values.mouse_panning.GetValue());
|
ui->mouse_panning->setChecked(Settings::values.mouse_panning.GetValue());
|
||||||
ui->mouse_panning_sensitivity->setValue(Settings::values.mouse_panning_sensitivity.GetValue());
|
ui->mouse_panning_sensitivity->setValue(Settings::values.mouse_panning_sensitivity.GetValue());
|
||||||
|
ui->mouse_as_joystick->setChecked(Settings::values.mouse_as_joystick.GetValue());
|
||||||
|
ui->max_mouse_movement->setValue(Settings::values.max_mouse_movement.GetValue());
|
||||||
|
ui->mouse_as_joystick_deadzone->setValue(
|
||||||
|
Settings::values.mouse_as_joystick_deadzone.GetValue());
|
||||||
ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled);
|
ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled);
|
||||||
ui->enable_raw_input->setChecked(Settings::values.enable_raw_input.GetValue());
|
ui->enable_raw_input->setChecked(Settings::values.enable_raw_input.GetValue());
|
||||||
|
|
||||||
|
|||||||
@@ -2688,6 +2688,63 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="10" column="0">
|
||||||
|
<widget class="QCheckBox" name="mouse_as_joystick">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>23</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable mouse-as-joystick (requires mouse panning)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="1">
|
||||||
|
<widget class="QSpinBox" name="max_mouse_movement">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Max mouse movement</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string>M</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>65536</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>500</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="2">
|
||||||
|
<widget class="QSpinBox" name="mouse_as_joystick_deadzone">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Mouse joystick deadzone</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string>%</string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>20</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -122,6 +122,18 @@ mouse_panning =
|
|||||||
# Default: 1.0
|
# Default: 1.0
|
||||||
mouse_panning_sensitivity =
|
mouse_panning_sensitivity =
|
||||||
|
|
||||||
|
# Mouse-controlled axis moves like a joystick (requires mouse_panning)
|
||||||
|
# 0 (default): Off, 1: On
|
||||||
|
mouse_as_joystick =
|
||||||
|
|
||||||
|
# Maximum surface area mouse-as-joystick can move
|
||||||
|
# Default: 500.0
|
||||||
|
max_mouse_movement =
|
||||||
|
|
||||||
|
# Size of mouse center area where controlled axis is set to 0
|
||||||
|
# Default: 0.2
|
||||||
|
mouse_as_joystick_deadzone =
|
||||||
|
|
||||||
# Emulate an analog control stick from keyboard inputs.
|
# Emulate an analog control stick from keyboard inputs.
|
||||||
# 0 (default): Disabled, 1: Enabled
|
# 0 (default): Disabled, 1: Enabled
|
||||||
emulate_analog_keyboard =
|
emulate_analog_keyboard =
|
||||||
|
|||||||
Reference in New Issue
Block a user