| #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN || UNITY_WSA |
| using System.Runtime.InteropServices; |
| using UnityEngine.InputSystem.Layouts; |
| using UnityEngine.InputSystem.LowLevel; |
| using UnityEngine.InputSystem.XInput.LowLevel; |
| using UnityEngine.InputSystem.Utilities; |
| using UnityEngine.Scripting; |
|
|
| namespace UnityEngine.InputSystem.XInput.LowLevel |
| { |
| |
| [StructLayout(LayoutKind.Explicit, Size = 4)] |
| internal struct XInputControllerWindowsState : IInputStateTypeInfo |
| { |
| public FourCC format => new FourCC('X', 'I', 'N', 'P'); |
|
|
| [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1027:MarkEnumsWithFlags", Justification = "False positive")] |
| public enum Button |
| { |
| DPadUp = 0, |
| DPadDown = 1, |
| DPadLeft = 2, |
| DPadRight = 3, |
| Start = 4, |
| Select = 5, |
| LeftThumbstickPress = 6, |
| RightThumbstickPress = 7, |
| LeftShoulder = 8, |
| RightShoulder = 9, |
| A = 12, |
| B = 13, |
| X = 14, |
| Y = 15, |
| } |
|
|
| [InputControl(name = "dpad", layout = "Dpad", sizeInBits = 4, bit = 0)] |
| [InputControl(name = "dpad/up", bit = (uint)Button.DPadUp)] |
| [InputControl(name = "dpad/down", bit = (uint)Button.DPadDown)] |
| [InputControl(name = "dpad/left", bit = (uint)Button.DPadLeft)] |
| [InputControl(name = "dpad/right", bit = (uint)Button.DPadRight)] |
| [InputControl(name = "start", bit = (uint)Button.Start, displayName = "Start")] |
| [InputControl(name = "select", bit = (uint)Button.Select, displayName = "Select")] |
| [InputControl(name = "leftStickPress", bit = (uint)Button.LeftThumbstickPress)] |
| [InputControl(name = "rightStickPress", bit = (uint)Button.RightThumbstickPress)] |
| [InputControl(name = "leftShoulder", bit = (uint)Button.LeftShoulder)] |
| [InputControl(name = "rightShoulder", bit = (uint)Button.RightShoulder)] |
| [InputControl(name = "buttonSouth", bit = (uint)Button.A, displayName = "A")] |
| [InputControl(name = "buttonEast", bit = (uint)Button.B, displayName = "B")] |
| [InputControl(name = "buttonWest", bit = (uint)Button.X, displayName = "X")] |
| [InputControl(name = "buttonNorth", bit = (uint)Button.Y, displayName = "Y")] |
|
|
| [FieldOffset(0)] |
| public ushort buttons; |
|
|
| [InputControl(name = "leftTrigger", format = "BYTE")] |
| [FieldOffset(2)] public byte leftTrigger; |
| [InputControl(name = "rightTrigger", format = "BYTE")] |
| [FieldOffset(3)] public byte rightTrigger; |
|
|
| [InputControl(name = "leftStick", layout = "Stick", format = "VC2S")] |
| [InputControl(name = "leftStick/x", offset = 0, format = "SHRT", parameters = "clamp=false,invert=false,normalize=false")] |
| [InputControl(name = "leftStick/left", offset = 0, format = "SHRT")] |
| [InputControl(name = "leftStick/right", offset = 0, format = "SHRT")] |
| [InputControl(name = "leftStick/y", offset = 2, format = "SHRT", parameters = "clamp=false,invert=false,normalize=false")] |
| [InputControl(name = "leftStick/up", offset = 2, format = "SHRT")] |
| [InputControl(name = "leftStick/down", offset = 2, format = "SHRT")] |
| [FieldOffset(4)] public short leftStickX; |
| [FieldOffset(6)] public short leftStickY; |
|
|
| [InputControl(name = "rightStick", layout = "Stick", format = "VC2S")] |
| [InputControl(name = "rightStick/x", offset = 0, format = "SHRT", parameters = "clamp=false,invert=false,normalize=false")] |
| [InputControl(name = "rightStick/left", offset = 0, format = "SHRT")] |
| [InputControl(name = "rightStick/right", offset = 0, format = "SHRT")] |
| [InputControl(name = "rightStick/y", offset = 2, format = "SHRT", parameters = "clamp=false,invert=false,normalize=false")] |
| [InputControl(name = "rightStick/up", offset = 2, format = "SHRT")] |
| [InputControl(name = "rightStick/down", offset = 2, format = "SHRT")] |
| [FieldOffset(8)] public short rightStickX; |
| [FieldOffset(10)] public short rightStickY; |
|
|
| public XInputControllerWindowsState WithButton(Button button) |
| { |
| Debug.Assert((int)button < 16, $"Expected button < 16, so we fit into the 16 bit wide bitmask"); |
| buttons |= (ushort)(1U << (int)button); |
| return this; |
| } |
| } |
| } |
|
|
| namespace UnityEngine.InputSystem.XInput |
| { |
| |
| |
| |
| [InputControlLayout(stateType = typeof(XInputControllerWindowsState), hideInUI = true)] |
| public class XInputControllerWindows : XInputController |
| { |
| } |
| } |
| #endif // UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN || UNITY_WSA |
|
|