1 /+ 2 + Copyright 2022 – 2024 Aya Partridge 3 + Copyright 2018 - 2022 Michael D. Parker 4 + Distributed under the Boost Software License, Version 1.0. 5 + (See accompanying file LICENSE_1_0.txt or copy at 6 + http://www.boost.org/LICENSE_1_0.txt) 7 +/ 8 module sdl.haptic; 9 10 import bindbc.sdl.config; 11 import bindbc.sdl.codegen; 12 13 import sdl.joystick; 14 15 struct SDL_Haptic; 16 17 enum: ushort{ 18 SDL_HAPTIC_CONSTANT = 1U<<0, 19 SDL_HAPTIC_SINE = 1U<<1, 20 SDL_HAPTIC_LEFTRIGHT = 1U<<2, 21 SDL_HAPTIC_TRIANGLE = 1U<<3, 22 SDL_HAPTIC_SAWTOOTHUP = 1U<<4, 23 SDL_HAPTIC_SAWTOOTHDOWN = 1U<<5, 24 SDL_HAPTIC_RAMP = 1U<<6, 25 SDL_HAPTIC_SPRING = 1U<<7, 26 SDL_HAPTIC_DAMPER = 1U<<8, 27 SDL_HAPTIC_INERTIA = 1U<<9, 28 SDL_HAPTIC_FRICTION = 1U<<10, 29 SDL_HAPTIC_CUSTOM = 1U<<11, 30 SDL_HAPTIC_GAIN = 1U<<12, 31 SDL_HAPTIC_AUTOCENTER = 1U<<13, 32 SDL_HAPTIC_STATUS = 1U<<14, 33 SDL_HAPTIC_PAUSE = 1U<<15, 34 } 35 36 enum: uint{ 37 SDL_HAPTIC_POLAR = 0, 38 SDL_HAPTIC_CARTESIAN = 1, 39 SDL_HAPTIC_SPHERICAL = 2, 40 SDL_HAPTIC_INFINITY = 4294967295U, 41 } 42 static if(sdlSupport >= SDLSupport.v2_0_14) 43 enum: uint{ 44 SDL_HAPTIC_STEERING_AXIS = 3, 45 } 46 47 struct SDL_HapticDirection{ 48 ubyte type; 49 int[3] dir; 50 } 51 52 struct SDL_HapticConstant{ 53 ushort type; 54 SDL_HapticDirection direction; 55 56 uint length; 57 ushort delay; 58 59 ushort button; 60 ushort interval; 61 62 short level; 63 64 ushort attack_length; 65 ushort attack_level; 66 ushort fade_length; 67 ushort fade_level; 68 } 69 70 struct SDL_HapticPeriodic{ 71 ushort type; 72 SDL_HapticDirection direction; 73 74 uint length; 75 ushort delay; 76 77 ushort button; 78 ushort interval; 79 80 ushort period; 81 short magnitude; 82 short offset; 83 ushort phase; 84 85 ushort attack_length; 86 ushort attack_level; 87 ushort fade_length; 88 ushort fade_level; 89 } 90 91 struct SDL_HapticCondition{ 92 ushort type; 93 SDL_HapticDirection direciton; 94 95 uint length; 96 ushort delay; 97 98 ushort button; 99 ushort interval; 100 101 ushort[3] right_sat; 102 ushort[3] left_sat; 103 short[3] right_coeff; 104 short[3] left_coeff; 105 ushort[3] deadband; 106 short[3] center; 107 } 108 109 struct SDL_HapticRamp{ 110 ushort type; 111 SDL_HapticDirection direction; 112 113 uint length; 114 ushort delay; 115 116 ushort button; 117 ushort interval; 118 119 short start; 120 short end; 121 122 ushort attack_length; 123 ushort attack_level; 124 ushort fade_length; 125 ushort fade_level; 126 } 127 128 struct SDL_HapticLeftRight{ 129 ushort type; 130 131 uint length; 132 133 ushort large_magnitude; 134 ushort small_magnitude; 135 } 136 137 struct SDL_HapticCustom{ 138 ushort type; 139 SDL_HapticDirection direction; 140 141 uint length; 142 ushort delay; 143 144 ushort button; 145 ushort interval; 146 147 ubyte channels; 148 ushort period; 149 ushort samples; 150 ushort* data; 151 152 ushort attack_length; 153 ushort attack_level; 154 ushort fade_length; 155 ushort fade_level; 156 } 157 158 union SDL_HapticEffect{ 159 ushort type; 160 SDL_HapticConstant constant; 161 SDL_HapticPeriodic periodic; 162 SDL_HapticCondition condition; 163 SDL_HapticRamp ramp; 164 SDL_HapticLeftRight leftright; 165 SDL_HapticCustom custom; 166 } 167 168 mixin(joinFnBinds((){ 169 FnBind[] ret = [ 170 {q{int}, q{SDL_NumHaptics}, q{}}, 171 {q{const(char)*}, q{SDL_HapticName}, q{int deviceIndex}}, 172 {q{SDL_Haptic*}, q{SDL_HapticOpen}, q{int deviceIndex}}, 173 {q{int}, q{SDL_HapticOpened}, q{int deviceIndex}}, 174 {q{int}, q{SDL_HapticIndex}, q{SDL_Haptic* haptic}}, 175 {q{int}, q{SDL_MouseIsHaptic}, q{}}, 176 {q{SDL_Haptic*}, q{SDL_HapticOpenFromMouse}, q{}}, 177 {q{int}, q{SDL_JoystickIsHaptic}, q{SDL_Joystick* joystick}}, 178 {q{SDL_Haptic*}, q{SDL_HapticOpenFromJoystick}, q{SDL_Joystick* joystick}}, 179 {q{void}, q{SDL_HapticClose}, q{SDL_Haptic* haptic}}, 180 {q{int}, q{SDL_HapticNumEffects}, q{SDL_Haptic* haptic}}, 181 {q{int}, q{SDL_HapticNumEffectsPlaying}, q{SDL_Haptic* haptic}}, 182 {q{uint}, q{SDL_HapticQuery}, q{SDL_Haptic* haptic}}, 183 {q{int}, q{SDL_HapticNumAxes}, q{SDL_Haptic* haptic}}, 184 {q{int}, q{SDL_HapticEffectSupported}, q{SDL_Haptic* haptic, SDL_HapticEffect* effect}}, 185 {q{int}, q{SDL_HapticNewEffect}, q{SDL_Haptic* haptic, SDL_HapticEffect* effect}}, 186 {q{int}, q{SDL_HapticUpdateEffect}, q{SDL_Haptic* haptic, int effect, SDL_HapticEffect* data}}, 187 {q{int}, q{SDL_HapticRunEffect}, q{SDL_Haptic* haptic, int effect, uint iterations}}, 188 {q{int}, q{SDL_HapticStopEffect}, q{SDL_Haptic* haptic, int effect}}, 189 {q{int}, q{SDL_HapticDestroyEffect}, q{SDL_Haptic* haptic, int effect}}, 190 {q{int}, q{SDL_HapticGetEffectStatus}, q{SDL_Haptic* haptic, int effect}}, 191 {q{int}, q{SDL_HapticSetGain}, q{SDL_Haptic* haptic, int gain}}, 192 {q{int}, q{SDL_HapticSetAutocenter}, q{SDL_Haptic* haptic, int autocentre}}, 193 {q{int}, q{SDL_HapticPause}, q{SDL_Haptic* haptic}}, 194 {q{int}, q{SDL_HapticUnpause}, q{SDL_Haptic* haptic}}, 195 {q{int}, q{SDL_HapticStopAll}, q{SDL_Haptic* haptic}}, 196 {q{int}, q{SDL_HapticRumbleSupported}, q{SDL_Haptic* haptic}}, 197 {q{int}, q{SDL_HapticRumbleInit}, q{SDL_Haptic* haptic}}, 198 {q{int}, q{SDL_HapticRumblePlay}, q{SDL_Haptic* haptic, float strength, uint length}}, 199 {q{int}, q{SDL_HapticRumbleStop}, q{SDL_Haptic* haptic}}, 200 ]; 201 return ret; 202 }())); 203 204 alias SDL_HapticSetAutocentre = SDL_HapticSetAutocenter;