add public method: GetJoystickPosition

This commit is contained in:
madwind 2025-01-03 17:03:59 +08:00
parent 6945a05e45
commit 270c5bd815
2 changed files with 33 additions and 62 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)

View File

@ -9,8 +9,7 @@ using Ryujinx.Ava.UI.ViewModels.Input;
using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Configuration.Hid.Controller;
using Ryujinx.Input; using Ryujinx.Input;
using Ryujinx.Input.Assigner; using Ryujinx.Input.Assigner;
using System; using Ryujinx.Input.HLE;
using System.Numerics;
using System.Threading.Tasks; using System.Threading.Tasks;
using StickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId; using StickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
@ -249,74 +248,41 @@ namespace Ryujinx.Ava.UI.Views.Input
} }
private async void StartUpdatingData() private void StartUpdatingData()
{ {
while (_isRunning) Task.Run(async () =>
{ {
var viewModel = (DataContext as ControllerInputViewModel); while (_isRunning)
if (viewModel != null)
{ {
IGamepad gamepad = viewModel.ParentModel.SelectedGamepad; var viewModel = (DataContext as ControllerInputViewModel);
var config = viewModel.Config; if (viewModel != null)
if (config.LeftJoystick != StickInputId.Unbound)
{ {
var stickInputId = (Ryujinx.Input.StickInputId)(int)config.LeftJoystick; IGamepad gamepad = viewModel.ParentModel.SelectedGamepad;
(float leftAxisX, float leftAxisY) = var config = viewModel.Config;
gamepad.GetStick(stickInputId);
viewModel.LeftStickPosition = if (config.LeftJoystick != StickInputId.Unbound)
ClampToCircle(ApplyDeadzone(leftAxisX, leftAxisY, config.DeadzoneLeft), config.RangeLeft) {
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(); .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();
}
} }
if (config.RightJoystick != StickInputId.Unbound) await Task.Delay(100);
{
var stickInputId = (Ryujinx.Input.StickInputId)(int)config.RightJoystick;
(float rightAxisX, float rightAxisY) = gamepad.GetStick(stickInputId);
viewModel.RightStickPosition =
ClampToCircle(ApplyDeadzone(rightAxisX, rightAxisY, config.DeadzoneRight),
config.RangeRight).ToString();
}
} }
});
await Task.Delay(100);
}
}
private static (int x, int y) ClampToCircle((int x, int y) postion, float range)
{
Vector2 point = new Vector2(postion.x, postion.y) * range;
if (point.Length() > short.MaxValue)
{
point = point / point.Length() * short.MaxValue;
}
return ((int)point.X, (int)point.Y);
}
private static (short x, short y) ApplyDeadzone(float x, float y, float deadzone)
{
float magnitudeClamped = Math.Min(MathF.Sqrt(x * x + y * y), 1f);
if (magnitudeClamped <= deadzone)
{
return (0, 0);
}
return (ClampAxis((x / magnitudeClamped) * ((magnitudeClamped - deadzone) / (1 - deadzone))),
ClampAxis((y / magnitudeClamped) * ((magnitudeClamped - deadzone) / (1 - deadzone))));
}
private static short ClampAxis(float value)
{
if (Math.Sign(value) < 0)
{
return (short)Math.Max(value * -short.MinValue, short.MinValue);
}
return (short)Math.Min(value * short.MaxValue, short.MaxValue);
} }
} }
} }