aboutsummaryrefslogtreecommitdiff
path: root/vendor/sdl3/sdl3_joystick.odin
blob: 78da26923305e732527d989bc1a85d5a11b06c9c (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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package sdl3

import "core:c"

@(link_prefix="SDL_")
foreign lib {
	joystick_lock: ^Mutex
}

Joystick :: struct {}
JoystickID :: distinct Uint32


JoystickType :: enum c.int {
	UNKNOWN,
	GAMEPAD,
	WHEEL,
	ARCADE_STICK,
	FLIGHT_STICK,
	DANCE_PAD,
	GUITAR,
	DRUM_KIT,
	ARCADE_PAD,
	THROTTLE,
}

JOYSTICK_TYPE_COUNT :: len(JoystickType)

JoystickConnectionState :: enum c.int {
	INVALID = -1,
	UNKNOWN,
	WIRED,
	WIRELESS,
}

JOYSTICK_AXIS_MAX :: +32767
JOYSTICK_AXIS_MIN :: -32768


@(default_calling_convention="c", link_prefix="SDL_")
foreign lib {
	LockJoysticks                  :: proc() ---
	UnlockJoysticks                :: proc() ---
	HasJoystick                    :: proc() -> bool ---
	GetJoysticks                   :: proc(count: ^c.int) -> [^]JoystickID ---
	GetJoystickNameForID           :: proc(instance_id: JoystickID) -> cstring ---
	GetJoystickPathForID           :: proc(instance_id: JoystickID) -> cstring ---
	GetJoystickPlayerIndexForID    :: proc(instance_id: JoystickID) -> c.int ---
	GetJoystickGUIDForID           :: proc(instance_id: JoystickID) -> GUID ---
	GetJoystickVendorForID         :: proc(instance_id: JoystickID) -> Uint16 ---
	GetJoystickProductForID        :: proc(instance_id: JoystickID) -> Uint16 ---
	GetJoystickProductVersionForID :: proc(instance_id: JoystickID) -> Uint16 ---
	GetJoystickTypeForID           :: proc(instance_id: JoystickID) -> JoystickType ---
	OpenJoystick                   :: proc(instance_id: JoystickID) -> ^Joystick ---
	GetJoystickFromID              :: proc(instance_id: JoystickID) -> ^Joystick ---
	GetJoystickFromPlayerIndex     :: proc(player_index: c.int) -> ^Joystick ---
}

VirtualJoystickTouchpadDesc :: struct {
	nfingers: Uint16,    /**< the number of simultaneous fingers on this touchpad */
	padding:  [3]Uint16,
}

VirtualJoystickSensorDesc :: struct {
	type: SensorType,    /**< the type of this sensor */
	rate: f32,           /**< the update frequency of this sensor, may be 0.0f */
}

VirtualJoystickDesc :: struct {
	version:     Uint32,    /**< the version of this interface */
	type:        Uint16,    /**< `SDL_JoystickType` */
	padding:     Uint16,    /**< unused */
	vendor_id:   Uint16,    /**< the USB vendor ID of this joystick */
	product_id:  Uint16,    /**< the USB product ID of this joystick */
	naxes:       Uint16,    /**< the number of axes on this joystick */
	nbuttons:    Uint16,    /**< the number of buttons on this joystick */
	nballs:      Uint16,    /**< the number of balls on this joystick */
	nhats:       Uint16,    /**< the number of hats on this joystick */
	ntouchpads:  Uint16,    /**< the number of touchpads on this joystick, requires `touchpads` to point at valid descriptions */
	nsensors:    Uint16,    /**< the number of sensors on this joystick, requires `sensors` to point at valid descriptions */
	padding2:    [2]Uint16, /**< unused */
	button_mask: Uint32,    /**< A mask of which buttons are valid for this controller
                                     e.g. (1 << SDL_GAMEPAD_BUTTON_SOUTH) */
	axis_mask: Uint32,      /**< A mask of which axes are valid for this controller
	                             e.g. (1 << SDL_GAMEPAD_AXIS_LEFTX) */

	name:      cstring,                          /**< the name of the joystick */
	touchpads: [^]VirtualJoystickTouchpadDesc `fmt:"v,ntouchpads"`,   /**< A pointer to an array of touchpad descriptions, required if `ntouchpads` is > 0 */
	sensors:   [^]VirtualJoystickSensorDesc   `fmt:"v,nsensors"`,     /**< A pointer to an array of sensor descriptions, required if `nsensors` is > 0 */

	userdata:          rawptr,                                                                                   /**< User data pointer passed to callbacks */
	Update:            proc "c" (userdata: rawptr),                                                              /**< Called when the joystick state should be updated */
	SetPlayerIndex:    proc "c" (userdata: rawptr, player_index: c.int),                                         /**< Called when the player index is set */
	Rumble:            proc "c" (userdata: rawptr, low_frequency_rumble, high_frequency_rumble: Uint16) -> bool, /**< Implements SDL_RumbleJoystick() */
	RumbleTriggers:    proc "c" (userdata: rawptr, left_rumble, right_rumble: Uint16) -> bool,                   /**< Implements SDL_RumbleJoystickTriggers() */
	SetLED:            proc "c" (userdata: rawptr, red, green, blue: Uint8) -> bool,                             /**< Implements SDL_SetJoystickLED() */
	SendEffect:        proc "c" (userdata: rawptr, data: rawptr, size: c.int) -> bool,                           /**< Implements SDL_SendJoystickEffect() */
	SetSensorsEnabled: proc "c" (userdata: rawptr, enabled: bool) -> bool,                                       /**< Implements SDL_SetGamepadSensorEnabled() */
	Cleanup:           proc "c" (userdata: rawptr),                                                              /**< Cleans up the userdata when the joystick is detached */
}

#assert(
	(size_of(VirtualJoystickDesc) ==  84 && size_of(rawptr) == 4) ||
	(size_of(VirtualJoystickDesc) == 136 && size_of(rawptr) == 8),
)


PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN       :: "SDL.joystick.cap.mono_led"
PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN        :: "SDL.joystick.cap.rgb_led"
PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN     :: "SDL.joystick.cap.player_led"
PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN         :: "SDL.joystick.cap.rumble"
PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN :: "SDL.joystick.cap.trigger_rumble"


HAT_CENTERED  :: 0x00
HAT_UP        :: 0x01
HAT_RIGHT     :: 0x02
HAT_DOWN      :: 0x04
HAT_LEFT      :: 0x08
HAT_RIGHTUP   :: HAT_RIGHT|HAT_UP
HAT_RIGHTDOWN :: HAT_RIGHT|HAT_DOWN
HAT_LEFTUP    :: HAT_LEFT|HAT_UP
HAT_LEFTDOWN  :: HAT_LEFT|HAT_DOWN

@(default_calling_convention="c", link_prefix="SDL_")
foreign lib {
	AttachVirtualJoystick         :: proc(#by_ptr desc: VirtualJoystickDesc) -> JoystickID ---
	DetachVirtualJoystick         :: proc(instance_id: JoystickID) -> bool ---
	IsJoystickVirtual             :: proc(instance_id: JoystickID) -> bool ---
	SetJoystickVirtualAxis        :: proc(joystick: ^Joystick, axis: c.int, value: Sint16) -> bool ---
	SetJoystickVirtualBall        :: proc(joystick: ^Joystick, ball: c.int, xrel, yrel: Sint16) -> bool ---
	SetJoystickVirtualButton      :: proc(joystick: ^Joystick, button: c.int, down: bool) -> bool ---
	SetJoystickVirtualHat         :: proc(joystick: ^Joystick, hat: c.int, value: Uint8) -> bool ---
	SetJoystickVirtualTouchpad    :: proc(joystick: ^Joystick, touchpad: c.int, finger: c.int, down: bool, x, y: f32, pressure: f32) -> bool ---
	SendJoystickVirtualSensorData :: proc(joystick: ^Joystick, type: SensorType, sensor_timestamp: Uint64, data: [^]f32, num_values: c.int) -> bool ---
	GetJoystickProperties         :: proc(joystick: ^Joystick) -> PropertiesID ---
	GetJoystickName               :: proc(joystick: ^Joystick) -> cstring ---
	GetJoystickPath               :: proc(joystick: ^Joystick) -> cstring ---
	GetJoystickPlayerIndex        :: proc(joystick: ^Joystick) -> c.int ---
	SetJoystickPlayerIndex        :: proc(joystick: ^Joystick, player_index: c.int) -> bool ---
	GetJoystickGUID               :: proc(joystick: ^Joystick) -> GUID ---
	GetJoystickVendor             :: proc(joystick: ^Joystick) -> Uint16 ---
	GetJoystickProduct            :: proc(joystick: ^Joystick) -> Uint16 ---
	GetJoystickProductVersion     :: proc(joystick: ^Joystick) -> Uint16 ---
	GetJoystickFirmwareVersion    :: proc(joystick: ^Joystick) -> Uint16 ---
	GetJoystickSerial             :: proc(joystick: ^Joystick) -> cstring ---
	GetJoystickType               :: proc(joystick: ^Joystick) -> JoystickType ---
	GetJoystickGUIDInfo           :: proc(guid: GUID, vendor, product, version, crc16: ^Uint16) ---
	JoystickConnected             :: proc(joystick: ^Joystick) -> bool ---
	GetJoystickID                 :: proc(joystick: ^Joystick) -> JoystickID ---
	GetNumJoystickAxes            :: proc(joystick: ^Joystick) -> c.int ---
	GetNumJoystickBalls           :: proc(joystick: ^Joystick) -> c.int ---
	GetNumJoystickHats            :: proc(joystick: ^Joystick) -> c.int ---
	GetNumJoystickButtons         :: proc(joystick: ^Joystick) -> c.int ---
	SetJoystickEventsEnabled      :: proc(enabled: bool) ---
	JoystickEventsEnabled         :: proc() -> bool ---
	UpdateJoysticks               :: proc() ---
	GetJoystickAxis               :: proc(joystick: ^Joystick, axis: c.int) -> Sint16 ---
	GetJoystickAxisInitialState   :: proc(joystick: ^Joystick, axis: c.int, state: ^Sint16) -> bool ---
	GetJoystickBall               :: proc(joystick: ^Joystick, ball: c.int, dx, dy: ^c.int) -> bool ---
	GetJoystickHat                :: proc(joystick: ^Joystick, hat: c.int) -> Uint8 ---
	GetJoystickButton             :: proc(joystick: ^Joystick, button: c.int) -> bool ---
	RumbleJoystick                :: proc(joystick: ^Joystick, low_frequency_rumble, high_frequency_rumble: Uint16, duration_ms: Uint32) -> bool ---
	RumbleJoystickTriggers        :: proc(joystick: ^Joystick, left_rumble, right_rumble: Uint16, duration_ms: Uint32) -> bool ---
	SetJoystickLED                :: proc(joystick: ^Joystick, red, green, blue: Uint8) -> bool ---
	SendJoystickEffect            :: proc(joystick: ^Joystick, data: rawptr, size: c.int) -> bool ---
	CloseJoystick                 :: proc(joystick: ^Joystick) ---
	GetJoystickConnectionState    :: proc(joystick: ^Joystick) -> JoystickConnectionState ---
	GetJoystickPowerInfo          :: proc(joystick: ^Joystick, percent: c.int) -> PowerState ---
}