aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2025-01-30 14:48:09 +0000
committergingerBill <bill@gingerbill.org>2025-01-30 14:48:09 +0000
commit90fd4ffbbae0963e43de6dce9b39721a6e16a44c (patch)
treeea324e64f4a78d1fc555f16f81ef1b2166ab9d61
parent54caf5f5764b3a36d31b2e5e1d63d2df79779228 (diff)
Add sdl3_joystick.odin
-rw-r--r--vendor/sdl3/sdl3_joystick.odin170
1 files changed, 170 insertions, 0 deletions
diff --git a/vendor/sdl3/sdl3_joystick.odin b/vendor/sdl3/sdl3_joystick.odin
new file mode 100644
index 000000000..b0f855e8b
--- /dev/null
+++ b/vendor/sdl3/sdl3_joystick.odin
@@ -0,0 +1,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, /**< A pointer to an array of touchpad descriptions, required if `ntouchpads` is > 0 */
+ sensors: [^]VirtualJoystickSensorDesc, /**< 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 ---
+}