Răsfoiți Sursa

Add sdl3/sdl3_haptic.odin

gingerBill 7 luni în urmă
părinte
comite
44d31cb4a3
1 a modificat fișierele cu 233 adăugiri și 0 ștergeri
  1. 233 0
      vendor/sdl3/sdl3_haptic.odin

+ 233 - 0
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 ---
+}