diff --git a/Ryujinx/Config.cs b/Ryujinx/Config.cs index b437a006dd..705c98d119 100644 --- a/Ryujinx/Config.cs +++ b/Ryujinx/Config.cs @@ -12,6 +12,8 @@ namespace Ryujinx { public static JoyCon FakeJoyCon { get; private set; } + public static float GamePad_Deadzone; + public static void Read(Logger Log) { string IniFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); @@ -28,6 +30,8 @@ namespace Ryujinx Log.SetEnable(LogLevel.Warning, Convert.ToBoolean(Parser.Value("Logging_Enable_Warn"))); Log.SetEnable(LogLevel.Error, Convert.ToBoolean(Parser.Value("Logging_Enable_Error"))); + GamePad_Deadzone = (float)Convert.ToDouble(Parser.Value("GamePad_Deadzone")); + string[] FilteredLogClasses = Parser.Value("Logging_Filtered_Classes").Split(',', StringSplitOptions.RemoveEmptyEntries); //When the classes are specified on the list, we only diff --git a/Ryujinx/Ryujinx.conf b/Ryujinx/Ryujinx.conf index 611f320717..0f04924873 100644 --- a/Ryujinx/Ryujinx.conf +++ b/Ryujinx/Ryujinx.conf @@ -19,6 +19,9 @@ Logging_Enable_Error = true #Filtered log classes, seperated by ", ", eg. `Logging_Filtered_Classes = Loader, ServiceFS` Logging_Filtered_Classes = +#Controller Analog Stick Deadzone +GamePad_Deadzone = 0.05 + #https://github.com/opentk/opentk/blob/develop/src/OpenTK/Input/Key.cs Controls_Left_FakeJoycon_Stick_Up = 105 Controls_Left_FakeJoycon_Stick_Down = 101 diff --git a/Ryujinx/Ui/GLScreen.cs b/Ryujinx/Ui/GLScreen.cs index ab5eaa0f52..0614d99cde 100644 --- a/Ryujinx/Ui/GLScreen.cs +++ b/Ryujinx/Ui/GLScreen.cs @@ -55,6 +55,7 @@ namespace Ryujinx int LeftJoystickDY = 0; int RightJoystickDX = 0; int RightJoystickDY = 0; + float deadzone = Config.GamePad_Deadzone; if (Keyboard.HasValue) { @@ -62,7 +63,7 @@ namespace Ryujinx if (Keyboard[Key.Escape]) this.Exit(); - //RightJoystick + //LeftJoystick if (Keyboard[(Key)Config.FakeJoyCon.Left.StickUp]) LeftJoystickDY = short.MaxValue; if (Keyboard[(Key)Config.FakeJoyCon.Left.StickDown]) LeftJoystickDY = -short.MaxValue; if (Keyboard[(Key)Config.FakeJoyCon.Left.StickLeft]) LeftJoystickDX = -short.MaxValue; @@ -95,6 +96,44 @@ namespace Ryujinx if (Keyboard[(Key)Config.FakeJoyCon.Right.ButtonZR]) CurrentButton |= HidControllerButtons.KEY_ZR; } + //Mapping it relative to the positions of the buttons on the controller + + GamePadState gamePad = GamePad.GetState(0); + + //RightButtons + if (gamePad.Buttons.B == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_A; + if (gamePad.Buttons.A == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_B; + if (gamePad.Buttons.Y == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_X; + if (gamePad.Buttons.X == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_Y; + if (gamePad.Buttons.RightStick == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_RSTICK; + if (gamePad.Buttons.Start == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_PLUS; + if (gamePad.Buttons.RightShoulder == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_R; + if (gamePad.Triggers.Right >= 0.5) CurrentButton |= HidControllerButtons.KEY_ZR; + + //LeftButtons + if (gamePad.Buttons.LeftStick == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_LSTICK; + if (gamePad.DPad.IsUp) CurrentButton |= HidControllerButtons.KEY_DUP; + if (gamePad.DPad.IsDown) CurrentButton |= HidControllerButtons.KEY_DDOWN; + if (gamePad.DPad.IsLeft) CurrentButton |= HidControllerButtons.KEY_DLEFT; + if (gamePad.DPad.IsRight) CurrentButton |= HidControllerButtons.KEY_DRIGHT; + if (gamePad.Buttons.Back == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_MINUS; + if (gamePad.Buttons.LeftShoulder == ButtonState.Pressed) CurrentButton |= HidControllerButtons.KEY_L; + if (gamePad.Triggers.Left >= 0.5) CurrentButton |= HidControllerButtons.KEY_ZL; + + //RightJoystick + if (gamePad.ThumbSticks.Right.X >= deadzone || gamePad.ThumbSticks.Right.X <= -deadzone) + RightJoystickDY = (int)(-gamePad.ThumbSticks.Right.X * short.MaxValue); + + if (gamePad.ThumbSticks.Right.Y >= deadzone || gamePad.ThumbSticks.Right.Y <= -deadzone) + RightJoystickDX = (int)(-gamePad.ThumbSticks.Right.Y * short.MaxValue); + + //LeftJoystick + if (gamePad.ThumbSticks.Left.X >= deadzone || gamePad.ThumbSticks.Left.X <= -deadzone) + LeftJoystickDX = (int)(gamePad.ThumbSticks.Left.X * short.MaxValue); + + if (gamePad.ThumbSticks.Left.Y >= deadzone || gamePad.ThumbSticks.Left.Y <= -deadzone) + LeftJoystickDY = (int)(gamePad.ThumbSticks.Left.Y * short.MaxValue); + LeftJoystick = new HidJoystickPosition { DX = LeftJoystickDX,