add public method: GetJoystickPosition
This commit is contained in:
parent
6945a05e45
commit
270c5bd815
@ -393,6 +393,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)
|
||||||
{
|
{
|
||||||
|
@ -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,7 +248,9 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private async void StartUpdatingData()
|
private void StartUpdatingData()
|
||||||
|
{
|
||||||
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
while (_isRunning)
|
while (_isRunning)
|
||||||
{
|
{
|
||||||
@ -264,8 +265,8 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
var stickInputId = (Ryujinx.Input.StickInputId)(int)config.LeftJoystick;
|
var stickInputId = (Ryujinx.Input.StickInputId)(int)config.LeftJoystick;
|
||||||
(float leftAxisX, float leftAxisY) =
|
(float leftAxisX, float leftAxisY) =
|
||||||
gamepad.GetStick(stickInputId);
|
gamepad.GetStick(stickInputId);
|
||||||
viewModel.LeftStickPosition =
|
viewModel.LeftStickPosition = NpadController.GetJoystickPosition(leftAxisX, leftAxisY,
|
||||||
ClampToCircle(ApplyDeadzone(leftAxisX, leftAxisY, config.DeadzoneLeft), config.RangeLeft)
|
config.DeadzoneLeft, config.RangeLeft)
|
||||||
.ToString();
|
.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,50 +274,15 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
{
|
{
|
||||||
var stickInputId = (Ryujinx.Input.StickInputId)(int)config.RightJoystick;
|
var stickInputId = (Ryujinx.Input.StickInputId)(int)config.RightJoystick;
|
||||||
(float rightAxisX, float rightAxisY) = gamepad.GetStick(stickInputId);
|
(float rightAxisX, float rightAxisY) = gamepad.GetStick(stickInputId);
|
||||||
viewModel.RightStickPosition =
|
viewModel.RightStickPosition = NpadController
|
||||||
ClampToCircle(ApplyDeadzone(rightAxisX, rightAxisY, config.DeadzoneRight),
|
.GetJoystickPosition(rightAxisX, rightAxisY, config.DeadzoneRight, config.RangeRight)
|
||||||
config.RangeRight).ToString();
|
.ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await Task.Delay(100);
|
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user