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) ---
}
|