Haptic: Don't interpret a direction of polar 35999 as "unsupported type".

(or linux-direction 0xFFFF)

Thanks, Elias!

Partially fixes Bugzilla #2686.
This commit is contained in:
Ryan C. Gordon 2014-08-16 16:40:01 -04:00
parent 6d9dbf5e1e
commit 3e27013b98
1 changed files with 18 additions and 18 deletions

View File

@ -652,15 +652,15 @@ SDL_SYS_ToButton(Uint16 button)
/* /*
* Returns the ff_effect usable direction from a SDL_HapticDirection. * Initializes the ff_effect usable direction from a SDL_HapticDirection.
*/ */
static Uint16 static int
SDL_SYS_ToDirection(SDL_HapticDirection * dir) SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
{ {
Uint32 tmp; Uint32 tmp;
float f; /* Ideally we'd use fixed point math instead of floats... */ float f; /* Ideally we'd use fixed point math instead of floats... */
switch (dir->type) { switch (src->type) {
case SDL_HAPTIC_POLAR: case SDL_HAPTIC_POLAR:
/* Linux directions start from south. /* Linux directions start from south.
(and range from 0 to 0xFFFF) (and range from 0 to 0xFFFF)
@ -671,8 +671,9 @@ SDL_SYS_ToDirection(SDL_HapticDirection * dir)
180 deg -> 0x8000 (up) 180 deg -> 0x8000 (up)
270 deg -> 0xC000 (right) 270 deg -> 0xC000 (right)
*/ */
tmp = (((18000 + dir->dir[0]) % 36000) * 0xFFFF) / 36000; /* convert to range [0,0xFFFF] */ tmp = (((18000 + src->dir[0]) % 36000) * 0xFFFF) / 36000; /* convert to range [0,0xFFFF] */
return (Uint16) tmp; *dest = (Uint16) tmp;
break;
case SDL_HAPTIC_SPHERICAL: case SDL_HAPTIC_SPHERICAL:
/* /*
@ -683,12 +684,13 @@ SDL_SYS_ToDirection(SDL_HapticDirection * dir)
--> add 9000 --> add 9000
--> finally add 18000 and convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR. --> finally add 18000 and convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR.
*/ */
tmp = ((dir->dir[0]) + 9000) % 36000; /* Convert to polars */ tmp = ((src->dir[0]) + 9000) % 36000; /* Convert to polars */
tmp = (((18000 + tmp) % 36000) * 0xFFFF) / 36000; /* convert to range [0,0xFFFF] */ tmp = (((18000 + tmp) % 36000) * 0xFFFF) / 36000; /* convert to range [0,0xFFFF] */
return (Uint16) tmp; *dest = (Uint16) tmp;
break;
case SDL_HAPTIC_CARTESIAN: case SDL_HAPTIC_CARTESIAN:
f = atan2(dir->dir[1], dir->dir[0]); f = atan2(src->dir[1], src->dir[0]);
/* /*
atan2 takes the parameters: Y-axis-value and X-axis-value (in that order) 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) - Y-axis-value is the second coordinate (from center to SOUTH)
@ -701,10 +703,11 @@ SDL_SYS_ToDirection(SDL_HapticDirection * dir)
*/ */
tmp = (((int) (f * 18000. / M_PI)) + 45000) % 36000; tmp = (((int) (f * 18000. / M_PI)) + 45000) % 36000;
tmp = (((18000 + tmp) % 36000) * 0xFFFF) / 36000; /* convert to range [0,0xFFFF] */ tmp = (((18000 + tmp) % 36000) * 0xFFFF) / 36000; /* convert to range [0,0xFFFF] */
return (Uint16) tmp; *dest = (Uint16) tmp;
break;
default: default:
return (Uint16) SDL_SetError("Haptic: Unsupported direction type."); return SDL_SetError("Haptic: Unsupported direction type.");
} }
return 0; return 0;
@ -735,8 +738,7 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
/* Header */ /* Header */
dest->type = FF_CONSTANT; dest->type = FF_CONSTANT;
dest->direction = SDL_SYS_ToDirection(&constant->direction); if (SDL_SYS_ToDirection(&dest->direction, &constant->direction) == -1)
if (dest->direction == (Uint16) - 1)
return -1; return -1;
/* Replay */ /* Replay */
@ -771,8 +773,7 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
/* Header */ /* Header */
dest->type = FF_PERIODIC; dest->type = FF_PERIODIC;
dest->direction = SDL_SYS_ToDirection(&periodic->direction); if (SDL_SYS_ToDirection(&dest->direction, &periodic->direction) == -1)
if (dest->direction == (Uint16) - 1)
return -1; return -1;
/* Replay */ /* Replay */
@ -868,8 +869,7 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
/* Header */ /* Header */
dest->type = FF_RAMP; dest->type = FF_RAMP;
dest->direction = SDL_SYS_ToDirection(&ramp->direction); if (SDL_SYS_ToDirection(&dest->direction, &ramp->direction) == -1)
if (dest->direction == (Uint16) - 1)
return -1; return -1;
/* Replay */ /* Replay */