# SDL_HapticEffect
The generic template for any haptic effect.
## Header File
Defined in [SDL_haptic.h](https://github.com/libsdl-org/SDL/blob/SDL2/include/SDL_haptic.h)
## Syntax
```c
typedef union SDL_HapticEffect
{
/* Common for all force feedback effects */
Uint16 type; /**< Effect type. */
SDL_HapticConstant constant; /**< Constant effect. */
SDL_HapticPeriodic periodic; /**< Periodic effect. */
SDL_HapticCondition condition; /**< Condition effect. */
SDL_HapticRamp ramp; /**< Ramp effect. */
SDL_HapticLeftRight leftright; /**< Left/Right effect. */
SDL_HapticCustom custom; /**< Custom effect. */
} SDL_HapticEffect;
```
## Remarks
All values max at 32767 (0x7FFF). Signed values also can be negative. Time
values unless specified otherwise are in milliseconds.
You can also pass [SDL_HAPTIC_INFINITY](SDL_HAPTIC_INFINITY) to length
instead of a 0-32767 value. Neither delay, interval, attack_length nor
fade_length support [SDL_HAPTIC_INFINITY](SDL_HAPTIC_INFINITY). Fade will
also not be used since effect never ends.
Additionally, the [SDL_HAPTIC_RAMP](SDL_HAPTIC_RAMP) effect does not
support a duration of [SDL_HAPTIC_INFINITY](SDL_HAPTIC_INFINITY).
Button triggers may not be supported on all devices, it is advised to not
use them if possible. Buttons start at index 1 instead of index 0 like the
joystick.
If both attack_length and fade_level are 0, the envelope is not used,
otherwise both values are used.
Common parts:
```c
// Replay - All effects have this
Uint32 length; // Duration of effect (ms).
Uint16 delay; // Delay before starting effect.
// Trigger - All effects have this
Uint16 button; // Button that triggers effect.
Uint16 interval; // How soon before effect can be triggered again.
// Envelope - All effects except condition effects have this
Uint16 attack_length; // Duration of the attack (ms).
Uint16 attack_level; // Level at the start of the attack.
Uint16 fade_length; // Duration of the fade out (ms).
Uint16 fade_level; // Level at the end of the fade.
```
Here we have an example of a constant effect evolution in time:
```
Strength
^
|
| effect level --> _________________
| / \
| / \
| / \
| / \
| attack_level --> | \
| | | <--- fade_level
|
+--------------------------------------------------> Time
[--] [---]
attack_length fade_length
[------------------][-----------------------]
delay length
```
Note either the attack_level or the fade_level may be above the actual
effect level.
## See Also
- [SDL_HapticConstant](SDL_HapticConstant)
- [SDL_HapticPeriodic](SDL_HapticPeriodic)
- [SDL_HapticCondition](SDL_HapticCondition)
- [SDL_HapticRamp](SDL_HapticRamp)
- [SDL_HapticLeftRight](SDL_HapticLeftRight)
- [SDL_HapticCustom](SDL_HapticCustom)
----
[CategoryAPI](CategoryAPI), [CategoryAPIStruct](CategoryAPIStruct), [CategoryHaptic](CategoryHaptic)