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); + } + }); + } } }