Ver código fonte

Update 4 review

Lucas Perlind 7 meses atrás
pai
commit
d1d0f0e9b7

+ 1129 - 0
vendor/windows/GameInput/windows_game_input.odin

@@ -0,0 +1,1129 @@
+#+build windows
+/*
+	Bindings for Windows Game Input GDK:
+	https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/input/overviews/input-overview
+
+	Windows SDK 10.0.26100.0 is at least required to link with.
+*/
+package windows_game_input
+
+foreign import wgi {
+	"system:gameinput.lib",
+}
+
+import "core:c"
+import "core:sys/windows"
+
+// Enums
+ArcadeStickButtons_Flag :: enum c.int {
+	Menu     = 0,
+	View     = 1,
+	Up       = 2,
+	Down     = 3,
+	Left     = 4,
+	Right    = 5,
+	Action1  = 6,
+	Action2  = 7,
+	Action3  = 8,
+	Action4  = 9,
+	Action5  = 10,
+	Action6  = 11,
+	Special1 = 12,
+	Special2 = 13
+}
+ArcadeStickButtons :: distinct bit_set[ArcadeStickButtons_Flag; c.int]
+
+BatteryStatus :: enum c.int {
+	Unknown     = -1,
+	NotPresent  = 0,
+	Discharging = 1,
+	Idle        = 2,
+	Charging    = 3
+}
+
+DeviceCapabilities_Flag :: enum c.int {
+	Audio           = 0,
+	PluginModule    = 1,
+	PowerOff        = 2,
+	Synchronization = 3,
+	Wireless        = 4
+}
+DeviceCapabilities :: distinct bit_set[DeviceCapabilities_Flag; c.int]
+
+DeviceFamily :: enum c.int {
+	Virtual   = -1,
+	Aggregate = 0,
+	XboxOne   = 1,
+	Xbox360   = 2,
+	Hid       = 3,
+	I8042     = 4
+}
+
+DeviceStatus_Flag :: enum c.int {
+	Connected     = 0,
+	InputEnabled  = 1,
+	OutputEnabled = 2,
+	RawIoEnabled  = 3,
+	AudioCapture  = 4,
+	AudioRender   = 5,
+	Synchronized  = 6,
+	Wireless      = 7,
+	UserIdle      = 20,
+}
+DeviceStatus :: distinct bit_set[DeviceStatus_Flag; c.int]
+
+EnumerationKind :: enum c.int {
+	NoEnumeration       = 0,
+	AsyncEnumeration    = 1,
+	BlockingEnumeration = 2
+}
+
+FeedbackAxes_Flag :: enum c.int {
+	LinearX  = 0,
+	LinearY  = 1,
+	LinearZ  = 2,
+	AngularX = 3,
+	AngularY = 4,
+	AngularZ = 5,
+	Normal   = 6
+}
+FeedbackAxes :: distinct bit_set[FeedbackAxes_Flag; c.int]
+
+FeedbackEffectState :: enum c.int {
+	Stopped = 0,
+	Running = 1,
+	Paused  = 2
+}
+
+FlightStickButtons_Flag :: enum c.int {
+	None          = 0,
+	Menu          = 1,
+	View          = 2,
+	FirePrimary   = 3,
+	FireSecondary = 4
+}
+FlightStickButtons :: distinct bit_set[FlightStickButtons_Flag; c.int]
+
+FocusPolicy_Flag :: enum c.int {
+	DisableBackgroundInput         = 0,
+	ExclusiveForegroundInput       = 1,
+	DisableBackgroundGuideButton   = 2,
+	ExclusiveForegroundGuideButton = 3,
+	DisableBackgroundShareButton   = 4,
+	ExclusiveForegroundShareButton = 5
+}
+FocusPolicy :: distinct bit_set[FocusPolicy_Flag; c.int]
+
+ForceFeedbackEffectKind :: enum c.int {
+	Constant         = 0,
+	Ramp             = 1,
+	SineWave         = 2,
+	SquareWave       = 3,
+	TriangleWave     = 4,
+	SawtoothUpWave   = 5,
+	SawtoothDownWave = 6,
+	Spring           = 7,
+	Friction         = 8,
+	Damper           = 9,
+	Inertia          = 10
+}
+
+GamepadButtons_Flag :: enum c.int {
+	Menu            = 0,
+	View            = 1,
+	A               = 2,
+	B               = 3,
+	X               = 4,
+	Y               = 5,
+	DPadUp          = 6,
+	DPadDown        = 7,
+	DPadLeft        = 8,
+	DPadRight       = 9,
+	LeftShoulder    = 10,
+	RightShoulder   = 11,
+	LeftThumbstick  = 12,
+	RightThumbstick = 13
+}
+GamepadButtons :: distinct bit_set[GamepadButtons_Flag; c.int]
+
+KeyboardKind :: enum c.int {
+	UnknownKeyboard = -1,
+	AnsiKeyboard    = 0,
+	IsoKeyboard     = 1,
+	KsKeyboard      = 2,
+	AbntKeyboard    = 3,
+	JisKeyboard     = 4
+}
+
+Kind_Flag :: enum c.int {
+	RawDeviceReport  = 0,
+	ControllerAxis   = 1,
+	ControllerButton = 2,
+	ControllerSwitch = 3,
+	Keyboard         = 4,
+	Mouse            = 5,
+	Touch            = 8,
+	Motion           = 12,
+	ArcadeStick      = 16,
+	FlightStick      = 17,
+	Gamepad          = 18,
+	RacingWheel      = 19,
+	UiNavigation     = 20
+}
+Kind :: distinct bit_set[Kind_Flag; c.int]
+Kind_Controller : Kind : { .ControllerAxis, .ControllerButton, .ControllerSwitch }
+
+Label :: enum c.int {
+	Unknown                  = -1,
+	None                     = 0,
+	XboxGuide                = 1,
+	XboxBack                 = 2,
+	XboxStart                = 3,
+	XboxMenu                 = 4,
+	XboxView                 = 5,
+	XboxA                    = 7,
+	XboxB                    = 8,
+	XboxX                    = 9,
+	XboxY                    = 10,
+	XboxDPadUp               = 11,
+	XboxDPadDown             = 12,
+	XboxDPadLeft             = 13,
+	XboxDPadRight            = 14,
+	XboxLeftShoulder         = 15,
+	XboxLeftTrigger          = 16,
+	XboxLeftStickButton      = 17,
+	XboxRightShoulder        = 18,
+	XboxRightTrigger         = 19,
+	XboxRightStickButton     = 20,
+	XboxPaddle1              = 21,
+	XboxPaddle2              = 22,
+	XboxPaddle3              = 23,
+	XboxPaddle4              = 24,
+	LetterA                  = 25,
+	LetterB                  = 26,
+	LetterC                  = 27,
+	LetterD                  = 28,
+	LetterE                  = 29,
+	LetterF                  = 30,
+	LetterG                  = 31,
+	LetterH                  = 32,
+	LetterI                  = 33,
+	LetterJ                  = 34,
+	LetterK                  = 35,
+	LetterL                  = 36,
+	LetterM                  = 37,
+	LetterN                  = 38,
+	LetterO                  = 39,
+	LetterP                  = 40,
+	LetterQ                  = 41,
+	LetterR                  = 42,
+	LetterS                  = 43,
+	LetterT                  = 44,
+	LetterU                  = 45,
+	LetterV                  = 46,
+	LetterW                  = 47,
+	LetterX                  = 48,
+	LetterY                  = 49,
+	LetterZ                  = 50,
+	Number0                  = 51,
+	Number1                  = 52,
+	Number2                  = 53,
+	Number3                  = 54,
+	Number4                  = 55,
+	Number5                  = 56,
+	Number6                  = 57,
+	Number7                  = 58,
+	Number8                  = 59,
+	Number9                  = 60,
+	ArrowUp                  = 61,
+	ArrowUpRight             = 62,
+	ArrowRight               = 63,
+	ArrowDownRight           = 64,
+	ArrowDown                = 65,
+	ArrowDownLLeft           = 66,
+	ArrowLeft                = 67,
+	ArrowUpLeft              = 68,
+	ArrowUpDown              = 69,
+	ArrowLeftRight           = 70,
+	ArrowUpDownLeftRight     = 71,
+	ArrowClockwise           = 72,
+	ArrowCounterClockwise    = 73,
+	ArrowReturn              = 74,
+	IconBranding             = 75,
+	IconHome                 = 76,
+	IconMenu                 = 77,
+	IconCross                = 78,
+	IconCircle               = 79,
+	IconSquare               = 80,
+	IconTriangle             = 81,
+	IconStar                 = 82,
+	IconDPadUp               = 83,
+	IconDPadDown             = 84,
+	IconDPadLeft             = 85,
+	IconDPadRight            = 86,
+	IconDialClockwise        = 87,
+	IconDialCounterClockwise = 88,
+	IconSliderLeftRight      = 89,
+	IconSliderUpDown         = 90,
+	IconWheelUpDown          = 91,
+	IconPlus                 = 92,
+	IconMinus                = 93,
+	IconSuspension           = 94,
+	Home                     = 95,
+	Guide                    = 96,
+	Mode                     = 97,
+	Select                   = 98,
+	Menu                     = 99,
+	View                     = 100,
+	Back                     = 101,
+	Start                    = 102,
+	Options                  = 103,
+	Share                    = 104,
+	Up                       = 105,
+	Down                     = 106,
+	Left                     = 107,
+	Right                    = 108,
+	LB                       = 109,
+	LT                       = 110,
+	LSB                      = 111,
+	L1                       = 112,
+	L2                       = 113,
+	L3                       = 114,
+	RB                       = 115,
+	RT                       = 116,
+	RSB                      = 117,
+	R1                       = 118,
+	R2                       = 119,
+	R3                       = 120,
+	P1                       = 121,
+	P2                       = 122,
+	P3                       = 123,
+	P4                       = 124
+}
+
+Location :: enum c.int {
+	Unknown  = -1,
+	Chassis  = 0,
+	Display  = 1,
+	Axis     = 2,
+	Button   = 3,
+	Switch   = 4,
+	Key      = 5,
+	TouchPad = 6
+}
+
+MotionAccuracy :: enum c.int {
+	AccuracyUnknown = -1,
+	Unavailable     = 0,
+	Unreliable      = 1,
+	Approximate     = 2,
+	Accurate        = 3
+}
+
+MouseButtons_Flag :: enum c.int {
+	LeftButton     = 0,
+	RightButton    = 1,
+	MiddleButton   = 2,
+	Button4        = 3,
+	Button5        = 4,
+	WheelTiltLeft  = 5,
+	WheelTiltRight = 6
+}
+MouseButtons :: distinct bit_set[MouseButtons_Flag; c.int]
+
+RacingWheelButtons_Flag :: enum c.int {
+	Menu         = 0,
+	View         = 1,
+	PreviousGear = 2,
+	NextGear     = 3,
+	DpadUp       = 4,
+	DpadDown     = 5,
+	DpadLeft     = 6,
+	DpadRight    = 7
+}
+RacingWheelButtons :: distinct bit_set[RacingWheelButtons_Flag; c.int]
+
+RawDeviceItemCollectionKind :: enum c.int {
+	UnknownItemCollection       = -1,
+	PhysicalItemCollection      = 0,
+	ApplicationItemCollection   = 1,
+	LogicalItemCollection       = 2,
+	ReportItemCollection        = 3,
+	NamedArrayItemCollection    = 4,
+	UsageSwitchItemCollection   = 5,
+	UsageModifierItemCollection = 6
+}
+
+RawDevicePhysicalUnitKind :: enum c.int {
+	Unknown             = -1,
+	None                = 0,
+	Time                = 1,
+	Frequency           = 2,
+	Length              = 3,
+	Velocity            = 4,
+	Acceleration        = 5,
+	Mass                = 6,
+	Momentum            = 7,
+	Force               = 8,
+	Pressure            = 9,
+	Angle               = 10,
+	AngularVelocity     = 11,
+	AngularAcceleration = 12,
+	AngularMass         = 13,
+	AngularMomentum     = 14,
+	AngularTorque       = 15,
+	ElectricCurrent     = 16,
+	ElectricCharge      = 17,
+	ElectricPotential   = 18,
+	Energy              = 19,
+	Power               = 20,
+	Temperature         = 21,
+	LuminousIntensity   = 22,
+	LuminousFlux        = 23,
+	Illuminance         = 24
+}
+
+RawDeviceReportItemFlag :: enum c.int {
+	ConstantItem   = 0,
+	ArrayItem      = 1,
+	RelativeItem   = 2,
+	WraparoundItem = 3,
+	NonlinearItem  = 4,
+	StableItem     = 5,
+	NullableItem   = 6,
+	VolatileItem   = 7,
+	BufferedItem   = 8
+}
+RawDeviceReportItemFlags :: distinct bit_set[RawDeviceReportItemFlag; c.int]
+
+RawDeviceReportKind :: enum c.int {
+	InputReport   = 0,
+	OutputReport  = 1,
+	FeatureReport = 2
+}
+
+RumbleMotors_Flag :: enum c.int {
+	LowFrequency  = 0,
+	HighFrequency = 1,
+	LeftTrigger   = 2,
+	RightTrigger  = 3
+}
+RumbleMotors :: distinct bit_set[RumbleMotors_Flag; c.int]
+
+SwitchKind :: enum c.int {
+	UnknownSwitchKind = -1,
+	TwoWaySwitch      = 0,
+	FourWaySwitch     = 1,
+	EightWaySwitch    = 2
+}
+
+SwitchPosition :: enum c.int {
+	Center    = 0,
+	Up        = 1,
+	UpRight   = 2,
+	Right     = 3,
+	DownRight = 4,
+	Down      = 5,
+	DownLeft  = 6,
+	Left      = 7,
+	UpLeft    = 8
+}
+
+SystemButtons_Flag :: enum c.int {
+	Guide = 0,
+	Share = 1 
+}
+SystemButtons :: distinct bit_set[SystemButtons_Flag; c.int]
+
+TouchShape :: enum c.int {
+	Unknown            = -1,
+	Point              = 0,
+	Shape1DLinear      = 1,
+	Shape1DRadial      = 2,
+	Shape1DIrregular   = 3,
+	Shape2DRectangular = 4,
+	Shape2DElliptical  = 5,
+	Shape2DIrregular   = 6
+}
+
+UiNavigationButtons_Flag :: enum c.int {
+	Menu        = 0,
+	View        = 1,
+	Accept      = 2,
+	Cancel      = 3,
+	Up          = 4,
+	Down        = 5,
+	Left        = 6,
+	Right       = 7,
+	Context1    = 8,
+	Context2    = 9,
+	Context3    = 10,
+	Context4    = 11,
+	PageUp      = 12,
+	PageDown    = 13,
+	PageLeft    = 14,
+	PageRight   = 15,
+	ScrollUp    = 16,
+	ScrollDown  = 17,
+	ScrollLeft  = 18,
+	ScrollRight = 19
+}
+UiNavigationButtons :: distinct bit_set[UiNavigationButtons_Flag; c.int]
+
+// Structs
+
+APP_LOCAL_DEVICE_ID :: distinct [32]byte
+
+ArcadeStickInfo :: struct {
+	menuButtonLabel: Label,
+	viewButtonLabel: Label,
+	stickUpLabel: Label,
+	stickDownLabel: Label,
+	stickLeftLabel: Label,
+	stickRightLabel: Label,
+	actionButton1Label: Label,
+	actionButton2Label: Label,
+	actionButton3Label: Label,
+	actionButton4Label: Label,
+	actionButton5Label: Label,
+	actionButton6Label: Label,
+	specialButton1Label: Label,
+	specialButton2Label: Label,
+}
+
+ArcadeStickState :: struct {
+	buttons: ArcadeStickButtons,
+}
+
+BatteryState :: struct {
+	chargeRate: f32,
+	maxChargeRate: f32,
+	remainingCapacity: f32,
+	fullChargeCapacity: f32,
+	status: BatteryStatus,
+}
+
+ControllerAxisInfo :: struct {
+	mappedInputKinds: Kind,
+	label: Label,
+	isContinuous: bool,
+	isNonlinear: bool,
+	isQuantized: bool,
+	hasRestValue: bool,
+	restValue: f32,
+	resolution: u64,
+	legacyDInputIndex: u16,
+	legacyHidIndex: u16,
+	rawReportIndex: u32,
+	inputReport: ^RawDeviceReportInfo,
+	inputReportItem: ^RawDeviceReportItemInfo,
+}
+
+ControllerButtonInfo :: struct {
+	mappedInputKinds: Kind,
+	label: Label,
+	legacyDInputIndex: u16,
+	legacyHidIndex: u16,
+	rawReportIndex: u32,
+	inputReport: ^RawDeviceReportInfo,
+	inputReportItem: ^RawDeviceReportItemInfo,
+}
+
+ControllerSwitchInfo :: struct {
+	mappedInputKinds: Kind,
+	label: Label,
+	positionLabels: [9]Label,
+	kind: SwitchKind,
+	legacyDInputIndex: u16,
+	legacyHidIndex: u16,
+	rawReportIndex: u32,
+	inputReport: ^RawDeviceReportInfo,
+	inputReportItem: ^RawDeviceReportItemInfo,
+}
+
+DeviceInfo :: struct {
+	infoSize: u32,
+	vendorId: u16,
+	productId: u16,
+	revisionNumber: u16,
+	interfaceNumber: u8,
+	collectionNumber: u8,
+	usage: Usage,
+	hardwareVersion: Version,
+	firmwareVersion: Version,
+	deviceId: APP_LOCAL_DEVICE_ID,
+	deviceRootId: APP_LOCAL_DEVICE_ID,
+	deviceFamily: DeviceFamily,
+	capabilities: DeviceCapabilities,
+	supportedInput: Kind,
+	supportedRumbleMotors: RumbleMotors,
+	inputReportCount: u32,
+	outputReportCount: u32,
+	featureReportCount: u32,
+	controllerAxisCount: u32,
+	controllerButtonCount: u32,
+	controllerSwitchCount: u32,
+	touchPointCount: u32,
+	touchSensorCount: u32,
+	forceFeedbackMotorCount: u32,
+	hapticFeedbackMotorCount: u32,
+	deviceStringCount: u32,
+	deviceDescriptorSize: u32,
+	inputReportInfo: ^RawDeviceReportInfo,
+	outputReportInfo: ^RawDeviceReportInfo,
+	featureReportInfo: ^RawDeviceReportInfo,
+	controllerAxisInfo: ^ControllerAxisInfo,
+	controllerButtonInfo: ^ControllerButtonInfo,
+	controllerSwitchInfo: ^ControllerSwitchInfo,
+	keyboardInfo: ^KeyboardInfo,
+	mouseInfo: ^MouseInfo,
+	touchSensorInfo: ^TouchSensorInfo,
+	motionInfo: ^MotionInfo,
+	arcadeStickInfo: ^ArcadeStickInfo,
+	flightStickInfo: ^FlightStickInfo,
+	gamepadInfo: ^GamepadInfo,
+	racingWheelInfo: ^RacingWheelInfo,
+	uiNavigationInfo: ^UiNavigationInfo,
+	forceFeedbackMotorInfo: ^ForceFeedbackMotorInfo,
+	hapticFeedbackMotorInfo: ^HapticFeedbackMotorInfo,
+	displayName: ^String,
+	deviceStrings: ^String,
+	deviceDescriptorData: rawptr,
+}
+
+FlightStickInfo :: struct {
+	menuButtonLabel: Label,
+	viewButtonLabel: Label,
+	firePrimaryButtonLabel: Label,
+	fireSecondaryButtonLabel: Label,
+	hatSwitchKind: SwitchKind,
+}
+
+FlightStickState :: struct {
+	buttons: FlightStickButtons,
+	hatSwitch: SwitchPosition,
+	roll: f32,
+	pitch: f32,
+	yaw: f32,
+	throttle: f32,
+}
+
+ForceFeedbackConditionParams :: struct {
+	magnitude: ForceFeedbackMagnitude,
+	positiveCoefficient: f32,
+	negativeCoefficient: f32,
+	maxPositiveMagnitude: f32,
+	maxNegativeMagnitude: f32,
+	deadZone: f32,
+	bias: f32,
+}
+
+ForceFeedbackConstantParams :: struct {
+	envelope: ForceFeedbackEnvelope,
+	magnitude: ForceFeedbackMagnitude,
+}
+
+ForceFeedbackEnvelope :: struct {
+	attackDuration: u64,
+	sustainDuration: u64,
+	releaseDuration: u64,
+	attackGain: f32,
+	sustainGain: f32,
+	releaseGain: f32,
+	playCount: u32,
+	repeatDelay: u64,
+}
+
+ForceFeedbackMagnitude :: struct {
+	linearX: f32,
+	linearY: f32,
+	linearZ: f32,
+	angularX: f32,
+	angularY: f32,
+	angularZ: f32,
+	normal: f32,
+}
+
+ForceFeedbackMotorInfo :: struct {
+	supportedAxes: FeedbackAxes,
+	location: Location,
+	locationId: u32,
+	maxSimultaneousEffects: u32,
+	isConstantEffectSupported: bool,
+	isRampEffectSupported: bool,
+	isSineWaveEffectSupported: bool,
+	isSquareWaveEffectSupported: bool,
+	isTriangleWaveEffectSupported: bool,
+	isSawtoothUpWaveEffectSupported: bool,
+	isSawtoothDownWaveEffectSupported: bool,
+	isSpringEffectSupported: bool,
+	isFrictionEffectSupported: bool,
+	isDamperEffectSupported: bool,
+	isInertiaEffectSupported: bool,
+}
+
+ForceFeedbackParams :: struct {
+	kind: ForceFeedbackEffectKind,
+	using _: struct #raw_union {  
+		constant: ForceFeedbackConstantParams,
+		ramp: ForceFeedbackRampParams,
+		sineWave: ForceFeedbackPeriodicParams,
+		squareWave: ForceFeedbackPeriodicParams,
+		triangleWave: ForceFeedbackPeriodicParams,
+		sawtoothUpWave: ForceFeedbackPeriodicParams,
+		sawtoothDownWave: ForceFeedbackPeriodicParams,
+		spring: ForceFeedbackConditionParams,
+		friction: ForceFeedbackConditionParams,
+		damper: ForceFeedbackConditionParams,
+		inertia: ForceFeedbackConditionParams,
+	}
+}
+
+ForceFeedbackPeriodicParams :: struct {
+	envelope: ForceFeedbackEnvelope,
+	magnitude: ForceFeedbackMagnitude,
+	frequency: f32,
+	phase: f32,
+	bias: f32,
+}
+
+ForceFeedbackRampParams :: struct {
+	envelope: ForceFeedbackEnvelope,
+	startMagnitude: ForceFeedbackMagnitude,
+	endMagnitude: ForceFeedbackMagnitude,
+}
+
+GamepadInfo :: struct {
+	menuButtonLabel: Label,
+	viewButtonLabel: Label,
+	aButtonLabel: Label,
+	bButtonLabel: Label,
+	xButtonLabel: Label,
+	yButtonLabel: Label,
+	dpadUpLabel: Label,
+	dpadDownLabel: Label,
+	dpadLeftLabel: Label,
+	dpadRightLabel: Label,
+	leftShoulderButtonLabel: Label,
+	rightShoulderButtonLabel: Label,
+	leftThumbstickButtonLabel: Label,
+	rightThumbstickButtonLabel: Label,
+}
+
+GamepadState :: struct {
+	buttons: GamepadButtons,
+	leftTrigger: f32,
+	rightTrigger: f32,
+	leftThumbstickX: f32,
+	leftThumbstickY: f32,
+	rightThumbstickX: f32,
+	rightThumbstickY: f32,
+}
+
+HapticFeedbackMotorInfo :: struct {
+	mappedRumbleMotor: RumbleMotors,
+	location: Location,
+	locationId: u32,
+	waveformCount: u32,
+	waveformInfo: [^]HapticWaveformInfo `fmt:"v,waveformCount"`,
+}
+
+HapticFeedbackParams :: struct {
+	waveformIndex: u32,
+	duration: u64,
+	intensity: f32,
+	playCount: u32,
+	repeatDelay: u64,
+}
+
+HapticWaveformInfo :: struct {
+	usage: Usage,
+	isDurationSupported: bool,
+	isIntensitySupported: bool,
+	isRepeatSupported: bool,
+	isRepeatDelaySupported: bool,
+	defaultDuration: u64,
+}
+
+KeyboardInfo :: struct {
+	kind: KeyboardKind,
+	layout: u32,
+	keyCount: u32,
+	functionKeyCount: u32,
+	maxSimultaneousKeys: u32,
+	platformType: u32,
+	platformSubtype: u32,
+	nativeLanguage: ^String,
+}
+
+KeyState :: struct {
+	scanCode: u32,
+	codePoint: u32,
+	virtualKey: u8,
+	isDeadKey: bool,
+}
+
+MotionInfo :: struct {
+	maxAcceleration: f32,
+	maxAngularVelocity: f32,
+	maxMagneticFieldStrength: f32,
+}
+
+MotionState :: struct {
+	accelerationX: f32,
+	accelerationY: f32,
+	accelerationZ: f32,
+	angularVelocityX: f32,
+	angularVelocityY: f32,
+	angularVelocityZ: f32,
+	magneticFieldX: f32,
+	magneticFieldY: f32,
+	magneticFieldZ: f32,
+	orientationW: f32,
+	orientationX: f32,
+	orientationY: f32,
+	orientationZ: f32,
+	accelerometerAccuracy: MotionAccuracy,
+	gyroscopeAccuracy: MotionAccuracy,
+	magnetometerAccuracy: MotionAccuracy,
+	orientationAccuracy: MotionAccuracy,
+}
+
+MouseInfo :: struct {
+	supportedButtons: MouseButtons,
+	sampleRate: u32,
+	sensorDpi: u32,
+	hasWheelX: bool,
+	hasWheelY: bool,
+}
+
+MouseState :: struct {
+	buttons: MouseButtons,
+	positionX: i64,
+	positionY: i64,
+	wheelX: i64,
+	wheelY: i64,
+}
+
+RacingWheelInfo :: struct {
+	menuButtonLabel: Label,
+	viewButtonLabel: Label,
+	previousGearButtonLabel: Label,
+	nextGearButtonLabel: Label,
+	dpadUpLabel: Label,
+	dpadDownLabel: Label,
+	dpadLeftLabel: Label,
+	dpadRightLabel: Label,
+	hasClutch: bool,
+	hasHandbrake: bool,
+	hasPatternShifter: bool,
+	minPatternShifterGear: i32,
+	maxPatternShifterGear: i32,
+	maxWheelAngle: f32,
+}
+
+RacingWheelState :: struct {
+	buttons: RacingWheelButtons,
+	patternShifterGear: i32,
+	wheel: f32,
+	throttle: f32,
+	brake: f32,
+	clutch: f32,
+	handbrake: f32,
+}
+
+RawDeviceItemCollectionInfo :: struct {
+	kind: RawDeviceItemCollectionKind,
+	childCount: u32,
+	siblingCount: u32,
+	usageCount: u32,
+	usages: [^]Usage,
+	parent: ^RawDeviceItemCollectionInfo,
+	firstSibling: ^RawDeviceItemCollectionInfo,
+	previousSibling: ^RawDeviceItemCollectionInfo,
+	nextSibling: ^RawDeviceItemCollectionInfo,
+	lastSibling: ^RawDeviceItemCollectionInfo,
+	firstChild: ^RawDeviceItemCollectionInfo,
+	lastChild: ^RawDeviceItemCollectionInfo,
+}
+
+RawDeviceReportInfo :: struct {
+	kind: RawDeviceReportKind,
+	id: u32,
+	size: u32,
+	itemCount: u32,
+	items: [^]RawDeviceReportItemInfo,
+}
+
+RawDeviceReportItemInfo :: struct {
+	bitOffset: u32,
+	bitSize: u32,
+	logicalMin: i64,
+	logicalMax: i64,
+	physicalMin: f64,
+	physicalMax: f64,
+	physicalUnits: RawDevicePhysicalUnitKind,
+	rawPhysicalUnits: u32,
+	rawPhysicalUnitsExponent: i32,
+	flags: RawDeviceReportItemFlags,
+	usageCount: u32,
+	usages: [^]Usage,
+	collection: ^RawDeviceItemCollectionInfo,
+	itemString: ^String,
+}
+
+RumbleParams :: struct {
+	lowFrequency: f32,
+	highFrequency: f32,
+	leftTrigger: f32,
+	rightTrigger: f32,
+}
+
+String :: struct {
+	sizeInBytes: u32,
+	codePointCount: u32,
+	data: [^]byte,
+}
+
+TouchSensorInfo :: struct {
+	mappedInputKinds: Kind,
+	label: Label,
+	location: Location,
+	locationId: u32,
+	resolutionX: u64,
+	resolutionY: u64,
+	shape: TouchShape,
+	aspectRatio: f32,
+	orientation: f32,
+	physicalWidth: f32,
+	physicalHeight: f32,
+	maxPressure: f32,
+	maxProximity: f32,
+	maxTouchPoints: u32,
+}
+
+TouchState :: struct {
+	touchId: u64,
+	sensorIndex: u32,
+	positionX: f32,
+	positionY: f32,
+	pressure: f32,
+	proximity: f32,
+	contactRectTop: f32,
+	contactRectLeft: f32,
+	contactRectRight: f32,
+	contactRectBottom: f32,
+}
+
+UiNavigationInfo :: struct {
+	menuButtonLabel: Label,
+	viewButtonLabel: Label,
+	acceptButtonLabel: Label,
+	cancelButtonLabel: Label,
+	upButtonLabel: Label,
+	downButtonLabel: Label,
+	leftButtonLabel: Label,
+	rightButtonLabel: Label,
+	contextButton1Label: Label,
+	contextButton2Label: Label,
+	contextButton3Label: Label,
+	contextButton4Label: Label,
+	pageUpButtonLabel: Label,
+	pageDownButtonLabel: Label,
+	pageLeftButtonLabel: Label,
+	pageRightButtonLabel: Label,
+	scrollUpButtonLabel: Label,
+	scrollDownButtonLabel: Label,
+	scrollLeftButtonLabel: Label,
+	scrollRightButtonLabel: Label,
+	guideButtonLabel: Label,
+}
+
+UiNavigationState :: struct {
+	buttons: UiNavigationButtons,
+}
+
+Usage :: struct {
+	page: u16,
+	id: u16,
+}
+
+Version :: struct {
+	major: u16,
+	minor: u16,
+	build: u16,
+	revision: u16,
+}
+
+// COM Interfaces
+
+IUnknown	:: windows.IUnknown
+IUnknown_VTable :: windows.IUnknown_VTable
+IID		:: windows.GUID
+
+IGameInput_UUID_STRING :: "11BE2A7E-4254-445A-9C09-FFC40F006918"
+IGameInput_UUID := &IID{0x11BE2A7E, 0x4254, 0x445A, {0x9C, 0x09, 0xFF, 0xC4, 0x0F, 0x00, 0x69, 0x18}}
+IGameInput :: struct #raw_union {
+	#subtype iunknown: IUnknown,
+	using igameinput_vtable: ^IGameInput_VTable,
+}
+IGameInput_VTable :: struct {
+	using iunknown_vtable: IUnknown_VTable,
+	GetCurrentTimestamp: proc "system" (this: ^IGameInput) -> u64,
+	GetCurrentReading: proc "system" (this: ^IGameInput, inputKind: Kind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
+	GetNextReading: proc "system" (this: ^IGameInput, referenceReading: ^IGameInputReading, inputKind: Kind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
+	GetPreviousReading: proc "system" (this: ^IGameInput, referenceReading: ^IGameInputReading, inputKind: Kind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
+	GetTemporalReading: proc "system" (this: ^IGameInput, timestamp: u64, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
+	RegisterReadingCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, inputKind: Kind, analogThreshold: f32, ctx: rawptr, callbackFunc: ReadingCallback, callbackToken: ^CallbackToken) -> HRESULT,
+	RegisterDeviceCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, inputKind: Kind, statusFilter: DeviceStatus, enumerationKind: EnumerationKind, ctx: rawptr, callbackFunc: DeviceCallback, callbackToken: ^CallbackToken) -> HRESULT,
+	RegisterSystemButtonCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, buttonFilter: SystemButtons, ctx: rawptr, callbackFunc: SystemButtonCallback, callbackToken: ^CallbackToken) -> HRESULT,
+	RegisterKeyboardLayoutCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, ctx: rawptr, callbackFunc: KeyboardLayoutCallback, callbackToken: ^CallbackToken) -> HRESULT,
+	StopCallback: proc "system" (this: ^IGameInput, callbackToken: CallbackToken),
+	UnregisterCallback: proc "system" (this: ^IGameInput, callbackToken: CallbackToken, timeoutInMicroseconds: u64) -> bool,
+	CreateDispatcher: proc "system" (this: ^IGameInput, dispatcher: ^^IGameInputDispatcher) -> HRESULT,
+	CreateAggregateDevice: proc "system" (this: ^IGameInput, kind: Kind, device: ^^IGameInputDevice) -> HRESULT,
+	FindDeviceFromId: proc "system" (this: ^IGameInput, value: ^APP_LOCAL_DEVICE_ID, device: ^^IGameInputDevice) -> HRESULT,
+	FindDeviceFromObject: proc "system" (this: ^IGameInput, value: ^IUnknown, device: ^^IGameInputDevice) -> HRESULT,
+	FindDeviceFromPlatformHandle: proc "system" (this: ^IGameInput, value: HANDLE, device: ^^IGameInputDevice) -> HRESULT,
+	FindDeviceFromPlatformString: proc "system" (this: ^IGameInput, value: windows.LPCWSTR, device: ^^IGameInputDevice) -> HRESULT,
+	EnableOemDeviceSupport: proc "system" (this: ^IGameInput, vendorId: u16, productId: u16, interfaceNumber: u8, collectionNumber: u8) -> HRESULT,
+	SetFocusPolicy: proc "system" (this: ^IGameInput, policy: FocusPolicy),
+}
+
+IGameInputReading_UUID_STRING :: "2156947A-E1FA-4DE0-A30B-D812931DBD8D"
+IGameInputReading_UUID := &IID{0x2156947A, 0xE1FA, 0x4DE0, {0xA3, 0x0B, 0xD8, 0x12, 0x93, 0x1D, 0x0BD, 0x8D}}
+IGameInputReading :: struct #raw_union {
+	#subtype iunknown: IUnknown,
+	using igameinputreading_vtable: ^IGameInputReading_VTable,
+}
+IGameInputReading_VTable :: struct {
+	using iunknown_vtable: IUnknown_VTable,
+	GetInputKind: proc "system" (this: ^IGameInputReading) -> Kind,
+	GetSequenceNumber: proc "system" (this: ^IGameInputReading) -> u64,
+	GetTimestamp: proc "system" (this: ^IGameInputReading) -> u64,
+	GetDevice: proc "system" (this: ^IGameInputReading, device: ^^IGameInputDevice),
+	GetRawReport: proc "system" (this: ^IGameInputReading, report: ^^IGameInputRawDeviceReport) -> bool,
+	GetControllerAxisCount: proc "system" (this: ^IGameInputReading) -> u32,
+	GetControllerAxisState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]f32) -> u32,
+	GetControllerButtonCount: proc "system" (this: ^IGameInputReading) -> u32,
+	GetControllerButtonState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]bool) -> u32,
+	GetControllerSwitchCount: proc "system" (this: ^IGameInputReading) -> u32,
+	GetControllerSwitchState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]SwitchPosition) -> u32,
+	GetKeyCount: proc "system" (this: ^IGameInputReading) -> u32,
+	GetKeyState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]KeyState) -> u32,
+	GetMouseState: proc "system" (this: ^IGameInputReading, state: ^MouseState) -> bool,
+	GetTouchCount: proc "system" (this: ^IGameInputReading) -> u32,
+	GetTouchState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]TouchState) -> u32,
+	GetMotionState: proc "system" (this: ^IGameInputReading, state: ^MotionState) -> bool,
+	GetArcadeStickState: proc "system" (this: ^IGameInputReading, state: ^ArcadeStickState) -> bool,
+	GetFlightStickState: proc "system" (this: ^IGameInputReading, state: ^FlightStickState) -> bool,
+	GetGamepadState: proc "system" (this: ^IGameInputReading, state: ^GamepadState) -> bool,
+	GetRacingWheelState: proc "system" (this: ^IGameInputReading, state: ^RacingWheelState) -> bool,
+	GetUiNavigationState: proc "system" (this: ^IGameInputReading, state: ^UiNavigationState) -> bool,
+}
+
+IGameInputDevice_UUID_STRING :: "31DD86FB-4C1B-408A-868F-439B3CD47125"
+IGameInputDevice_UUID := &IID{0x31DD86FB, 0x4C1B, 0x408A, {0x86, 0x8F, 0x43, 0x9B, 0x3C, 0xD4, 0x71, 0x25}}
+IGameInputDevice :: struct #raw_union {
+	#subtype iunknown: IUnknown,
+	using igameinputdevice_vtable: ^IGameInputDevice_Vtable,
+}
+IGameInputDevice_Vtable :: struct {
+	using iunknown_vtable: IUnknown_VTable,
+	GetDeviceInfo: proc "system" (this: ^IGameInputDevice) -> ^DeviceInfo,
+	GetDeviceStatus: proc "system" (this: ^IGameInputDevice) -> DeviceStatus,
+	GetBatteryState: proc "system" (this: ^IGameInputDevice, state: ^BatteryState),
+	CreateForceFeedbackEffect: proc "system" (this: ^IGameInputDevice, motorIndex: u32, params: ^ForceFeedbackParams, effect: ^^IGameInputForceFeedbackEffect) -> HRESULT,
+	IsForceFeedbackMotorPoweredOn: proc "system" (this: ^IGameInputDevice, motorIndex: u32) -> bool,
+	SetForceFeedbackMotorGain: proc "system" (this: ^IGameInputDevice, motorIndex: u32, masterGain: f32),
+	SetHapticMotorState: proc "system" (this: ^IGameInputDevice, motorIndex: u32, params: ^HapticFeedbackParams) -> HRESULT,
+	SetRumbleState: proc "system" (this: ^IGameInputDevice, params: ^RumbleParams),
+	SetInputSynchronizationState: proc "system" (this: ^IGameInputDevice, enabled: bool),
+	SendInputSynchronizationHint: proc "system" (this: ^IGameInputDevice),
+	PowerOff: proc "system" (this: ^IGameInputDevice),
+	CreateRawDeviceReport: proc "system" (this: ^IGameInputDevice, reportId: u32, reportKind: RawDeviceReportKind, report: ^^IGameInputRawDeviceReport) -> HRESULT,
+	GetRawDeviceFeature: proc "system" (this: ^IGameInputDevice, reportId: u32, report: ^^IGameInputRawDeviceReport) -> HRESULT,
+	SetRawDeviceFeature: proc "system" (this: ^IGameInputDevice, report: ^IGameInputRawDeviceReport) -> HRESULT,
+	SendRawDeviceOutput: proc "system" (this: ^IGameInputDevice, report: ^IGameInputRawDeviceReport) -> HRESULT,
+	SendRawDeviceOutputWithResponse: proc "system" (this: ^IGameInputDevice, requestReport: ^IGameInputRawDeviceReport, responseReport: ^^IGameInputRawDeviceReport) -> HRESULT,
+	ExecuteRawDeviceIoControl: proc "system" (this: ^IGameInputDevice, controlCode: u32, inputBufferSize: c.size_t, inputBuffer: rawptr, outputBufferSize: c.size_t, outputBuffer: rawptr, outputSize: ^c.size_t) -> HRESULT,
+	AcquireExclusiveRawDeviceAccess: proc "system" (this: ^IGameInputDevice, timeoutInMicroseconds: u64) -> bool,
+	ReleaseExclusiveRawDeviceAccess: proc "system" (this: ^IGameInputDevice),
+}
+
+IGameInputDispatcher_UUID_STRING :: "415EED2E-98CB-42C2-8F28-B94601074E31"
+IGameInputDispatcher_UUID := &IID{0x415EED2E, 0x98CB, 0x42C2, {0x8F, 0x28, 0xB9, 0x46, 0x01, 0x07, 0x4E, 0x31}}
+IGameInputDispatcher :: struct #raw_union {
+	#subtype iunknown: IUnknown,
+	using igameinputdispatcher_vtable: ^IGameInputDispatcher_Vtable,
+}
+IGameInputDispatcher_Vtable :: struct {
+	using iunknown_vtable: IUnknown_VTable,
+	Dispatch: proc "system" (this: ^IGameInputDispatcher, quotaInMicroseconds: u64) -> bool,
+	OpenWaitHandle: proc "system" (this: ^IGameInputDispatcher, waitHandle: ^HANDLE) -> HRESULT,
+}
+
+IGameInputForceFeedbackEffect_UUID_STRING :: "51BDA05E-F742-45D9-B085-9444AE48381D"
+IGameInputForceFeedbackEffect_UUID := &IID{0x51BDA05E, 0xF742, 0x45D9, {0xB0, 0x85, 0x94, 0x44, 0xAE, 0x48, 0x38, 0x1D}}
+IGameInputForceFeedbackEffect :: struct #raw_union {
+	#subtype iunknown: IUnknown,
+	using igameinputforcefeedbackeffect_vtable: ^IGameInputForceFeedbackEffect_Vtable,
+}
+IGameInputForceFeedbackEffect_Vtable :: struct {
+	using iunknown_vtable: IUnknown_VTable,
+	GetDevice: proc "system" (this: ^IGameInputForceFeedbackEffect, device: ^^IGameInputDevice),
+	GetMotorIndex: proc "system" (this: ^IGameInputForceFeedbackEffect) -> u32,
+	GetGain: proc "system" (this: ^IGameInputForceFeedbackEffect) -> f32,
+	SetGain: proc "system" (this: ^IGameInputForceFeedbackEffect, gain: f32),
+	GetParams: proc "system" (this: ^IGameInputForceFeedbackEffect, params: ^ForceFeedbackParams),
+	SetParams: proc "system" (this: ^IGameInputForceFeedbackEffect, params: ^ForceFeedbackParams) -> bool,
+	GetState: proc "system" (this: ^IGameInputForceFeedbackEffect) -> FeedbackEffectState,
+	SetState: proc "system" (this: ^IGameInputForceFeedbackEffect, state: FeedbackEffectState),
+}
+
+IGameInputRawDeviceReport_UUID_STRING :: "61F08CF1-1FFC-40CA-A2B8-E1AB8BC5B6DC"
+IGameInputRawDeviceReport_UUID := &IID{0x61F08CF1, 0x1FFC, 0x40CA, {0xA2, 0xB8, 0xE1, 0xAB, 0x8B, 0xC5, 0xB6, 0xDC}}
+IGameInputRawDeviceReport :: struct #raw_union {
+	#subtype iunknown: IUnknown,
+	using igameinputrawdevicereport_vtable: ^IGameInputRawDeviceReport_Vtable,
+}
+IGameInputRawDeviceReport_Vtable :: struct {
+	using iunknown_vtable: IUnknown_VTable,
+	GetDevice: proc "system" (this: ^IGameInputRawDeviceReport, device: ^^IGameInputDevice),
+	GetReportInfo: proc "system" (this: ^IGameInputRawDeviceReport) -> ^RawDeviceReportInfo,
+	GetRawDataSize: proc "system" (this: ^IGameInputRawDeviceReport) -> c.size_t,
+	GetRawData: proc "system" (this: ^IGameInputRawDeviceReport, bufferSize: c.size_t, buffer: rawptr) -> c.size_t,
+	SetRawData: proc "system" (this: ^IGameInputRawDeviceReport, bufferSize: c.size_t, buffer: rawptr) -> bool,
+	GetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32, value: ^u64) -> bool,
+	SetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32, value: u64) -> bool,
+	ResetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32) -> bool,
+	ResetAllItems: proc "system" (this: ^IGameInputRawDeviceReport) -> bool,
+}
+
+// Functions
+HRESULT :: windows.HRESULT
+HANDLE :: windows.HANDLE
+
+DEVICE_DISCONNECTED : HRESULT : -0x7C75FFFF
+DEVICE_NOT_FOUND : HRESULT : -0x7C75FFFE
+READING_NOT_FOUND : HRESULT : -0x7C75FFFD
+REFERENCE_READING_TOO_OLD : HRESULT : -0x7C75FFFC
+TIMESTAMP_OUT_OF_RANGE : HRESULT : -0x7C75FFFB
+INSUFFICIENT_FORCE_FEEDBACK_RESOURCES : HRESULT : -0x7C75FFFA
+
+CallbackToken :: distinct u64
+
+GAMEINPUT_CURRENT_CALLBACK_TOKEN_VALUE : CallbackToken : 0xFFFFFFFFFFFFFFFF
+GAMEINPUT_INVALID_CALLBACK_TOKEN_VALUE : CallbackToken : 0x0000000000000000
+
+@(default_calling_convention="system", link_prefix="GameInput")
+foreign wgi {
+	Create :: proc(gameInput: ^^IGameInput) -> HRESULT ---
+}
+
+DeviceCallback :: #type proc "system" (callbackToken: CallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentState: DeviceStatus, previousState: DeviceStatus)
+GuideButtonCallback :: #type proc "system" (callbackToken: CallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, isPressed: bool)
+SystemButtonCallback :: #type proc "system" (callbackToken: CallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentState: DeviceStatus, previousState: DeviceStatus)
+ReadingCallback :: #type proc "system" (callbackToken: CallbackToken, ctx: rawptr, reading: ^IGameInputReading, hasOverrunOccured: bool)
+KeyboardLayoutCallback :: #type proc "system" (callbackToken: CallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentState: DeviceStatus, previousState: DeviceStatus)
+

+ 0 - 1129
vendor/windows_game_input/windows_game_input.odin

@@ -1,1129 +0,0 @@
-#+build windows
-/*
-	Bindings for Windows Game Input GDK:
-	https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/input/overviews/input-overview
-
-	Windows SDK 10.0.26100.0 is at least required to link with.
-*/
-package windows_game_input
-
-foreign import wgi {
-	"system:gameinput.lib",
-}
-
-import "core:c"
-import "core:sys/windows"
-
-// Enums
-GameInputArcadeStickButtons_Flag :: enum c.int {
-	Menu = 0,
-	View = 1,
-	Up = 2,
-	Down = 3,
-	Left = 4,
-	Right = 5,
-	Action1 = 6,
-	Action2 = 7,
-	Action3 = 8,
-	Action4 = 9,
-	Action5 = 10,
-	Action6 = 11,
-	Special1 = 12,
-	Special2 = 13
-}
-GameInputArcadeStickButtons :: bit_set[GameInputArcadeStickButtons_Flag; c.int]
-
-GameInputBatteryStatus :: enum c.int {
-	Unknown = -1,
-	NotPresent = 0,
-	Discharging = 1,
-	Idle = 2,
-	Charging = 3
-}
-
-GameInputDeviceCapabilities_Flag :: enum c.int {
-	Audio = 0,
-	PluginModule = 1,
-	PowerOff = 2,
-	Synchronization = 3,
-	Wireless = 4
-}
-GameInputDeviceCapabilities :: bit_set[GameInputDeviceCapabilities_Flag; c.int]
-
-GameInputDeviceFamily :: enum c.int {
-	Virtual = -1,
-	Aggregate = 0,
-	XboxOne = 1,
-	Xbox360 = 2,
-	Hid = 3,
-	I8042 = 4
-}
-
-GameInputDeviceStatus_Flag :: enum c.int {
-	Connected = 0,
-	InputEnabled = 1,
-	OutputEnabled = 2,
-	RawIoEnabled = 3,
-	AudioCapture = 4,
-	AudioRender = 5,
-	Synchronized = 6,
-	Wireless = 7,
-	UserIdle = 20,
-}
-GameInputDeviceStatus :: bit_set[GameInputDeviceStatus_Flag; c.int]
-
-GameInputEnumerationKind :: enum c.int {
-	NoEnumeration = 0,
-	AsyncEnumeration = 1,
-	BlockingEnumeration = 2
-}
-
-GameInputFeedbackAxes_Flag :: enum c.int {
-	LinearX = 0,
-	LinearY = 1,
-	LinearZ = 2,
-	AngularX = 3,
-	AngularY = 4,
-	AngularZ = 5,
-	Normal = 6
-}
-GameInputFeedbackAxes :: bit_set[GameInputFeedbackAxes_Flag; c.int]
-
-GameInputFeedbackEffectState :: enum c.int {
-	Stopped = 0,
-	Running = 1,
-	Paused = 2
-}
-
-GameInputFlightStickButtons_Flag :: enum c.int {
-	None = 0,
-	Menu = 1,
-	View = 2,
-	FirePrimary = 3,
-	FireSecondary = 4
-}
-GameInputFlightStickButtons :: bit_set[GameInputFlightStickButtons_Flag; c.int]
-
-GameInputFocusPolicy_Flag :: enum c.int {
-	DisableBackgroundInput = 0,
-	ExclusiveForegroundInput = 1,
-	DisableBackgroundGuideButton   = 2,
-	ExclusiveForegroundGuideButton = 3,
-	DisableBackgroundShareButton   = 4,
-	ExclusiveForegroundShareButton = 5
-}
-GameInputFocusPolicy :: bit_set[GameInputFocusPolicy_Flag; c.int]
-
-GameInputForceFeedbackEffectKind :: enum c.int {
-	Constant = 0,
-	Ramp = 1,
-	SineWave = 2,
-	SquareWave = 3,
-	TriangleWave = 4,
-	SawtoothUpWave = 5,
-	SawtoothDownWave = 6,
-	Spring = 7,
-	Friction = 8,
-	Damper = 9,
-	Inertia = 10
-}
-
-GameInputGamepadButtons_Flag :: enum c.int {
-	Menu = 0,
-	View = 1,
-	A = 2,
-	B = 3,
-	X = 4,
-	Y = 5,
-	DPadUp = 6,
-	DPadDown = 7,
-	DPadLeft = 8,
-	DPadRight = 9,
-	LeftShoulder = 10,
-	RightShoulder = 11,
-	LeftThumbstick = 12,
-	RightThumbstick = 13
-}
-GameInputGamepadButtons :: bit_set[GameInputGamepadButtons_Flag; c.int]
-
-GameInputKeyboardKind :: enum c.int {
-	UnknownKeyboard = -1,
-	AnsiKeyboard = 0,
-	IsoKeyboard = 1,
-	KsKeyboard = 2,
-	AbntKeyboard = 3,
-	JisKeyboard = 4
-}
-
-GameInputKind_Flag :: enum c.int {
-	RawDeviceReport = 0,
-	ControllerAxis	 = 1,
-	ControllerButton = 2,
-	ControllerSwitch = 3,
-	Keyboard = 4,
-	Mouse = 5,
-	Touch = 8,
-	Motion = 12,
-	ArcadeStick = 16,
-	FlightStick = 17,
-	Gamepad = 18,
-	RacingWheel = 19,
-	UiNavigation = 20
-}
-GameInputKind :: bit_set[GameInputKind_Flag; c.int]
-GameInputKind_Controller : GameInputKind : { .ControllerAxis, .ControllerButton, .ControllerSwitch }
-
-GameInputLabel :: enum c.int {
-	Unknown = -1,
-	None = 0,
-	XboxGuide = 1,
-	XboxBack = 2,
-	XboxStart = 3,
-	XboxMenu = 4,
-	XboxView = 5,
-	XboxA = 7,
-	XboxB = 8,
-	XboxX = 9,
-	XboxY = 10,
-	XboxDPadUp = 11,
-	XboxDPadDown = 12,
-	XboxDPadLeft = 13,
-	XboxDPadRight = 14,
-	XboxLeftShoulder = 15,
-	XboxLeftTrigger = 16,
-	XboxLeftStickButton = 17,
-	XboxRightShoulder = 18,
-	XboxRightTrigger = 19,
-	XboxRightStickButton = 20,
-	XboxPaddle1 = 21,
-	XboxPaddle2 = 22,
-	XboxPaddle3 = 23,
-	XboxPaddle4 = 24,
-	LetterA = 25,
-	LetterB = 26,
-	LetterC = 27,
-	LetterD = 28,
-	LetterE = 29,
-	LetterF = 30,
-	LetterG = 31,
-	LetterH = 32,
-	LetterI = 33,
-	LetterJ = 34,
-	LetterK = 35,
-	LetterL = 36,
-	LetterM = 37,
-	LetterN = 38,
-	LetterO = 39,
-	LetterP = 40,
-	LetterQ = 41,
-	LetterR = 42,
-	LetterS = 43,
-	LetterT = 44,
-	LetterU = 45,
-	LetterV = 46,
-	LetterW = 47,
-	LetterX = 48,
-	LetterY = 49,
-	LetterZ = 50,
-	Number0 = 51,
-	Number1 = 52,
-	Number2 = 53,
-	Number3 = 54,
-	Number4 = 55,
-	Number5 = 56,
-	Number6 = 57,
-	Number7 = 58,
-	Number8 = 59,
-	Number9 = 60,
-	ArrowUp = 61,
-	ArrowUpRight = 62,
-	ArrowRight = 63,
-	ArrowDownRight = 64,
-	ArrowDown = 65,
-	ArrowDownLLeft = 66,
-	ArrowLeft = 67,
-	ArrowUpLeft = 68,
-	ArrowUpDown = 69,
-	ArrowLeftRight = 70,
-	ArrowUpDownLeftRight = 71,
-	ArrowClockwise = 72,
-	ArrowCounterClockwise = 73,
-	ArrowReturn = 74,
-	IconBranding = 75,
-	IconHome = 76,
-	IconMenu = 77,
-	IconCross = 78,
-	IconCircle = 79,
-	IconSquare = 80,
-	IconTriangle = 81,
-	IconStar = 82,
-	IconDPadUp = 83,
-	IconDPadDown = 84,
-	IconDPadLeft = 85,
-	IconDPadRight = 86,
-	IconDialClockwise = 87,
-	IconDialCounterClockwise = 88,
-	IconSliderLeftRight = 89,
-	IconSliderUpDown = 90,
-	IconWheelUpDown = 91,
-	IconPlus = 92,
-	IconMinus = 93,
-	IconSuspension = 94,
-	Home = 95,
-	Guide = 96,
-	Mode = 97,
-	Select = 98,
-	Menu = 99,
-	View = 100,
-	Back = 101,
-	Start = 102,
-	Options = 103,
-	Share = 104,
-	Up = 105,
-	Down = 106,
-	Left = 107,
-	Right = 108,
-	LB = 109,
-	LT = 110,
-	LSB = 111,
-	L1 = 112,
-	L2 = 113,
-	L3 = 114,
-	RB = 115,
-	RT = 116,
-	RSB = 117,
-	R1 = 118,
-	R2 = 119,
-	R3 = 120,
-	P1 = 121,
-	P2 = 122,
-	P3 = 123,
-	P4 = 124
-}
-
-GameInputLocation :: enum c.int {
-	Unknown = -1,
-	Chassis = 0,
-	Display = 1,
-	Axis = 2,
-	Button = 3,
-	Switch = 4,
-	Key = 5,
-	TouchPad = 6
-}
-
-GameInputMotionAccuracy :: enum c.int {
-	AccuracyUnknown = -1,
-	Unavailable = 0,
-	Unreliable = 1,
-	Approximate = 2,
-	Accurate = 3
-}
-
-GameInputMouseButtons_Flag :: enum c.int {
-	LeftButton = 0,
-	RightButton = 1,
-	MiddleButton = 2,
-	Button4 = 3,
-	Button5 = 4,
-	WheelTiltLeft = 5,
-	WheelTiltRight = 6
-}
-GameInputMouseButtons :: bit_set[GameInputMouseButtons_Flag; c.int]
-
-GameInputRacingWheelButtons_Flag :: enum c.int {
-	Menu = 0,
-	View = 1,
-	PreviousGear = 2,
-	NextGear = 3,
-	DpadUp = 4,
-	DpadDown = 5,
-	DpadLeft = 6,
-	DpadRight = 7
-}
-GameInputRacingWheelButtons :: bit_set[GameInputRacingWheelButtons_Flag; c.int]
-
-GameInputRawDeviceItemCollectionKind :: enum c.int {
-	UnknownItemCollection = -1,
-	PhysicalItemCollection = 0,
-	ApplicationItemCollection = 1,
-	LogicalItemCollection = 2,
-	ReportItemCollection = 3,
-	NamedArrayItemCollection = 4,
-	UsageSwitchItemCollection = 5,
-	UsageModifierItemCollection = 6
-}
-
-GameInputRawDevicePhysicalUnitKind :: enum c.int {
-	Unknown = -1,
-	None = 0,
-	Time = 1,
-	Frequency = 2,
-	Length = 3,
-	Velocity = 4,
-	Acceleration = 5,
-	Mass = 6,
-	Momentum = 7,
-	Force = 8,
-	Pressure = 9,
-	Angle = 10,
-	AngularVelocity = 11,
-	AngularAcceleration = 12,
-	AngularMass = 13,
-	AngularMomentum = 14,
-	AngularTorque = 15,
-	ElectricCurrent = 16,
-	ElectricCharge = 17,
-	ElectricPotential = 18,
-	Energy = 19,
-	Power = 20,
-	Temperature = 21,
-	LuminousIntensity = 22,
-	LuminousFlux = 23,
-	Illuminance = 24
-}
-
-GameInputRawDeviceReportItemFlag :: enum c.int {
-	ConstantItem = 0,
-	ArrayItem = 1,
-	RelativeItem = 2,
-	WraparoundItem = 3,
-	NonlinearItem = 4,
-	StableItem = 5,
-	NullableItem = 6,
-	VolatileItem = 7,
-	BufferedItem = 8
-}
-GameInputRawDeviceReportItemFlags :: bit_set[GameInputRawDeviceReportItemFlag; c.int]
-
-GameInputRawDeviceReportKind :: enum c.int {
-	InputReport = 0,
-	OutputReport = 1,
-	FeatureReport = 2
-}
-
-GameInputRumbleMotors_Flag :: enum c.int {
-	LowFrequency = 0,
-	HighFrequency = 1,
-	LeftTrigger = 2,
-	RightTrigger = 3
-}
-GameInputRumbleMotors :: bit_set[GameInputRumbleMotors_Flag; c.int]
-
-GameInputSwitchKind :: enum c.int {
-	UnknownSwitchKind = -1,
-	GameInput2WaySwitch = 0,
-	GameInput4WaySwitch = 1,
-	GameInput8WaySwitch = 2
-}
-
-GameInputSwitchPosition :: enum c.int {
-	Center = 0,
-	Up = 1,
-	UpRight = 2,
-	Right = 3,
-	DownRight = 4,
-	Down = 5,
-	DownLeft = 6,
-	Left = 7,
-	UpLeft = 8
-}
-
-GameInputSystemButtons_Flag :: enum c.int {
-	Guide = 0,
-	Share = 1 
-}
-GameInputSystemButtons :: bit_set[GameInputSystemButtons_Flag; c.int]
-
-GameInputTouchShape :: enum c.int {
-	Unknown = -1,
-	Point = 0,
-	Shape1DLinear = 1,
-	Shape1DRadial = 2,
-	Shape1DIrregular = 3,
-	Shape2DRectangular = 4,
-	Shape2DElliptical = 5,
-	Shape2DIrregular = 6
-}
-
-GameInputUiNavigationButtons_Flag :: enum c.int {
-	Menu = 0,
-	View = 1,
-	Accept = 2,
-	Cancel = 3,
-	Up = 4,
-	Down = 5,
-	Left = 6,
-	Right = 7,
-	Context1 = 8,
-	Context2 = 9,
-	Context3 = 10,
-	Context4 = 11,
-	PageUp = 12,
-	PageDown = 13,
-	PageLeft = 14,
-	PageRight = 15,
-	ScrollUp = 16,
-	ScrollDown = 17,
-	ScrollLeft = 18,
-	ScrollRight = 19
-}
-GameInputUiNavigationButtons :: bit_set[GameInputUiNavigationButtons_Flag; c.int]
-
-// Structs
-
-APP_LOCAL_DEVICE_ID :: distinct [32]byte
-
-GameInputArcadeStickInfo :: struct {
-	menuButtonLabel: GameInputLabel,
-	viewButtonLabel: GameInputLabel,
-	stickUpLabel: GameInputLabel,
-	stickDownLabel: GameInputLabel,
-	stickLeftLabel: GameInputLabel,
-	stickRightLabel: GameInputLabel,
-	actionButton1Label: GameInputLabel,
-	actionButton2Label: GameInputLabel,
-	actionButton3Label: GameInputLabel,
-	actionButton4Label: GameInputLabel,
-	actionButton5Label: GameInputLabel,
-	actionButton6Label: GameInputLabel,
-	specialButton1Label: GameInputLabel,
-	specialButton2Label: GameInputLabel,
-}
-
-GameInputArcadeStickState :: struct {
-	buttons: GameInputArcadeStickButtons,
-}
-
-GameInputBatteryState :: struct {
-	chargeRate: f32,
-	maxChargeRate: f32,
-	remainingCapacity: f32,
-	fullChargeCapacity: f32,
-	status: GameInputBatteryStatus,
-}
-
-GameInputControllerAxisInfo :: struct {
-	mappedInputKinds: GameInputKind,
-	label: GameInputLabel,
-	isContinuous: bool,
-	isNonlinear: bool,
-	isQuantized: bool,
-	hasRestValue: bool,
-	restValue: f32,
-	resolution: u64,
-	legacyDInputIndex: u16,
-	legacyHidIndex: u16,
-	rawReportIndex: u32,
-	inputReport: ^GameInputRawDeviceReportInfo,
-	inputReportItem: ^GameInputRawDeviceReportItemInfo,
-}
-
-GameInputControllerButtonInfo :: struct {
-	mappedInputKinds: GameInputKind,
-	label: GameInputLabel,
-	legacyDInputIndex: u16,
-	legacyHidIndex: u16,
-	rawReportIndex: u32,
-	inputReport: ^GameInputRawDeviceReportInfo,
-	inputReportItem: ^GameInputRawDeviceReportItemInfo,
-}
-
-GameInputControllerSwitchInfo :: struct {
-	mappedInputKinds: GameInputKind,
-	label: GameInputLabel,
-	positionLabels: [9]GameInputLabel,
-	kind: GameInputSwitchKind,
-	legacyDInputIndex: u16,
-	legacyHidIndex: u16,
-	rawReportIndex: u32,
-	inputReport: ^GameInputRawDeviceReportInfo,
-	inputReportItem: ^GameInputRawDeviceReportItemInfo,
-}
-
-GameInputDeviceInfo :: struct {
-	infoSize: u32,
-	vendorId: u16,
-	productId: u16,
-	revisionNumber: u16,
-	interfaceNumber: u8,
-	collectionNumber: u8,
-	usage: GameInputUsage,
-	hardwareVersion: GameInputVersion,
-	firmwareVersion: GameInputVersion,
-	deviceId: APP_LOCAL_DEVICE_ID,
-	deviceRootId: APP_LOCAL_DEVICE_ID,
-	deviceFamily: GameInputDeviceFamily,
-	capabilities: GameInputDeviceCapabilities,
-	supportedInput: GameInputKind,
-	supportedRumbleMotors: GameInputRumbleMotors,
-	inputReportCount: u32,
-	outputReportCount: u32,
-	featureReportCount: u32,
-	controllerAxisCount: u32,
-	controllerButtonCount: u32,
-	controllerSwitchCount: u32,
-	touchPointCount: u32,
-	touchSensorCount: u32,
-	forceFeedbackMotorCount: u32,
-	hapticFeedbackMotorCount: u32,
-	deviceStringCount: u32,
-	deviceDescriptorSize: u32,
-	inputReportInfo: ^GameInputRawDeviceReportInfo,
-	outputReportInfo: ^GameInputRawDeviceReportInfo,
-	featureReportInfo: ^GameInputRawDeviceReportInfo,
-	controllerAxisInfo: ^GameInputControllerAxisInfo,
-	controllerButtonInfo: ^GameInputControllerButtonInfo,
-	controllerSwitchInfo: ^GameInputControllerSwitchInfo,
-	keyboardInfo: ^GameInputKeyboardInfo,
-	mouseInfo: ^GameInputMouseInfo,
-	touchSensorInfo: ^GameInputTouchSensorInfo,
-	motionInfo: ^GameInputMotionInfo,
-	arcadeStickInfo: ^GameInputArcadeStickInfo,
-	flightStickInfo: ^GameInputFlightStickInfo,
-	gamepadInfo: ^GameInputGamepadInfo,
-	racingWheelInfo: ^GameInputRacingWheelInfo,
-	uiNavigationInfo: ^GameInputUiNavigationInfo,
-	forceFeedbackMotorInfo: ^GameInputForceFeedbackMotorInfo,
-	hapticFeedbackMotorInfo: ^GameInputHapticFeedbackMotorInfo,
-	displayName: ^GameInputString,
-	deviceStrings: ^GameInputString,
-	deviceDescriptorData: rawptr,
-}
-
-GameInputFlightStickInfo :: struct {
-	menuButtonLabel: GameInputLabel,
-	viewButtonLabel: GameInputLabel,
-	firePrimaryButtonLabel: GameInputLabel,
-	fireSecondaryButtonLabel: GameInputLabel,
-	hatSwitchKind: GameInputSwitchKind,
-}
-
-GameInputFlightStickState :: struct {
-	buttons: GameInputFlightStickButtons,
-	hatSwitch: GameInputSwitchPosition,
-	roll: f32,
-	pitch: f32,
-	yaw: f32,
-	throttle: f32,
-}
-
-GameInputForceFeedbackConditionParams :: struct {
-	magnitude: GameInputForceFeedbackMagnitude,
-	positiveCoefficient: f32,
-	negativeCoefficient: f32,
-	maxPositiveMagnitude: f32,
-	maxNegativeMagnitude: f32,
-	deadZone: f32,
-	bias: f32,
-}
-
-GameInputForceFeedbackConstantParams :: struct {
-	envelope: GameInputForceFeedbackEnvelope,
-	magnitude: GameInputForceFeedbackMagnitude,
-}
-
-GameInputForceFeedbackEnvelope :: struct {
-	attackDuration: u64,
-	sustainDuration: u64,
-	releaseDuration: u64,
-	attackGain: f32,
-	sustainGain: f32,
-	releaseGain: f32,
-	playCount: u32,
-	repeatDelay: u64,
-}
-
-GameInputForceFeedbackMagnitude :: struct {
-	linearX: f32,
-	linearY: f32,
-	linearZ: f32,
-	angularX: f32,
-	angularY: f32,
-	angularZ: f32,
-	normal: f32,
-}
-
-GameInputForceFeedbackMotorInfo :: struct {
-	supportedAxes: GameInputFeedbackAxes,
-	location: GameInputLocation,
-	locationId: u32,
-	maxSimultaneousEffects: u32,
-	isConstantEffectSupported: bool,
-	isRampEffectSupported: bool,
-	isSineWaveEffectSupported: bool,
-	isSquareWaveEffectSupported: bool,
-	isTriangleWaveEffectSupported: bool,
-	isSawtoothUpWaveEffectSupported: bool,
-	isSawtoothDownWaveEffectSupported: bool,
-	isSpringEffectSupported: bool,
-	isFrictionEffectSupported: bool,
-	isDamperEffectSupported: bool,
-	isInertiaEffectSupported: bool,
-}
-
-GameInputForceFeedbackParams :: struct {
-	kind: GameInputForceFeedbackEffectKind,
-	using _: struct #raw_union {  
-	constant: GameInputForceFeedbackConstantParams,
-	ramp: GameInputForceFeedbackRampParams,
-	sineWave: GameInputForceFeedbackPeriodicParams,
-	squareWave: GameInputForceFeedbackPeriodicParams,
-	triangleWave: GameInputForceFeedbackPeriodicParams,
-	sawtoothUpWave: GameInputForceFeedbackPeriodicParams,
-	sawtoothDownWave: GameInputForceFeedbackPeriodicParams,
-	spring: GameInputForceFeedbackConditionParams,
-	friction: GameInputForceFeedbackConditionParams,
-	damper: GameInputForceFeedbackConditionParams,
-	inertia: GameInputForceFeedbackConditionParams,
-	}
-}
-
-GameInputForceFeedbackPeriodicParams :: struct {
-	envelope: GameInputForceFeedbackEnvelope,
-	magnitude: GameInputForceFeedbackMagnitude,
-	frequency: f32,
-	phase: f32,
-	bias: f32,
-}
-
-GameInputForceFeedbackRampParams :: struct {
-	envelope: GameInputForceFeedbackEnvelope,
-	startMagnitude: GameInputForceFeedbackMagnitude,
-	endMagnitude: GameInputForceFeedbackMagnitude,
-}
-
-GameInputGamepadInfo :: struct {
-	menuButtonLabel: GameInputLabel,
-	viewButtonLabel: GameInputLabel,
-	aButtonLabel: GameInputLabel,
-	bButtonLabel: GameInputLabel,
-	xButtonLabel: GameInputLabel,
-	yButtonLabel: GameInputLabel,
-	dpadUpLabel: GameInputLabel,
-	dpadDownLabel: GameInputLabel,
-	dpadLeftLabel: GameInputLabel,
-	dpadRightLabel: GameInputLabel,
-	leftShoulderButtonLabel: GameInputLabel,
-	rightShoulderButtonLabel: GameInputLabel,
-	leftThumbstickButtonLabel: GameInputLabel,
-	rightThumbstickButtonLabel: GameInputLabel,
-}
-
-GameInputGamepadState :: struct {
-	buttons: GameInputGamepadButtons,
-	leftTrigger: f32,
-	rightTrigger: f32,
-	leftThumbstickX: f32,
-	leftThumbstickY: f32,
-	rightThumbstickX: f32,
-	rightThumbstickY: f32,
-}
-
-GameInputHapticFeedbackMotorInfo :: struct {
-	mappedRumbleMotor: GameInputRumbleMotors,
-	location: GameInputLocation,
-	locationId: u32,
-	waveformCount: u32,
-	waveformInfo: [^]GameInputHapticWaveformInfo,
-}
-
-GameInputHapticFeedbackParams :: struct {
-	waveformIndex: u32,
-	duration: u64,
-	intensity: f32,
-	playCount: u32,
-	repeatDelay: u64,
-}
-
-GameInputHapticWaveformInfo :: struct {
-	usage: GameInputUsage,
-	isDurationSupported: bool,
-	isIntensitySupported: bool,
-	isRepeatSupported: bool,
-	isRepeatDelaySupported: bool,
-	defaultDuration: u64,
-}
-
-GameInputKeyboardInfo :: struct {
-	kind: GameInputKeyboardKind,
-	layout: u32,
-	keyCount: u32,
-	functionKeyCount: u32,
-	maxSimultaneousKeys: u32,
-	platformType: u32,
-	platformSubtype: u32,
-	nativeLanguage: ^GameInputString,
-}
-
-GameInputKeyState :: struct {
-	scanCode: u32,
-	codePoint: u32,
-	virtualKey: u8,
-	isDeadKey: bool,
-}
-
-GameInputMotionInfo :: struct {
-	maxAcceleration: f32,
-	maxAngularVelocity: f32,
-	maxMagneticFieldStrength: f32,
-}
-
-GameInputMotionState :: struct {
-	accelerationX: f32,
-	accelerationY: f32,
-	accelerationZ: f32,
-	angularVelocityX: f32,
-	angularVelocityY: f32,
-	angularVelocityZ: f32,
-	magneticFieldX: f32,
-	magneticFieldY: f32,
-	magneticFieldZ: f32,
-	orientationW: f32,
-	orientationX: f32,
-	orientationY: f32,
-	orientationZ: f32,
-	accelerometerAccuracy: GameInputMotionAccuracy,
-	gyroscopeAccuracy: GameInputMotionAccuracy,
-	magnetometerAccuracy: GameInputMotionAccuracy,
-	orientationAccuracy: GameInputMotionAccuracy,
-}
-
-GameInputMouseInfo :: struct {
-	supportedButtons: GameInputMouseButtons,
-	sampleRate: u32,
-	sensorDpi: u32,
-	hasWheelX: bool,
-	hasWheelY: bool,
-}
-
-GameInputMouseState :: struct {
-	buttons: GameInputMouseButtons,
-	positionX: i64,
-	positionY: i64,
-	wheelX: i64,
-	wheelY: i64,
-}
-
-GameInputRacingWheelInfo :: struct {
-	menuButtonLabel: GameInputLabel,
-	viewButtonLabel: GameInputLabel,
-	previousGearButtonLabel: GameInputLabel,
-	nextGearButtonLabel: GameInputLabel,
-	dpadUpLabel: GameInputLabel,
-	dpadDownLabel: GameInputLabel,
-	dpadLeftLabel: GameInputLabel,
-	dpadRightLabel: GameInputLabel,
-	hasClutch: bool,
-	hasHandbrake: bool,
-	hasPatternShifter: bool,
-	minPatternShifterGear: i32,
-	maxPatternShifterGear: i32,
-	maxWheelAngle: f32,
-}
-
-GameInputRacingWheelState :: struct {
-	buttons: GameInputRacingWheelButtons,
-	patternShifterGear: i32,
-	wheel: f32,
-	throttle: f32,
-	brake: f32,
-	clutch: f32,
-	handbrake: f32,
-}
-
-GameInputRawDeviceItemCollectionInfo :: struct {
-	kind: GameInputRawDeviceItemCollectionKind,
-	childCount: u32,
-	siblingCount: u32,
-	usageCount: u32,
-	usages: [^]GameInputUsage,
-	parent: ^GameInputRawDeviceItemCollectionInfo,
-	firstSibling: ^GameInputRawDeviceItemCollectionInfo,
-	previousSibling: ^GameInputRawDeviceItemCollectionInfo,
-	nextSibling: ^GameInputRawDeviceItemCollectionInfo,
-	lastSibling: ^GameInputRawDeviceItemCollectionInfo,
-	firstChild: ^GameInputRawDeviceItemCollectionInfo,
-	lastChild: ^GameInputRawDeviceItemCollectionInfo,
-}
-
-GameInputRawDeviceReportInfo :: struct {
-	kind: GameInputRawDeviceReportKind,
-	id: u32,
-	size: u32,
-	itemCount: u32,
-	items: [^]GameInputRawDeviceReportItemInfo,
-}
-
-GameInputRawDeviceReportItemInfo :: struct {
-	bitOffset: u32,
-	bitSize: u32,
-	logicalMin: i64,
-	logicalMax: i64,
-	physicalMin: f64,
-	physicalMax: f64,
-	physicalUnits: GameInputRawDevicePhysicalUnitKind,
-	rawPhysicalUnits: u32,
-	rawPhysicalUnitsExponent: i32,
-	flags: GameInputRawDeviceReportItemFlags,
-	usageCount: u32,
-	usages: [^]GameInputUsage,
-	collection: ^GameInputRawDeviceItemCollectionInfo,
-	itemString: ^GameInputString,
-}
-
-GameInputRumbleParams :: struct {
-	lowFrequency: f32,
-	highFrequency: f32,
-	leftTrigger: f32,
-	rightTrigger: f32,
-}
-
-GameInputString :: struct {
-	sizeInBytes: u32,
-	codePointCount: u32,
-	data: [^]byte,
-}
-
-GameInputTouchSensorInfo :: struct {
-	mappedInputKinds: GameInputKind,
-	label: GameInputLabel,
-	location: GameInputLocation,
-	locationId: u32,
-	resolutionX: u64,
-	resolutionY: u64,
-	shape: GameInputTouchShape,
-	aspectRatio: f32,
-	orientation: f32,
-	physicalWidth: f32,
-	physicalHeight: f32,
-	maxPressure: f32,
-	maxProximity: f32,
-	maxTouchPoints: u32,
-}
-
-GameInputTouchState :: struct {
-	touchId: u64,
-	sensorIndex: u32,
-	positionX: f32,
-	positionY: f32,
-	pressure: f32,
-	proximity: f32,
-	contactRectTop: f32,
-	contactRectLeft: f32,
-	contactRectRight: f32,
-	contactRectBottom: f32,
-}
-
-GameInputUiNavigationInfo :: struct {
-	menuButtonLabel: GameInputLabel,
-	viewButtonLabel: GameInputLabel,
-	acceptButtonLabel: GameInputLabel,
-	cancelButtonLabel: GameInputLabel,
-	upButtonLabel: GameInputLabel,
-	downButtonLabel: GameInputLabel,
-	leftButtonLabel: GameInputLabel,
-	rightButtonLabel: GameInputLabel,
-	contextButton1Label: GameInputLabel,
-	contextButton2Label: GameInputLabel,
-	contextButton3Label: GameInputLabel,
-	contextButton4Label: GameInputLabel,
-	pageUpButtonLabel: GameInputLabel,
-	pageDownButtonLabel: GameInputLabel,
-	pageLeftButtonLabel: GameInputLabel,
-	pageRightButtonLabel: GameInputLabel,
-	scrollUpButtonLabel: GameInputLabel,
-	scrollDownButtonLabel: GameInputLabel,
-	scrollLeftButtonLabel: GameInputLabel,
-	scrollRightButtonLabel: GameInputLabel,
-	guideButtonLabel: GameInputLabel,
-}
-
-GameInputUiNavigationState :: struct {
-	buttons: GameInputUiNavigationButtons,
-}
-
-GameInputUsage :: struct {
-	page: u16,
-	id: u16,
-}
-
-GameInputVersion :: struct {
-	major: u16,
-	minor: u16,
-	build: u16,
-	revision: u16,
-}
-
-// COM Interfaces
-
-IUnknown	:: windows.IUnknown
-IUnknown_VTable :: windows.IUnknown_VTable
-IID		:: windows.GUID
-
-IGameInput_UUID_STRING :: "11BE2A7E-4254-445A-9C09-FFC40F006918"
-IGameInput_UUID := &IID{0x11BE2A7E, 0x4254, 0x445A, {0x9C, 0x09, 0xFF, 0xC4, 0x0F, 0x00, 0x69, 0x18}}
-IGameInput :: struct #raw_union {
-	#subtype iunknown: IUnknown,
-	using igameinput_vtable: ^IGameInput_VTable,
-}
-IGameInput_VTable :: struct {
-	using iunknown_vtable: IUnknown_VTable,
-	GetCurrentTimestamp: proc "system" (this: ^IGameInput) -> u64,
-	GetCurrentReading: proc "system" (this: ^IGameInput, inputKind: GameInputKind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
-	GetNextReading: proc "system" (this: ^IGameInput, referenceReading: ^IGameInputReading, inputKind: GameInputKind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
-	GetPreviousReading: proc "system" (this: ^IGameInput, referenceReading: ^IGameInputReading, inputKind: GameInputKind, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
-	GetTemporalReading: proc "system" (this: ^IGameInput, timestamp: u64, device: ^IGameInputDevice, reading: ^^IGameInputReading) -> HRESULT,
-	RegisterReadingCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, inputKind: GameInputKind, analogThreshold: f32, ctx: rawptr, callbackFunc: GameInputReadingCallback, callbackToken: ^GameInputCallbackToken) -> HRESULT,
-	RegisterDeviceCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, inputKind: GameInputKind, statusFilter: GameInputDeviceStatus, enumerationKind: GameInputEnumerationKind, ctx: rawptr, callbackFunc: GameInputDeviceCallback, callbackToken: ^GameInputCallbackToken) -> HRESULT,
-	RegisterSystemButtonCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, buttonFilter: GameInputSystemButtons, ctx: rawptr, callbackFunc: GameInputSystemButtonCallback, callbackToken: ^GameInputCallbackToken) -> HRESULT,
-	RegisterKeyboardLayoutCallback: proc "system" (this: ^IGameInput, device: ^IGameInputDevice, ctx: rawptr, callbackFunc: GameInputKeyboardLayoutCallback, callbackToken: ^GameInputCallbackToken) -> HRESULT,
-	StopCallback: proc "system" (this: ^IGameInput, callbackToken: GameInputCallbackToken),
-	UnregisterCallback: proc "system" (this: ^IGameInput, callbackToken: GameInputCallbackToken, timeoutInMicroseconds: u64) -> bool,
-	CreateDispatcher: proc "system" (this: ^IGameInput, dispatcher: ^^IGameInputDispatcher) -> HRESULT,
-	CreateAggregateDevice: proc "system" (this: ^IGameInput, kind: GameInputKind, device: ^^IGameInputDevice) -> HRESULT,
-	FindDeviceFromId: proc "system" (this: ^IGameInput, value: ^APP_LOCAL_DEVICE_ID, device: ^^IGameInputDevice) -> HRESULT,
-	FindDeviceFromObject: proc "system" (this: ^IGameInput, value: ^IUnknown, device: ^^IGameInputDevice) -> HRESULT,
-	FindDeviceFromPlatformHandle: proc "system" (this: ^IGameInput, value: HANDLE, device: ^^IGameInputDevice) -> HRESULT,
-	FindDeviceFromPlatformString: proc "system" (this: ^IGameInput, value: windows.LPCWSTR, device: ^^IGameInputDevice) -> HRESULT,
-	EnableOemDeviceSupport: proc "system" (this: ^IGameInput, vendorId: u16, productId: u16, interfaceNumber: u8, collectionNumber: u8) -> HRESULT,
-	SetFocusPolicy: proc "system" (this: ^IGameInput, policy: GameInputFocusPolicy),
-}
-
-IGameInputReading_UUID_STRING :: "2156947A-E1FA-4DE0-A30B-D812931DBD8D"
-IGameInputReading_UUID := &IID{0x2156947A, 0xE1FA, 0x4DE0, {0xA3, 0x0B, 0xD8, 0x12, 0x93, 0x1D, 0x0BD, 0x8D}}
-IGameInputReading :: struct #raw_union {
-	#subtype iunknown: IUnknown,
-	using igameinputreading_vtable: ^IGameInputReading_VTable,
-}
-IGameInputReading_VTable :: struct {
-	using iunknown_vtable: IUnknown_VTable,
-	GetInputKind: proc "system" (this: ^IGameInputReading) -> GameInputKind,
-	GetSequenceNumber: proc "system" (this: ^IGameInputReading) -> u64,
-	GetTimestamp: proc "system" (this: ^IGameInputReading) -> u64,
-	GetDevice: proc "system" (this: ^IGameInputReading, device: ^^IGameInputDevice),
-	GetRawReport: proc "system" (this: ^IGameInputReading, report: ^^IGameInputRawDeviceReport) -> bool,
-	GetControllerAxisCount: proc "system" (this: ^IGameInputReading) -> u32,
-	GetControllerAxisState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]f32) -> u32,
-	GetControllerButtonCount: proc "system" (this: ^IGameInputReading) -> u32,
-	GetControllerButtonState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]bool) -> u32,
-	GetControllerSwitchCount: proc "system" (this: ^IGameInputReading) -> u32,
-	GetControllerSwitchState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]GameInputSwitchPosition) -> u32,
-	GetKeyCount: proc "system" (this: ^IGameInputReading) -> u32,
-	GetKeyState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]GameInputKeyState) -> u32,
-	GetMouseState: proc "system" (this: ^IGameInputReading, state: ^GameInputMouseState) -> bool,
-	GetTouchCount: proc "system" (this: ^IGameInputReading) -> u32,
-	GetTouchState: proc "system" (this: ^IGameInputReading, stateArrayCount: u32, stateArray: [^]GameInputTouchState) -> u32,
-	GetMotionState: proc "system" (this: ^IGameInputReading, state: ^GameInputMotionState) -> bool,
-	GetArcadeStickState: proc "system" (this: ^IGameInputReading, state: ^GameInputArcadeStickState) -> bool,
-	GetFlightStickState: proc "system" (this: ^IGameInputReading, state: ^GameInputFlightStickState) -> bool,
-	GetGamepadState: proc "system" (this: ^IGameInputReading, state: ^GameInputGamepadState) -> bool,
-	GetRacingWheelState: proc "system" (this: ^IGameInputReading, state: ^GameInputRacingWheelState) -> bool,
-	GetUiNavigationState: proc "system" (this: ^IGameInputReading, state: ^GameInputUiNavigationState) -> bool,
-}
-
-IGameInputDevice_UUID_STRING :: "31DD86FB-4C1B-408A-868F-439B3CD47125"
-IGameInputDevice_UUID := &IID{0x31DD86FB, 0x4C1B, 0x408A, {0x86, 0x8F, 0x43, 0x9B, 0x3C, 0xD4, 0x71, 0x25}}
-IGameInputDevice :: struct #raw_union {
-	#subtype iunknown: IUnknown,
-	using igameinputdevice_vtable: ^IGameInputDevice_Vtable,
-}
-IGameInputDevice_Vtable :: struct {
-	using iunknown_vtable: IUnknown_VTable,
-	GetDeviceInfo: proc "system" (this: ^IGameInputDevice) -> ^GameInputDeviceInfo,
-	GetDeviceStatus: proc "system" (this: ^IGameInputDevice) -> GameInputDeviceStatus,
-	GetBatteryState: proc "system" (this: ^IGameInputDevice, state: ^GameInputBatteryState),
-	CreateForceFeedbackEffect: proc "system" (this: ^IGameInputDevice, motorIndex: u32, params: ^GameInputForceFeedbackParams, effect: ^^IGameInputForceFeedbackEffect) -> HRESULT,
-	IsForceFeedbackMotorPoweredOn: proc "system" (this: ^IGameInputDevice, motorIndex: u32) -> bool,
-	SetForceFeedbackMotorGain: proc "system" (this: ^IGameInputDevice, motorIndex: u32, masterGain: f32),
-	SetHapticMotorState: proc "system" (this: ^IGameInputDevice, motorIndex: u32, params: ^GameInputHapticFeedbackParams) -> HRESULT,
-	SetRumbleState: proc "system" (this: ^IGameInputDevice, params: ^GameInputRumbleParams),
-	SetInputSynchronizationState: proc "system" (this: ^IGameInputDevice, enabled: bool),
-	SendInputSynchronizationHint: proc "system" (this: ^IGameInputDevice),
-	PowerOff: proc "system" (this: ^IGameInputDevice),
-	CreateRawDeviceReport: proc "system" (this: ^IGameInputDevice, reportId: u32, reportKind: GameInputRawDeviceReportKind, report: ^^IGameInputRawDeviceReport) -> HRESULT,
-	GetRawDeviceFeature: proc "system" (this: ^IGameInputDevice, reportId: u32, report: ^^IGameInputRawDeviceReport) -> HRESULT,
-	SetRawDeviceFeature: proc "system" (this: ^IGameInputDevice, report: ^IGameInputRawDeviceReport) -> HRESULT,
-	SendRawDeviceOutput: proc "system" (this: ^IGameInputDevice, report: ^IGameInputRawDeviceReport) -> HRESULT,
-	SendRawDeviceOutputWithResponse: proc "system" (this: ^IGameInputDevice, requestReport: ^IGameInputRawDeviceReport, responseReport: ^^IGameInputRawDeviceReport) -> HRESULT,
-	ExecuteRawDeviceIoControl: proc "system" (this: ^IGameInputDevice, controlCode: u32, inputBufferSize: c.size_t, inputBuffer: rawptr, outputBufferSize: c.size_t, outputBuffer: rawptr, outputSize: ^c.size_t) -> HRESULT,
-	AcquireExclusiveRawDeviceAccess: proc "system" (this: ^IGameInputDevice, timeoutInMicroseconds: u64) -> bool,
-	ReleaseExclusiveRawDeviceAccess: proc "system" (this: ^IGameInputDevice),
-}
-
-IGameInputDispatcher_UUID_STRING :: "415EED2E-98CB-42C2-8F28-B94601074E31"
-IGameInputDispatcher_UUID := &IID{0x415EED2E, 0x98CB, 0x42C2, {0x8F, 0x28, 0xB9, 0x46, 0x01, 0x07, 0x4E, 0x31}}
-IGameInputDispatcher :: struct #raw_union {
-	#subtype iunknown: IUnknown,
-	using igameinputdispatcher_vtable: ^IGameInputDispatcher_Vtable,
-}
-IGameInputDispatcher_Vtable :: struct {
-	using iunknown_vtable: IUnknown_VTable,
-	Dispatch: proc "system" (this: ^IGameInputDispatcher, quotaInMicroseconds: u64) -> bool,
-	OpenWaitHandle: proc "system" (this: ^IGameInputDispatcher, waitHandle: ^HANDLE) -> HRESULT,
-}
-
-IGameInputForceFeedbackEffect_UUID_STRING :: "51BDA05E-F742-45D9-B085-9444AE48381D"
-IGameInputForceFeedbackEffect_UUID := &IID{0x51BDA05E, 0xF742, 0x45D9, {0xB0, 0x85, 0x94, 0x44, 0xAE, 0x48, 0x38, 0x1D}}
-IGameInputForceFeedbackEffect :: struct #raw_union {
-	#subtype iunknown: IUnknown,
-	using igameinputforcefeedbackeffect_vtable: ^IGameInputForceFeedbackEffect_Vtable,
-}
-IGameInputForceFeedbackEffect_Vtable :: struct {
-	using iunknown_vtable: IUnknown_VTable,
-	GetDevice: proc "system" (this: ^IGameInputForceFeedbackEffect, device: ^^IGameInputDevice),
-	GetMotorIndex: proc "system" (this: ^IGameInputForceFeedbackEffect) -> u32,
-	GetGain: proc "system" (this: ^IGameInputForceFeedbackEffect) -> f32,
-	SetGain: proc "system" (this: ^IGameInputForceFeedbackEffect, gain: f32),
-	GetParams: proc "system" (this: ^IGameInputForceFeedbackEffect, params: ^GameInputForceFeedbackParams),
-	SetParams: proc "system" (this: ^IGameInputForceFeedbackEffect, params: ^GameInputForceFeedbackParams) -> bool,
-	GetState: proc "system" (this: ^IGameInputForceFeedbackEffect) -> GameInputFeedbackEffectState,
-	SetState: proc "system" (this: ^IGameInputForceFeedbackEffect, state: GameInputFeedbackEffectState),
-}
-
-IGameInputRawDeviceReport_UUID_STRING :: "61F08CF1-1FFC-40CA-A2B8-E1AB8BC5B6DC"
-IGameInputRawDeviceReport_UUID := &IID{0x61F08CF1, 0x1FFC, 0x40CA, {0xA2, 0xB8, 0xE1, 0xAB, 0x8B, 0xC5, 0xB6, 0xDC}}
-IGameInputRawDeviceReport :: struct #raw_union {
-	#subtype iunknown: IUnknown,
-	using igameinputrawdevicereport_vtable: ^IGameInputRawDeviceReport_Vtable,
-}
-IGameInputRawDeviceReport_Vtable :: struct {
-	using iunknown_vtable: IUnknown_VTable,
-	GetDevice: proc "system" (this: ^IGameInputRawDeviceReport, device: ^^IGameInputDevice),
-	GetReportInfo: proc "system" (this: ^IGameInputRawDeviceReport) -> ^GameInputRawDeviceReportInfo,
-	GetRawDataSize: proc "system" (this: ^IGameInputRawDeviceReport) -> c.size_t,
-	GetRawData: proc "system" (this: ^IGameInputRawDeviceReport, bufferSize: c.size_t, buffer: rawptr) -> c.size_t,
-	SetRawData: proc "system" (this: ^IGameInputRawDeviceReport, bufferSize: c.size_t, buffer: rawptr) -> bool,
-	GetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32, value: ^u64) -> bool,
-	SetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32, value: u64) -> bool,
-	ResetItemValue: proc "system" (this: ^IGameInputRawDeviceReport, itemIndex: u32) -> bool,
-	ResetAllItems: proc "system" (this: ^IGameInputRawDeviceReport) -> bool,
-}
-
-// Functions
-HRESULT :: windows.HRESULT
-HANDLE :: windows.HANDLE
-
-DEVICE_DISCONNECTED : HRESULT : -0x7C75FFFF
-DEVICE_NOT_FOUND : HRESULT : -0x7C75FFFE
-READING_NOT_FOUND : HRESULT : -0x7C75FFFD
-REFERENCE_READING_TOO_OLD : HRESULT : -0x7C75FFFC
-TIMESTAMP_OUT_OF_RANGE : HRESULT : -0x7C75FFFB
-INSUFFICIENT_FORCE_FEEDBACK_RESOURCES : HRESULT : -0x7C75FFFA
-
-GameInputCallbackToken :: distinct u64
-
-GAMEINPUT_CURRENT_CALLBACK_TOKEN_VALUE : GameInputCallbackToken : 0xFFFFFFFFFFFFFFFF
-GAMEINPUT_INVALID_CALLBACK_TOKEN_VALUE : GameInputCallbackToken : 0x0000000000000000
-
-@(default_calling_convention="system")
-foreign wgi {
-	GameInputCreate :: proc(gameInput: ^^IGameInput) -> HRESULT ---
-}
-
-GameInputDeviceCallback :: #type proc "system" (callbackToken: GameInputCallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentState: GameInputDeviceStatus, previousState: GameInputDeviceStatus)
-GameInputGuideButtonCallback :: #type proc "system" (callbackToken: GameInputCallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, isPressed: bool)
-GameInputSystemButtonCallback :: #type proc "system" (callbackToken: GameInputCallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentState: GameInputDeviceStatus, previousState: GameInputDeviceStatus)
-GameInputReadingCallback :: #type proc "system" (callbackToken: GameInputCallbackToken, ctx: rawptr, reading: ^IGameInputReading, hasOverrunOccured: bool)
-GameInputKeyboardLayoutCallback :: #type proc "system" (callbackToken: GameInputCallbackToken, ctx: rawptr, device: ^IGameInputDevice, timestamp: u64, currentState: GameInputDeviceStatus, previousState: GameInputDeviceStatus)
-