Merge branch 'DeadZone' into joycon

# Conflicts:
#	src/Ryujinx/Ryujinx.csproj
This commit is contained in:
madwind 2025-01-08 09:50:57 +08:00
commit 1e3718343c
8 changed files with 102 additions and 8 deletions

View File

@ -392,6 +392,11 @@ namespace Ryujinx.Input.HLE
return state; return state;
} }
public static JoystickPosition GetJoystickPosition(float x, float y, float deadzone, float range)
{
return ClampToCircle(ApplyDeadzone(x, y,deadzone), range);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private static JoystickPosition ApplyDeadzone(float x, float y, float deadzone) private static JoystickPosition ApplyDeadzone(float x, float y, float deadzone)

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 68 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 81 KiB

View File

@ -132,6 +132,8 @@
<None Remove="Assets\Icons\Controller_JoyConLeft.svg" /> <None Remove="Assets\Icons\Controller_JoyConLeft.svg" />
<None Remove="Assets\Icons\Controller_JoyConPair.svg" /> <None Remove="Assets\Icons\Controller_JoyConPair.svg" />
<None Remove="Assets\Icons\Controller_JoyConRight.svg" /> <None Remove="Assets\Icons\Controller_JoyConRight.svg" />
<None Remove="Assets\Icons\Controller_JoyConLeft_Settings.svg" />
<None Remove="Assets\Icons\Controller_JoyConRight_Settings.svg" />
<None Remove="Assets\Icons\Controller_ProCon.svg" /> <None Remove="Assets\Icons\Controller_ProCon.svg" />
</ItemGroup> </ItemGroup>
@ -153,6 +155,8 @@
<EmbeddedResource Include="Assets\Icons\Controller_JoyConLeft.svg" /> <EmbeddedResource Include="Assets\Icons\Controller_JoyConLeft.svg" />
<EmbeddedResource Include="Assets\Icons\Controller_JoyConPair.svg" /> <EmbeddedResource Include="Assets\Icons\Controller_JoyConPair.svg" />
<EmbeddedResource Include="Assets\Icons\Controller_JoyConRight.svg" /> <EmbeddedResource Include="Assets\Icons\Controller_JoyConRight.svg" />
<EmbeddedResource Include="Assets\Icons\Controller_JoyConLeft_Settings.svg" />
<EmbeddedResource Include="Assets\Icons\Controller_JoyConRight_Settings.svg" />
<EmbeddedResource Include="Assets\Icons\Controller_ProCon.svg" /> <EmbeddedResource Include="Assets\Icons\Controller_ProCon.svg" />
<EmbeddedResource Include="Assets\UIImages\Icon_NCA.png" /> <EmbeddedResource Include="Assets\UIImages\Icon_NCA.png" />
<EmbeddedResource Include="Assets\UIImages\Icon_NRO.png" /> <EmbeddedResource Include="Assets\UIImages\Icon_NRO.png" />

View File

@ -7,6 +7,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public class ControllerInputViewModel : BaseModel public class ControllerInputViewModel : BaseModel
{ {
private GamepadInputConfig _config; private GamepadInputConfig _config;
public GamepadInputConfig Config public GamepadInputConfig Config
{ {
get => _config; get => _config;
@ -18,6 +19,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
} }
private bool _isLeft; private bool _isLeft;
public bool IsLeft public bool IsLeft
{ {
get => _isLeft; get => _isLeft;
@ -30,6 +32,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
} }
private bool _isRight; private bool _isRight;
public bool IsRight public bool IsRight
{ {
get => _isRight; get => _isRight;
@ -44,6 +47,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public bool HasSides => IsLeft ^ IsRight; public bool HasSides => IsLeft ^ IsRight;
private SvgImage _image; private SvgImage _image;
public SvgImage Image public SvgImage Image
{ {
get => _image; get => _image;
@ -55,6 +59,30 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
} }
public readonly InputViewModel ParentModel; 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) public ControllerInputViewModel(InputViewModel model, GamepadInputConfig config)
{ {

View File

@ -37,8 +37,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
private const string Disabled = "disabled"; private const string Disabled = "disabled";
private const string ProControllerResource = "Ryujinx/Assets/Icons/Controller_ProCon.svg"; private const string ProControllerResource = "Ryujinx/Assets/Icons/Controller_ProCon.svg";
private const string JoyConPairResource = "Ryujinx/Assets/Icons/Controller_JoyConPair.svg"; private const string JoyConPairResource = "Ryujinx/Assets/Icons/Controller_JoyConPair.svg";
private const string JoyConLeftResource = "Ryujinx/Assets/Icons/Controller_JoyConLeft.svg"; private const string JoyConLeftResource = "Ryujinx/Assets/Icons/Controller_JoyConLeft_Settings.svg";
private const string JoyConRightResource = "Ryujinx/Assets/Icons/Controller_JoyConRight.svg"; private const string JoyConRightResource = "Ryujinx/Assets/Icons/Controller_JoyConRight_Settings.svg";
private const string KeyboardString = "keyboard"; private const string KeyboardString = "keyboard";
private const string ControllerString = "controller"; private const string ControllerString = "controller";
private readonly MainWindow _mainWindow; private readonly MainWindow _mainWindow;

View File

@ -15,7 +15,9 @@
x:DataType="viewModels:ControllerInputViewModel" x:DataType="viewModels:ControllerInputViewModel"
x:CompileBindings="True" x:CompileBindings="True"
mc:Ignorable="d" mc:Ignorable="d"
Focusable="True"> Focusable="True"
Unloaded="Control_OnUnloaded"
>
<Design.DataContext> <Design.DataContext>
<viewModels:ControllerInputViewModel /> <viewModels:ControllerInputViewModel />
</Design.DataContext> </Design.DataContext>
@ -183,6 +185,9 @@
<TextBlock <TextBlock
HorizontalAlignment="Center" HorizontalAlignment="Center"
Text="{ext:Locale ControllerSettingsStickDeadzone}" /> Text="{ext:Locale ControllerSettingsStickDeadzone}" />
<TextBlock
HorizontalAlignment="Center"
Text="{Binding LeftStickPosition }" />
<StackPanel <StackPanel
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -716,6 +721,9 @@
<TextBlock <TextBlock
HorizontalAlignment="Center" HorizontalAlignment="Center"
Text="{ext:Locale ControllerSettingsStickDeadzone}" /> Text="{ext:Locale ControllerSettingsStickDeadzone}" />
<TextBlock
HorizontalAlignment="Center"
Text="{Binding RightStickPosition }" />
<StackPanel <StackPanel
HorizontalAlignment="Center" HorizontalAlignment="Center"
VerticalAlignment="Center" VerticalAlignment="Center"

View File

@ -4,14 +4,13 @@ using Avalonia.Controls.Primitives;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.LogicalTree; using Avalonia.LogicalTree;
using DiscordRPC;
using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels.Input; using Ryujinx.Ava.UI.ViewModels.Input;
using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Configuration.Hid.Controller;
using Ryujinx.Common.Logging;
using Ryujinx.Input; using Ryujinx.Input;
using Ryujinx.Input.Assigner; using Ryujinx.Input.Assigner;
using System; using Ryujinx.Input.HLE;
using System.Threading.Tasks;
using StickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId; using StickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
namespace Ryujinx.Ava.UI.Views.Input namespace Ryujinx.Ava.UI.Views.Input
@ -19,6 +18,7 @@ namespace Ryujinx.Ava.UI.Views.Input
public partial class ControllerInputView : UserControl public partial class ControllerInputView : UserControl
{ {
private ButtonKeyAssigner _currentAssigner; private ButtonKeyAssigner _currentAssigner;
private volatile bool _isRunning = true;
public ControllerInputView() public ControllerInputView()
{ {
@ -39,6 +39,8 @@ namespace Ryujinx.Ava.UI.Views.Input
break; break;
} }
} }
StartUpdatingData();
} }
protected override void OnPointerReleased(PointerReleasedEventArgs e) protected override void OnPointerReleased(PointerReleasedEventArgs e)
@ -85,7 +87,7 @@ namespace Ryujinx.Ava.UI.Views.Input
private void Button_IsCheckedChanged(object sender, RoutedEventArgs e) private void Button_IsCheckedChanged(object sender, RoutedEventArgs e)
{ {
if (sender is ToggleButton button) if (sender is ToggleButton button)
{ {
if (button.IsChecked is true) if (button.IsChecked is true)
{ {
@ -106,7 +108,9 @@ namespace Ryujinx.Ava.UI.Views.Input
var viewModel = (DataContext as ControllerInputViewModel); var viewModel = (DataContext as ControllerInputViewModel);
IKeyboard keyboard = (IKeyboard)viewModel.ParentModel.AvaloniaKeyboardDriver.GetGamepad("0"); // Open Avalonia keyboard for cancel operations. IKeyboard keyboard =
(IKeyboard)viewModel.ParentModel.AvaloniaKeyboardDriver
.GetGamepad("0"); // Open Avalonia keyboard for cancel operations.
IButtonAssigner assigner = CreateButtonAssigner(isStick); IButtonAssigner assigner = CreateButtonAssigner(isStick);
_currentAssigner.ButtonAssigned += (sender, e) => _currentAssigner.ButtonAssigned += (sender, e) =>
@ -237,5 +241,48 @@ namespace Ryujinx.Ava.UI.Views.Input
_currentAssigner?.Cancel(); _currentAssigner?.Cancel();
_currentAssigner = null; _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);
}
});
}
} }
} }