diff --git a/vendor/sdl3/sdl3_haptic.odin b/vendor/sdl3/sdl3_haptic.odin new file mode 100644 index 000000000..4cef7ed72 --- /dev/null +++ b/vendor/sdl3/sdl3_haptic.odin @@ -0,0 +1,233 @@ +package sdl3 + +import "core:c" + +Haptic :: struct {} + +HapticType :: Uint16 + +HAPTIC_CONSTANT :: 1<<0 +HAPTIC_SINE :: 1<<1 +HAPTIC_SQUARE :: 1<<2 +HAPTIC_TRIANGLE :: 1<<3 +HAPTIC_SAWTOOTHUP :: 1<<4 +HAPTIC_SAWTOOTHDOWN :: 1<<5 +HAPTIC_RAMP :: 1<<6 +HAPTIC_SPRING :: 1<<7 +HAPTIC_DAMPER :: 1<<8 +HAPTIC_INERTIA :: 1<<9 +HAPTIC_FRICTION :: 1<<10 +HAPTIC_LEFTRIGHT :: 1<<11 +HAPTIC_RESERVED1 :: 1<<12 +HAPTIC_RESERVED2 :: 1<<13 +HAPTIC_RESERVED3 :: 1<<14 +HAPTIC_CUSTOM :: 1<<15 +HAPTIC_GAIN :: 1<<16 +HAPTIC_AUTOCENTER :: 1<<17 +HAPTIC_STATUS :: 1<<18 +HAPTIC_PAUSE :: 1<<19 + +HapticDirectionType :: enum Uint8 { + POLAR = 0, + CARTESIAN = 1, + SPHERICAL = 2, + STEERING_AXIS = 3, +} + +HAPTIC_INFINITY :: c.uint(4294967295) + + +HapticDirection :: struct { + type: HapticDirectionType, /**< The type of encoding. */ + dir: [3]Sint32, /**< The encoded direction. */ +} + + +HapticConstant :: struct { + /* Header */ + type: HapticType, /**< HAPTIC_CONSTANT */ + direction: HapticDirection, /**< Direction of the effect. */ + + /* Replay */ + length: Uint32, /**< Duration of the effect. */ + delay: Uint16, /**< Delay before starting the effect. */ + + /* Trigger */ + button: Uint16, /**< Button that triggers the effect. */ + interval: Uint16, /**< How soon it can be triggered again after button. */ + + /* Constant */ + level: Sint16, /**< Strength of the constant effect. */ + + /* Envelope */ + attack_length: Uint16, /**< Duration of the attack. */ + attack_level: Uint16, /**< Level at the start of the attack. */ + fade_length: Uint16, /**< Duration of the fade. */ + fade_level: Uint16, /**< Level at the end of the fade. */ +} + +HapticPeriodic :: struct { + /* Header */ + type: HapticType, /**< HAPTIC_SINE, HAPTIC_SQUARE + HAPTIC_TRIANGLE, HAPTIC_SAWTOOTHUP or + HAPTIC_SAWTOOTHDOWN */ + direction: HapticDirection, /**< Direction of the effect. */ + + /* Replay */ + length: Uint32, /**< Duration of the effect. */ + delay: Uint16, /**< Delay before starting the effect. */ + + /* Trigger */ + button: Uint16, /**< Button that triggers the effect. */ + interval: Uint16, /**< How soon it can be triggered again after button. */ + + /* Periodic */ + period: Uint16, /**< Period of the wave. */ + magnitude: Sint16, /**< Peak value; if negative, equivalent to 180 degrees extra phase shift. */ + offset: Sint16, /**< Mean value of the wave. */ + phase: Uint16, /**< Positive phase shift given by hundredth of a degree. */ + + /* Envelope */ + attack_length: Uint16, /**< Duration of the attack. */ + attack_level: Uint16, /**< Level at the start of the attack. */ + fade_length: Uint16, /**< Duration of the fade. */ + fade_level: Uint16, /**< Level at the end of the fade. */ +} + +HapticCondition :: struct { + /* Header */ + type: HapticType, /**< HAPTIC_SPRING, HAPTIC_DAMPER, + HAPTIC_INERTIA or HAPTIC_FRICTION */ + direction: HapticDirection, /**< Direction of the effect. */ + + /* Replay */ + length: Uint32, /**< Duration of the effect. */ + delay: Uint16, /**< Delay before starting the effect. */ + + /* Trigger */ + button: Uint16, /**< Button that triggers the effect. */ + interval: Uint16, /**< How soon it can be triggered again after button. */ + + /* Condition */ + right_sat: [3]Uint16, /**< Level when joystick is to the positive side; max 0xFFFF. */ + left_sat: [3]Uint16, /**< Level when joystick is to the negative side; max 0xFFFF. */ + right_coeff: [3]Sint16, /**< How fast to increase the force towards the positive side. */ + left_coeff: [3]Sint16, /**< How fast to increase the force towards the negative side. */ + deadband: [3]Uint16, /**< Size of the dead zone; max 0xFFFF: whole axis-range when 0-centered. */ + center: [3]Sint16, /**< Position of the dead zone. */ +} + +HapticRamp :: struct { + /* Header */ + type: HapticType, /**< HAPTIC_RAMP */ + direction: HapticDirection, /**< Direction of the effect. */ + + /* Replay */ + length: Uint32, /**< Duration of the effect. */ + delay: Uint16, /**< Delay before starting the effect. */ + + /* Trigger */ + button: Uint16, /**< Button that triggers the effect. */ + interval: Uint16, /**< How soon it can be triggered again after button. */ + + /* Ramp */ + start: Sint16, /**< Beginning strength level. */ + end: Sint16, /**< Ending strength level. */ + + /* Envelope */ + attack_length: Uint16, /**< Duration of the attack. */ + attack_level: Uint16, /**< Level at the start of the attack. */ + fade_length: Uint16, /**< Duration of the fade. */ + fade_level: Uint16, /**< Level at the end of the fade. */ +} + + +HapticLeftRight :: struct { + /* Header */ + type: HapticType, /**< HAPTIC_LEFTRIGHT */ + + /* Replay */ + length: Uint32, /**< Duration of the effect in milliseconds. */ + + /* Rumble */ + large_magnitude: Uint16, /**< Control of the large controller motor. */ + small_magnitude: Uint16, /**< Control of the small controller motor. */ +} + + +HapticCustom :: struct { + /* Header */ + type: HapticType, /**< HAPTIC_CUSTOM */ + direction: HapticDirection, /**< Direction of the effect. */ + + /* Replay */ + length: Uint32, /**< Duration of the effect. */ + delay: Uint16, /**< Delay before starting the effect. */ + + /* Trigger */ + button: Uint16, /**< Button that triggers the effect. */ + interval: Uint16, /**< How soon it can be triggered again after button. */ + + /* Custom */ + channels: Uint8, /**< Axes to use, minimum of one. */ + period: Uint16, /**< Sample periods. */ + samples: Uint16, /**< Amount of samples. */ + data: [^]Uint16, /**< Should contain channels*samples items. */ + + /* Envelope */ + attack_length: Uint16, /**< Duration of the attack. */ + attack_level: Uint16, /**< Level at the start of the attack. */ + fade_length: Uint16, /**< Duration of the fade. */ + fade_level: Uint16, /**< Level at the end of the fade. */ +} + + +HapticEffect :: struct #raw_union { + /* Common for all force feedback effects */ + type: HapticType, /**< Effect type. */ + constant: HapticConstant, /**< Constant effect. */ + periodic: HapticPeriodic, /**< Periodic effect. */ + condition: HapticCondition, /**< Condition effect. */ + ramp: HapticRamp, /**< Ramp effect. */ + leftright: HapticLeftRight, /**< Left/Right effect. */ + custom: HapticCustom, /**< Custom effect. */ +} + + +HapticID :: distinct Uint32 + + +@(default_calling_convention="c", link_prefix="", require_results) +foreign lib { + GetHaptics :: proc(count: ^c.int) -> ^HapticID --- + GetHapticNameForID :: proc(instance_id: HapticID) -> cstring --- + OpenHaptic :: proc(instance_id: HapticID) -> ^Haptic --- + GetHapticFromID :: proc(instance_id: HapticID) -> ^Haptic --- + GetHapticID :: proc(haptic: ^Haptic) -> HapticID --- + GetHapticName :: proc(haptic: ^Haptic) -> cstring --- + IsMouseHaptic :: proc() -> bool --- + OpenHapticFromMouse :: proc() -> ^Haptic --- + IsJoystickHaptic :: proc(joystick: ^Joystick) -> bool --- + OpenHapticFromJoystick :: proc(joystick: ^Joystick) -> ^Haptic --- + CloseHaptic :: proc(haptic: ^Haptic) --- + GetMaxHapticEffects :: proc(haptic: ^Haptic) -> c.int --- + GetMaxHapticEffectsPlaying :: proc(haptic: ^Haptic) -> c.int --- + GetHapticFeatures :: proc(haptic: ^Haptic) -> Uint32 --- + GetNumHapticAxes :: proc(haptic: ^Haptic) -> c.int --- + HapticEffectSupported :: proc(haptic: ^Haptic, #by_ptr effect: HapticEffect) -> bool --- + CreateHapticEffect :: proc(haptic: ^Haptic, #by_ptr effect: HapticEffect) -> c.int --- + UpdateHapticEffect :: proc(haptic: ^Haptic, effect: c.int, #by_ptr data: HapticEffect) -> bool --- + RunHapticEffect :: proc(haptic: ^Haptic, effect: c.int, iterations: Uint32) -> bool --- + StopHapticEffect :: proc(haptic: ^Haptic, effect: c.int) -> bool --- + DestroyHapticEffect :: proc(haptic: ^Haptic, effect: c.int) --- + GetHapticEffectStatus :: proc(haptic: ^Haptic, effect: c.int) -> bool --- + SetHapticGain :: proc(haptic: ^Haptic, gain: c.int) -> bool --- + SetHapticAutocenter :: proc(haptic: ^Haptic, autocenter: c.int) -> bool --- + PauseHaptic :: proc(haptic: ^Haptic) -> bool --- + ResumeHaptic :: proc(haptic: ^Haptic) -> bool --- + StopHapticEffects :: proc(haptic: ^Haptic) -> bool --- + HapticRumbleSupported :: proc(haptic: ^Haptic) -> bool --- + InitHapticRumble :: proc(haptic: ^Haptic) -> bool --- + PlayHapticRumble :: proc(haptic: ^Haptic, strength: f32, length: Uint32) -> bool --- + StopHapticRumble :: proc(haptic: ^Haptic) -> bool --- +} \ No newline at end of file