[Change] Improved force feedback system.

This commit is contained in:
Allanis 2014-05-29 21:35:44 +01:00
parent 3f205ce9f0
commit 34358a6b66

View File

@ -318,14 +318,15 @@ static void spfx_update_layer(SPFX* layer, int* nlayer, const double dt) {
void spfx_start(const double dt) { void spfx_start(const double dt) {
GLdouble bx, by, x, y; GLdouble bx, by, x, y;
double inc; double inc;
if(shake_off == 1) return; /* Save the cycles. */
#if SDL_VERSION_ATLEAST(1,3,0) #if SDL_VERSION_ATLEAST(1,3,0)
/* Decrement the haptic timer. */ /* Decrement the haptic timer. */
if(haptic_lastUpdate > 0.) if(haptic_lastUpdate > 0.)
haptic_lastUpdate -= dt; haptic_lastUpdate -= dt;
#endif #endif
if(shake_off == 1) return; /* Save the cycles. */
bx = SCREEN_W / 2; bx = SCREEN_W / 2;
by = SCREEN_H / 2; by = SCREEN_H / 2;
@ -412,18 +413,25 @@ static int spfx_hapticInit(void) {
static void spfx_hapticRumble(void) { static void spfx_hapticRumble(void) {
#if SDL_VERSION_ATLEAST(1,3,0) #if SDL_VERSION_ATLEAST(1,3,0)
SDL_HapticEffect* efx; SDL_HapticEffect* efx;
double len, mag;
if(haptic_rumble >= 0) { if(haptic_rumble >= 0) {
/* Not time to update yet. */ /* Not time to update yet. */
if(haptic_lastUpdate > 0.) if((haptic_lastUpdate > 0.) || shake_off)
return; return;
/* Stop the effect if it was playing. */ /* Stop the effect if it was playing. */
SDL_HapticStopEffect(haptic, haptic_rumble); SDL_HapticStopEffect(haptic, haptic_rumble);
/* Get length and magnitude. */
len = 1000. * shake_rad / SHAKE_DECAY;
mag = 32767. * (shake_rad / SHAKE_MAX);
/* Update the effect. */ /* Update the effect. */
efx = &haptic_rumbleEffect; efx = &haptic_rumbleEffect;
efx->periodic.length = (uint32_t)(1000.*shake_rad / SHAKE_DECAY); efx->periodic.magnitude = (uint32_t)mag;
efx->periodic.length = (uint32_t)len;
efx->periodic.fade_length = MIN(efx->periodic.length, 1000);
if(SDL_HapticUpdateEffect(haptic, haptic_rumble, &haptic_rumbleEffect) < 0) { if(SDL_HapticUpdateEffect(haptic, haptic_rumble, &haptic_rumbleEffect) < 0) {
WARN("Failed to update effect: %s.", SDL_GetError()); WARN("Failed to update effect: %s.", SDL_GetError());
return; return;