diff options
| author | gingerBill <bill@gingerbill.org> | 2025-01-30 14:48:09 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2025-01-30 14:48:09 +0000 |
| commit | 90fd4ffbbae0963e43de6dce9b39721a6e16a44c (patch) | |
| tree | ea324e64f4a78d1fc555f16f81ef1b2166ab9d61 | |
| parent | 54caf5f5764b3a36d31b2e5e1d63d2df79779228 (diff) | |
Add sdl3_joystick.odin
| -rw-r--r-- | vendor/sdl3/sdl3_joystick.odin | 170 |
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 --- +} |