diff --git a/sources/engine/Stride.Input/GamePadLayouts/GamePadLayout8BitDo.cs b/sources/engine/Stride.Input/GamePadLayouts/GamePadLayout8BitDo.cs new file mode 100644 index 0000000000..361a22dbe4 --- /dev/null +++ b/sources/engine/Stride.Input/GamePadLayouts/GamePadLayout8BitDo.cs @@ -0,0 +1,37 @@ +using System; + +namespace Stride.Input; + +public class GamePadLayout8BitDo : GamePadLayout +{ + private static readonly ushort _vendorId = 0x2DC8; + + public GamePadLayout8BitDo() + { + AddButtonToButton(7, GamePadButton.Start); + AddButtonToButton(6, GamePadButton.Back); + AddButtonToButton(8, GamePadButton.LeftThumb); + AddButtonToButton(9, GamePadButton.RightThumb); + AddButtonToButton(4, GamePadButton.LeftShoulder); + AddButtonToButton(5, GamePadButton.RightShoulder); + AddButtonToButton(0, GamePadButton.A); + AddButtonToButton(1, GamePadButton.B); + AddButtonToButton(2, GamePadButton.X); + AddButtonToButton(3, GamePadButton.Y); + AddAxisToAxis(0, GamePadAxis.LeftThumbX); + AddAxisToAxis(1, GamePadAxis.LeftThumbY, true); + AddAxisToAxis(3, GamePadAxis.RightThumbX); + AddAxisToAxis(4, GamePadAxis.RightThumbY, true); + AddAxisToAxis(2, GamePadAxis.LeftTrigger, remap: true); + AddAxisToAxis(5, GamePadAxis.RightTrigger, remap: true); + } + + public override bool MatchDevice(IInputSource source, IGameControllerDevice device) + { + byte[] guidBytes = device.ProductId.ToByteArray(); + + ushort vendorId = BitConverter.ToUInt16(guidBytes, 4); + + return vendorId == _vendorId; + } +} diff --git a/sources/engine/Stride.Input/GamePadLayouts/GamePadLayouts.cs b/sources/engine/Stride.Input/GamePadLayouts/GamePadLayouts.cs index 9dd31d05af..6b15010801 100644 --- a/sources/engine/Stride.Input/GamePadLayouts/GamePadLayouts.cs +++ b/sources/engine/Stride.Input/GamePadLayouts/GamePadLayouts.cs @@ -19,6 +19,9 @@ static GamePadLayouts() // Support for DualShock4 controllers AddLayout(new GamePadLayoutDS4()); + + // Support for 8BitDo controllers + AddLayout(new GamePadLayout8BitDo()); } /// @@ -55,4 +58,4 @@ public static GamePadLayout FindLayout(IInputSource source, IGameControllerDevic } } } -} \ No newline at end of file +}