Working example

This commit is contained in:
2025-12-15 12:37:50 -05:00
commit 4ff4b04f06
165 changed files with 94256 additions and 0 deletions

233
sdl3/sdl3_haptic.odin Normal file
View File

@@ -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="SDL_", 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 ---
}