Skip to content

Commit

Permalink
Haptic: Explicitly avoid floating point arithmetic if it's not needed.
Browse files Browse the repository at this point in the history
Thanks, Elias!

Partially fixes Bugzilla #2686.
  • Loading branch information
icculus committed Aug 16, 2014
1 parent 1db581b commit a2622ce
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions src/haptic/linux/SDL_syshaptic.c
Expand Up @@ -658,7 +658,6 @@ static int
SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
{
Uint32 tmp;
float f; /* Ideally we'd use fixed point math instead of floats... */

switch (src->type) {
case SDL_HAPTIC_POLAR:
Expand Down Expand Up @@ -690,7 +689,12 @@ SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
break;

case SDL_HAPTIC_CARTESIAN:
f = atan2(src->dir[1], src->dir[0]);
if (!src->dir[1])
*dest = (src->dir[0] >= 0 ? 0x4000 : 0xC000);
else if (!src->dir[0])
*dest = (src->dir[1] >= 0 ? 0x8000 : 0);
else {
float f = atan2(src->dir[1], src->dir[0]); /* Ideally we'd use fixed point math instead of floats... */
/*
atan2 takes the parameters: Y-axis-value and X-axis-value (in that order)
- Y-axis-value is the second coordinate (from center to SOUTH)
Expand All @@ -702,8 +706,9 @@ SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
--> finally convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR.
*/
tmp = (((Sint32) (f * 18000. / M_PI)) + 45000) % 36000;
tmp = (tmp * 0x8000) / 18000; /* convert to range [0,0xFFFF] */
*dest = (Uint16) tmp;
tmp = (tmp * 0x8000) / 18000; /* convert to range [0,0xFFFF] */
*dest = (Uint16) tmp;
}
break;

default:
Expand Down

0 comments on commit a2622ce

Please sign in to comment.