aboutsummaryrefslogtreecommitdiff
path: root/vendor/sdl2/sdl_gamecontroller.odin
blob: be45d652026a17c9d453b30359b2d59aec8499bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package sdl2

import "core:c"

when ODIN_OS == .Windows {
	@(ignore_duplicates)
	foreign import lib "SDL2.lib"
} else {
	@(ignore_duplicates)
	foreign import lib "system:SDL2"
}

GameController :: struct {}

GameControllerType :: enum c.int {
	UNKNOWN = 0,
	XBOX360,
	XBOXONE,
	PS3,
	PS4,
	NINTENDO_SWITCH_PRO,
	VIRTUAL,
	PS5,
	AMAZON_LUNA,
	GOOGLE_STADIA,
}

GameControllerBindType :: enum c.int {
	NONE = 0,
	BUTTON,
	AXIS,
	HAT,
}

GameControllerButtonBind :: struct {
	bindType: GameControllerBindType,
	value: struct #raw_union {
		button: c.int,
		axis:   c.int,
		hat: struct {
			hat:      c.int,
			hat_mask: c.int,
		},
	},
}

GameControllerAxis :: enum c.int {
	INVALID = -1,
	LEFTX,
	LEFTY,
	RIGHTX,
	RIGHTY,
	TRIGGERLEFT,
	TRIGGERRIGHT,
	MAX,
}

GameControllerButton :: enum c.int {
	INVALID = -1,
	A,
	B,
	X,
	Y,
	BACK,
	GUIDE,
	START,
	LEFTSTICK,
	RIGHTSTICK,
	LEFTSHOULDER,
	RIGHTSHOULDER,
	DPAD_UP,
	DPAD_DOWN,
	DPAD_LEFT,
	DPAD_RIGHT,
	MISC1,    /* Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button */
	PADDLE1,  /* Xbox Elite paddle P1 */
	PADDLE2,  /* Xbox Elite paddle P3 */
	PADDLE3,  /* Xbox Elite paddle P2 */
	PADDLE4,  /* Xbox Elite paddle P4 */
	TOUCHPAD, /* PS4/PS5 touchpad button */
	MAX,
}


GameControllerAddMappingsFromFile :: #force_inline proc "c" (file: cstring) -> c.int {
	return GameControllerAddMappingsFromRW(RWFromFile(file, "rb"), true)
}


@(default_calling_convention="c", link_prefix="SDL_")
foreign lib {
	GameControllerAddMappingsFromRW     :: proc(rw: ^RWops, freerw: bool) -> c.int ---

	GameControllerAddMapping            :: proc(mappingString: cstring) -> c.int ---
	GameControllerNumMappings           :: proc() -> c.int ---
	GameControllerMappingForIndex       :: proc(mapping_index: c.int) -> cstring  ---
	GameControllerMappingForGUID        :: proc(guid: JoystickGUID) -> cstring  ---
	GameControllerMapping               :: proc(gamecontroller: ^GameController) -> cstring  ---
	IsGameController                    :: proc(joystick_index: c.int) -> bool ---
	GameControllerNameForIndex          :: proc(joystick_index: c.int) -> cstring ---
	GameControllerTypeForIndex          :: proc(joystick_index: c.int) -> GameControllerType ---
	GameControllerMappingForDeviceIndex :: proc(joystick_index: c.int) -> cstring ---
	GameControllerOpen                  :: proc(joystick_index: c.int) -> ^GameController ---
	GameControllerFromInstanceID        :: proc(joyid: JoystickID)     -> ^GameController ---
	GameControllerFromPlayerIndex       :: proc(player_index: c.int)   -> ^GameController ---
	GameControllerName                  :: proc(gamecontroller: ^GameController) -> cstring  ---
	GameControllerGetType               :: proc(gamecontroller: ^GameController) -> GameControllerType ---
	GameControllerGetPlayerIndex        :: proc(gamecontroller: ^GameController) -> c.int ---
	GameControllerSetPlayerIndex        :: proc(gamecontroller: ^GameController, player_index: c.int) ---
	GameControllerGetVendor             :: proc(gamecontroller: ^GameController) -> u16 ---
	GameControllerGetProduct            :: proc(gamecontroller: ^GameController) -> u16 ---
	GameControllerGetProductVersion     :: proc(gamecontroller: ^GameController) -> u16 ---
	GameControllerGetSerial             :: proc(gamecontroller: ^GameController) -> cstring ---
	GameControllerGetAttached           :: proc(gamecontroller: ^GameController) -> bool ---
	GameControllerGetJoystick           :: proc(gamecontroller: ^GameController) -> ^Joystick ---
	GameControllerEventState            :: proc(state: c.int) -> c.int ---
	GameControllerUpdate                :: proc() ---

	GameControllerGetAxisFromString     :: proc(str: cstring) -> GameControllerAxis ---
	GameControllerGetStringForAxis      :: proc(axis: GameControllerAxis) -> cstring ---
	GameControllerGetBindForAxis        :: proc(gamecontroller: ^GameController, axis: GameControllerAxis)  -> GameControllerButtonBind---
	GameControllerHasAxis               :: proc(gamecontroller: ^GameController, axis: GameControllerAxis) -> bool ---
	GameControllerGetAxis               :: proc(gamecontroller: ^GameController, axis: GameControllerAxis) -> i16 ---

	GameControllerGetButtonFromString   :: proc(str: cstring) -> GameControllerButton ---
	GameControllerGetStringForButton    :: proc(button: GameControllerButton) -> cstring ---
	GameControllerGetBindForButton      :: proc(gamecontroller: ^GameController, button: GameControllerButton) -> GameControllerButtonBind ---
	GameControllerHasButton             :: proc(gamecontroller: ^GameController, button: GameControllerButton) -> bool ---
	GameControllerGetButton             :: proc(gamecontroller: ^GameController, button: GameControllerButton) -> u8 ---
	GameControllerGetNumTouchpads       :: proc(gamecontroller: ^GameController) -> c.int ---
	GameControllerGetNumTouchpadFingers :: proc(gamecontroller: ^GameController, touchpad: c.int) -> c.int ---
	GameControllerGetTouchpadFinger     :: proc(gamecontroller: ^GameController, touchpad: c.int, finger: c.int, state: ^u8, x, y: ^f32, pressure: ^f32) -> c.int ---
	GameControllerHasSensor             :: proc(gamecontroller: ^GameController, type: SensorType) -> bool ---
	GameControllerSetSensorEnabled      :: proc(gamecontroller: ^GameController, type: SensorType, enabled: bool) -> c.int ---
	GameControllerIsSensorEnabled       :: proc(gamecontroller: ^GameController, type: SensorType) -> bool ---
	GameControllerGetSensorDataRate     :: proc(gamecontroller: ^GameController, type: SensorType) -> f32 ---
	GameControllerGetSensorData         :: proc(gamecontroller: ^GameController, type: SensorType, data: [^]f32, num_values: c.int) -> c.int ---
	GameControllerRumble                :: proc(gamecontroller: ^GameController, low_frequency_rumble, high_frequency_rumble: u16, duration_ms: u32) -> c.int ---
	GameControllerRumbleTriggers        :: proc(gamecontroller: ^GameController, left_rumble, right_rumble: u16, duration_ms: u32) -> c.int ---
	GameControllerHasLED                :: proc(gamecontroller: ^GameController) -> bool ---
	GameControllerSetLED                :: proc(gamecontroller: ^GameController, red, green, blue: u8) -> c.int ---
	GameControllerSendEffect            :: proc(gamecontroller: ^GameController, data: rawptr, size: c.int) -> c.int ---
	GameControllerClose                 :: proc(gamecontroller: ^GameController) ---
}