diff --git a/src/Ryujinx.Input/HLE/NpadController.cs b/src/Ryujinx.Input/HLE/NpadController.cs
index 53426f71a..ca672bdc5 100644
--- a/src/Ryujinx.Input/HLE/NpadController.cs
+++ b/src/Ryujinx.Input/HLE/NpadController.cs
@@ -392,6 +392,11 @@ namespace Ryujinx.Input.HLE
return state;
}
+
+ public static JoystickPosition GetJoystickPosition(float x, float y, float deadzone, float range)
+ {
+ return ClampToCircle(ApplyDeadzone(x, y,deadzone), range);
+ }
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static JoystickPosition ApplyDeadzone(float x, float y, float deadzone)
diff --git a/src/Ryujinx/Assets/Icons/Controller_JoyConLeft_Settings.svg b/src/Ryujinx/Assets/Icons/Controller_JoyConLeft_Settings.svg
new file mode 100644
index 000000000..03585e656
--- /dev/null
+++ b/src/Ryujinx/Assets/Icons/Controller_JoyConLeft_Settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Ryujinx/Assets/Icons/Controller_JoyConRight_Settings.svg b/src/Ryujinx/Assets/Icons/Controller_JoyConRight_Settings.svg
new file mode 100644
index 000000000..f4f125148
--- /dev/null
+++ b/src/Ryujinx/Assets/Icons/Controller_JoyConRight_Settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj
index ab9a3696d..69bc1019b 100644
--- a/src/Ryujinx/Ryujinx.csproj
+++ b/src/Ryujinx/Ryujinx.csproj
@@ -132,6 +132,8 @@
+
+
@@ -153,6 +155,8 @@
+
+
diff --git a/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs
index 6ee79a371..cf99241fe 100644
--- a/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs
@@ -7,6 +7,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public class ControllerInputViewModel : BaseModel
{
private GamepadInputConfig _config;
+
public GamepadInputConfig Config
{
get => _config;
@@ -18,6 +19,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
}
private bool _isLeft;
+
public bool IsLeft
{
get => _isLeft;
@@ -30,6 +32,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
}
private bool _isRight;
+
public bool IsRight
{
get => _isRight;
@@ -44,6 +47,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public bool HasSides => IsLeft ^ IsRight;
private SvgImage _image;
+
public SvgImage Image
{
get => _image;
@@ -55,6 +59,30 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
}
public readonly InputViewModel ParentModel;
+
+ private string _leftStickPosition;
+
+ public string LeftStickPosition
+ {
+ get => _leftStickPosition;
+ set
+ {
+ _leftStickPosition = value;
+ OnPropertyChanged();
+ }
+ }
+
+ private string _rightStickPosition;
+
+ public string RightStickPosition
+ {
+ get => _rightStickPosition;
+ set
+ {
+ _rightStickPosition = value;
+ OnPropertyChanged();
+ }
+ }
public ControllerInputViewModel(InputViewModel model, GamepadInputConfig config)
{
diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs
index 16f8e46fa..4c34be435 100644
--- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs
@@ -37,8 +37,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
private const string Disabled = "disabled";
private const string ProControllerResource = "Ryujinx/Assets/Icons/Controller_ProCon.svg";
private const string JoyConPairResource = "Ryujinx/Assets/Icons/Controller_JoyConPair.svg";
- private const string JoyConLeftResource = "Ryujinx/Assets/Icons/Controller_JoyConLeft.svg";
- private const string JoyConRightResource = "Ryujinx/Assets/Icons/Controller_JoyConRight.svg";
+ private const string JoyConLeftResource = "Ryujinx/Assets/Icons/Controller_JoyConLeft_Settings.svg";
+ private const string JoyConRightResource = "Ryujinx/Assets/Icons/Controller_JoyConRight_Settings.svg";
private const string KeyboardString = "keyboard";
private const string ControllerString = "controller";
private readonly MainWindow _mainWindow;
diff --git a/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml b/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml
index 7daf23eb6..544b1e766 100644
--- a/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml
+++ b/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml
@@ -15,7 +15,9 @@
x:DataType="viewModels:ControllerInputViewModel"
x:CompileBindings="True"
mc:Ignorable="d"
- Focusable="True">
+ Focusable="True"
+ Unloaded="Control_OnUnloaded"
+ >
@@ -183,6 +185,9 @@
+
+
@@ -237,5 +241,48 @@ namespace Ryujinx.Ava.UI.Views.Input
_currentAssigner?.Cancel();
_currentAssigner = null;
}
+
+ private void Control_OnUnloaded(object sender, RoutedEventArgs e)
+ {
+ _isRunning = false;
+ }
+
+
+ private void StartUpdatingData()
+ {
+ Task.Run(async () =>
+ {
+ while (_isRunning)
+ {
+ var viewModel = (DataContext as ControllerInputViewModel);
+ if (viewModel != null)
+ {
+ IGamepad gamepad = viewModel.ParentModel.SelectedGamepad;
+ var config = viewModel.Config;
+
+ if (config.LeftJoystick != StickInputId.Unbound)
+ {
+ var stickInputId = (Ryujinx.Input.StickInputId)(int)config.LeftJoystick;
+ (float leftAxisX, float leftAxisY) =
+ gamepad.GetStick(stickInputId);
+ viewModel.LeftStickPosition = NpadController.GetJoystickPosition(leftAxisX, leftAxisY,
+ config.DeadzoneLeft, config.RangeLeft)
+ .ToString();
+ }
+
+ if (config.RightJoystick != StickInputId.Unbound)
+ {
+ var stickInputId = (Ryujinx.Input.StickInputId)(int)config.RightJoystick;
+ (float rightAxisX, float rightAxisY) = gamepad.GetStick(stickInputId);
+ viewModel.RightStickPosition = NpadController
+ .GetJoystickPosition(rightAxisX, rightAxisY, config.DeadzoneRight, config.RangeRight)
+ .ToString();
+ }
+ }
+
+ await Task.Delay(100);
+ }
+ });
+ }
}
}