Mercurial > sdl-ios-xcode
changeset 2526:2d88b82ce781 gsoc2008_force_feedback
More documentation.
SDL_HapticPeriodic.phase now should make sense.
More explicit if you try to update an effect type.
author | Edgar Simo <bobbens@gmail.com> |
---|---|
date | Fri, 18 Jul 2008 08:00:16 +0000 |
parents | 1fb3fba13a2c |
children | 924a32719b6f |
files | include/SDL_haptic.h src/haptic/SDL_haptic.c src/haptic/linux/SDL_syshaptic.c |
diffstat | 3 files changed, 34 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/include/SDL_haptic.h Thu Jul 17 16:08:46 2008 +0000 +++ b/include/SDL_haptic.h Fri Jul 18 08:00:16 2008 +0000 @@ -434,6 +434,14 @@ * over time. The type determines the shape of the wave and the parameters * determine the dimensions of the wave. * + * Phase is given by hundredth of a cyle meaning that giving the phase a value + * of 9000 will displace it 25% of it's period. Here are sample values: + * - 0: No phase displacement. + * - 9000: Displaced 25% of it's period. + * - 18000: Displaced 50% of it's period. + * - 27000: Displaced 75% of it's period. + * - 36000: Displaced 100% of it's period, same as 0, but 0 is preffered. + * * Examples: * \code * SDL_HAPTIC_SINE @@ -488,7 +496,7 @@ Uint16 period; /**< Period of the wave. */ Sint16 magnitude; /**< Peak value. */ Sint16 offset; /**< Mean value of the wave. */ - Uint16 phase; /**< Horizontal shift. */ + Uint16 phase; /**< Horizontal shift given by hundredth of a cycle. */ /* Envelope */ Uint16 attack_length; /**< Duration of the attack. */ @@ -592,7 +600,7 @@ * * You can also pass 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. * * Common parts: * \code @@ -875,10 +883,12 @@ /** * \fn int SDL_HapticUpdateEffect(SDL_Haptic * haptic, int effect, SDL_HapticEffect * data) * - * \brief Updates an effect. Can be used dynamically, although behaviour when - * dynamically changing direction may be strange. Specifically the effect - * may reupload itself and start playing from the start. You cannot change - * the type either when running UpdateEffect. + * \brief Updates the properties of an effect. + * + * Can be used dynamically, although behaviour when dynamically changing + * direction may be strange. Specifically the effect may reupload itself + * and start playing from the start. You cannot change the type either when + * running UpdateEffect. * * \param haptic Haptic device that has the effect. * \param effect Effect to update. @@ -896,6 +906,11 @@ * * \brief Runs the haptic effect on it's assosciated haptic device. * + * If iterations are SDL_HAPTIC_INFINITY, it'll run the effect over and over + * repeating the envelope (attack and fade) every time. If you only want the + * effect to last forever, set SDL_HAPTIC_INFINITY in the effect's length + * parameter. + * * \param haptic Haptic device to run the effect on. * \param effect Identifier of the haptic effect to run. * \param iterations Number of iterations to run the effect. Use
--- a/src/haptic/SDL_haptic.c Thu Jul 17 16:08:46 2008 +0000 +++ b/src/haptic/SDL_haptic.c Fri Jul 18 08:00:16 2008 +0000 @@ -440,6 +440,8 @@ if (SDL_SYS_HapticNewEffect(haptic,&haptic->effects[i],effect) != 0) { return -1; /* Backend failed to create effect */ } + + SDL_memcpy(&haptic->effects[i].effect, effect, sizeof(SDL_HapticEffect)); return i; } } @@ -471,11 +473,18 @@ return -1; } + /* Can't change type dynamically. */ + if (data->type != haptic->effects[effect].effect.type) { + SDL_SetError("Haptic: Updating effect type is illegal."); + return -1; + } + /* Updates the effect */ if (SDL_SYS_HapticUpdateEffect(haptic,&haptic->effects[effect],data) < 0) { return -1; } + SDL_memcpy(&haptic->effects[effect].effect, data, sizeof(SDL_HapticEffect)); return 0; }
--- a/src/haptic/linux/SDL_syshaptic.c Thu Jul 17 16:08:46 2008 +0000 +++ b/src/haptic/linux/SDL_syshaptic.c Fri Jul 18 08:00:16 2008 +0000 @@ -493,6 +493,7 @@ static int SDL_SYS_ToFFEffect( struct ff_effect * dest, SDL_HapticEffect * src ) { + Uint32 tmp; SDL_HapticConstant *constant; SDL_HapticPeriodic *periodic; SDL_HapticCondition *condition; @@ -563,7 +564,9 @@ dest->u.periodic.period = CLAMP(periodic->period); dest->u.periodic.magnitude = periodic->magnitude; dest->u.periodic.offset = periodic->offset; - dest->u.periodic.phase = CLAMP(periodic->phase); + /* Phase is calculated based of offset from period and then clamped. */ + tmp = ((periodic->phase % 36000) * dest->u.periodic.period) / 36000; + dest->u.periodic.phase = CLAMP(tmp); /* Envelope */ dest->u.periodic.envelope.attack_length = CLAMP(periodic->attack_length);