Working example
This commit is contained in:
233
sdl3/sdl3_haptic.odin
Normal file
233
sdl3/sdl3_haptic.odin
Normal 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 ---
|
||||
}
|
||||
Reference in New Issue
Block a user