Implement analog stick range modifier (#2783)
* adjust position vector + GUI * remove brackets * Update configuration * Update ConfigurationFileFormat.cs * rebase + review changes * spacing * revert deletion * fix profile loading * spacing * comment spacing
This commit is contained in:
parent
16c649934f
commit
686757105c
7 changed files with 160 additions and 5 deletions
|
@ -24,6 +24,16 @@ namespace Ryujinx.Common.Configuration.Hid.Controller
|
|||
/// </summary>
|
||||
public float DeadzoneRight { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controller Left Analog Stick Range
|
||||
/// </summary>
|
||||
public float RangeLeft { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controller Right Analog Stick Range
|
||||
/// </summary>
|
||||
public float RangeRight { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controller Trigger Threshold
|
||||
/// </summary>
|
||||
|
|
|
@ -196,6 +196,8 @@ namespace Ryujinx.Headless.SDL2
|
|||
ControllerType = ControllerType.JoyconPair,
|
||||
DeadzoneLeft = 0.1f,
|
||||
DeadzoneRight = 0.1f,
|
||||
RangeLeft = 1.0f,
|
||||
RangeRight = 1.0f,
|
||||
TriggerThreshold = 0.5f,
|
||||
LeftJoycon = new LeftJoyconCommonConfig<ConfigGamepadInputId>
|
||||
{
|
||||
|
@ -299,6 +301,18 @@ namespace Ryujinx.Headless.SDL2
|
|||
|
||||
Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} configured with {inputTypeName} \"{config.Id}\"");
|
||||
|
||||
// If both stick ranges are 0 (usually indicative of an outdated profile load) then both sticks will be set to 1.0.
|
||||
if (config is StandardControllerInputConfig controllerConfig)
|
||||
{
|
||||
if (controllerConfig.RangeLeft <= 0.0f && controllerConfig.RangeRight <= 0.0f)
|
||||
{
|
||||
controllerConfig.RangeLeft = 1.0f;
|
||||
controllerConfig.RangeRight = 1.0f;
|
||||
|
||||
Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} stick range reset. Save the profile now to update your configuration");
|
||||
}
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
|
|
|
@ -381,8 +381,8 @@ namespace Ryujinx.Input.HLE
|
|||
(float leftAxisX, float leftAxisY) = State.GetStick(StickInputId.Left);
|
||||
(float rightAxisX, float rightAxisY) = State.GetStick(StickInputId.Right);
|
||||
|
||||
state.LStick = ClampToCircle(ApplyDeadzone(leftAxisX, leftAxisY, controllerConfig.DeadzoneLeft));
|
||||
state.RStick = ClampToCircle(ApplyDeadzone(rightAxisX, rightAxisY, controllerConfig.DeadzoneRight));
|
||||
state.LStick = ClampToCircle(ApplyDeadzone(leftAxisX, leftAxisY, controllerConfig.DeadzoneLeft), controllerConfig.RangeLeft);
|
||||
state.RStick = ClampToCircle(ApplyDeadzone(rightAxisX, rightAxisY, controllerConfig.DeadzoneRight), controllerConfig.RangeRight);
|
||||
}
|
||||
|
||||
return state;
|
||||
|
@ -412,9 +412,9 @@ namespace Ryujinx.Input.HLE
|
|||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static JoystickPosition ClampToCircle(JoystickPosition position)
|
||||
private static JoystickPosition ClampToCircle(JoystickPosition position, float range)
|
||||
{
|
||||
Vector2 point = new Vector2(position.Dx, position.Dy);
|
||||
Vector2 point = new Vector2(position.Dx, position.Dy) * range;
|
||||
|
||||
if (point.Length() > short.MaxValue)
|
||||
{
|
||||
|
|
|
@ -14,7 +14,7 @@ namespace Ryujinx.Configuration
|
|||
/// <summary>
|
||||
/// The current version of the file format
|
||||
/// </summary>
|
||||
public const int CurrentVersion = 34;
|
||||
public const int CurrentVersion = 35;
|
||||
|
||||
/// <summary>
|
||||
/// Version of the configuration file format
|
||||
|
|
|
@ -975,6 +975,22 @@ namespace Ryujinx.Configuration
|
|||
configurationFileUpdated = true;
|
||||
}
|
||||
|
||||
if (configurationFileFormat.Version < 35)
|
||||
{
|
||||
Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 35.");
|
||||
|
||||
foreach (InputConfig config in configurationFileFormat.InputConfig)
|
||||
{
|
||||
if (config is StandardControllerInputConfig controllerConfig)
|
||||
{
|
||||
controllerConfig.RangeLeft = 1.0f;
|
||||
controllerConfig.RangeRight = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
configurationFileUpdated = true;
|
||||
}
|
||||
|
||||
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
||||
Graphics.BackendThreading.Value = configurationFileFormat.BackendThreading;
|
||||
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
||||
|
|
|
@ -38,6 +38,8 @@ namespace Ryujinx.Ui.Windows
|
|||
[GUI] Adjustment _controllerWeakRumble;
|
||||
[GUI] Adjustment _controllerDeadzoneLeft;
|
||||
[GUI] Adjustment _controllerDeadzoneRight;
|
||||
[GUI] Adjustment _controllerRangeLeft;
|
||||
[GUI] Adjustment _controllerRangeRight;
|
||||
[GUI] Adjustment _controllerTriggerThreshold;
|
||||
[GUI] Adjustment _slotNumber;
|
||||
[GUI] Adjustment _altSlotNumber;
|
||||
|
@ -59,9 +61,11 @@ namespace Ryujinx.Ui.Windows
|
|||
[GUI] Grid _leftStickKeyboard;
|
||||
[GUI] Grid _leftStickController;
|
||||
[GUI] Box _deadZoneLeftBox;
|
||||
[GUI] Box _rangeLeftBox;
|
||||
[GUI] Grid _rightStickKeyboard;
|
||||
[GUI] Grid _rightStickController;
|
||||
[GUI] Box _deadZoneRightBox;
|
||||
[GUI] Box _rangeRightBox;
|
||||
[GUI] Grid _leftSideTriggerBox;
|
||||
[GUI] Grid _rightSideTriggerBox;
|
||||
[GUI] Box _triggerThresholdBox;
|
||||
|
@ -316,6 +320,8 @@ namespace Ryujinx.Ui.Windows
|
|||
_rightStickController.Hide();
|
||||
_deadZoneLeftBox.Hide();
|
||||
_deadZoneRightBox.Hide();
|
||||
_rangeLeftBox.Hide();
|
||||
_rangeRightBox.Hide();
|
||||
_triggerThresholdBox.Hide();
|
||||
_motionBox.Hide();
|
||||
_rumbleBox.Hide();
|
||||
|
@ -416,6 +422,8 @@ namespace Ryujinx.Ui.Windows
|
|||
_controllerWeakRumble.Value = 1;
|
||||
_controllerDeadzoneLeft.Value = 0;
|
||||
_controllerDeadzoneRight.Value = 0;
|
||||
_controllerRangeLeft.Value = 1;
|
||||
_controllerRangeRight.Value = 1;
|
||||
_controllerTriggerThreshold.Value = 0;
|
||||
_mirrorInput.Active = false;
|
||||
_enableMotion.Active = false;
|
||||
|
@ -510,12 +518,23 @@ namespace Ryujinx.Ui.Windows
|
|||
_enableRumble.Active = controllerConfig.Rumble.EnableRumble;
|
||||
_controllerDeadzoneLeft.Value = controllerConfig.DeadzoneLeft;
|
||||
_controllerDeadzoneRight.Value = controllerConfig.DeadzoneRight;
|
||||
_controllerRangeLeft.Value = controllerConfig.RangeLeft;
|
||||
_controllerRangeRight.Value = controllerConfig.RangeRight;
|
||||
_controllerTriggerThreshold.Value = controllerConfig.TriggerThreshold;
|
||||
_sensitivity.Value = controllerConfig.Motion.Sensitivity;
|
||||
_gyroDeadzone.Value = controllerConfig.Motion.GyroDeadzone;
|
||||
_enableMotion.Active = controllerConfig.Motion.EnableMotion;
|
||||
_enableCemuHook.Active = controllerConfig.Motion.MotionBackend == MotionInputBackendType.CemuHook;
|
||||
|
||||
// If both stick ranges are 0 (usually indicative of an outdated profile load) then both sticks will be set to 1.0.
|
||||
if (_controllerRangeLeft.Value <= 0.0 && _controllerRangeRight.Value <= 0.0)
|
||||
{
|
||||
_controllerRangeLeft.Value = 1.0;
|
||||
_controllerRangeRight.Value = 1.0;
|
||||
|
||||
Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} stick range reset. Save the profile now to update your configuration");
|
||||
}
|
||||
|
||||
if (controllerConfig.Motion is CemuHookMotionConfigController cemuHookMotionConfig)
|
||||
{
|
||||
_slotNumber.Value = cemuHookMotionConfig.Slot;
|
||||
|
@ -678,6 +697,8 @@ namespace Ryujinx.Ui.Windows
|
|||
PlayerIndex = _playerIndex,
|
||||
DeadzoneLeft = (float)_controllerDeadzoneLeft.Value,
|
||||
DeadzoneRight = (float)_controllerDeadzoneRight.Value,
|
||||
RangeLeft = (float)_controllerRangeLeft.Value,
|
||||
RangeRight = (float)_controllerRangeRight.Value,
|
||||
TriggerThreshold = (float)_controllerTriggerThreshold.Value,
|
||||
LeftJoycon = new LeftJoyconCommonConfig<ConfigGamepadInputId>
|
||||
{
|
||||
|
@ -1013,6 +1034,8 @@ namespace Ryujinx.Ui.Windows
|
|||
ControllerType = ControllerType.JoyconPair,
|
||||
DeadzoneLeft = 0.1f,
|
||||
DeadzoneRight = 0.1f,
|
||||
RangeLeft = 1.0f,
|
||||
RangeRight = 1.0f,
|
||||
TriggerThreshold = 0.5f,
|
||||
LeftJoycon = new LeftJoyconCommonConfig<ConfigGamepadInputId>
|
||||
{
|
||||
|
|
|
@ -33,6 +33,18 @@
|
|||
<property name="step_increment">0.01</property>
|
||||
<property name="page_increment">0.10000000000000001</property>
|
||||
</object>
|
||||
<object class="GtkAdjustment" id="_controllerRangeLeft">
|
||||
<property name="upper">2</property>
|
||||
<property name="value">1.000000000000000003</property>
|
||||
<property name="step_increment">0.01</property>
|
||||
<property name="page_increment">0.10000000000000001</property>
|
||||
</object>
|
||||
<object class="GtkAdjustment" id="_controllerRangeRight">
|
||||
<property name="upper">2</property>
|
||||
<property name="value">1.000000000000000003</property>
|
||||
<property name="step_increment">0.01</property>
|
||||
<property name="page_increment">0.10000000000000001</property>
|
||||
</object>
|
||||
<object class="GtkAdjustment" id="_controllerTriggerThreshold">
|
||||
<property name="upper">1</property>
|
||||
<property name="value">0.5</property>
|
||||
|
@ -775,6 +787,46 @@
|
|||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="_rangeLeftBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_top">10</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="label" translatable="yes">Range Left</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScale">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="adjustment">_controllerRangeLeft</property>
|
||||
<property name="round_digits">2</property>
|
||||
<property name="digits">2</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
|
@ -1692,6 +1744,46 @@
|
|||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="_rangeRightBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_top">10</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="label" translatable="yes">Range Right</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScale">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="adjustment">_controllerRangeRight</property>
|
||||
<property name="round_digits">2</property>
|
||||
<property name="digits">2</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
|
|
Loading…
Reference in a new issue