namespace VRio.Core.Input; /// /// Gamepad button flags, bit-for-bit the XInput wButtons mask so the /// App-side poller can cast the native value straight through. /// [Flags] public enum PadButtons : ushort { None = 0, DPadUp = 0x0001, DPadDown = 0x0002, DPadLeft = 0x0004, DPadRight = 0x0008, Start = 0x0010, Back = 0x0020, LeftThumb = 0x0040, RightThumb = 0x0080, LeftShoulder = 0x0100, RightShoulder = 0x0200, A = 0x1000, B = 0x2000, X = 0x4000, Y = 0x8000, } /// A gamepad analog control usable as a binding source. public enum PadAxis { LeftStickX, LeftStickY, RightStickX, RightStickY, LeftTrigger, RightTrigger, } /// /// One normalized gamepad snapshot: sticks −1..+1 (up/right positive), /// triggers 0..1. The default value is "pad at rest / no pad connected". /// public readonly struct PadState { public PadState(PadButtons buttons, float leftStickX, float leftStickY, float rightStickX, float rightStickY, float leftTrigger, float rightTrigger) { Buttons = buttons; LeftStickX = leftStickX; LeftStickY = leftStickY; RightStickX = rightStickX; RightStickY = rightStickY; LeftTrigger = leftTrigger; RightTrigger = rightTrigger; } public PadButtons Buttons { get; } public float LeftStickX { get; } public float LeftStickY { get; } public float RightStickX { get; } public float RightStickY { get; } public float LeftTrigger { get; } public float RightTrigger { get; } /// Value of one analog control. public float Axis(PadAxis axis) => axis switch { PadAxis.LeftStickX => LeftStickX, PadAxis.LeftStickY => LeftStickY, PadAxis.RightStickX => RightStickX, PadAxis.RightStickY => RightStickY, PadAxis.LeftTrigger => LeftTrigger, PadAxis.RightTrigger => RightTrigger, _ => 0f, }; }