Mercurial > sdl-ios-xcode
comparison src/haptic/linux/SDL_syshaptic.c @ 3680:7c18b38f0f9a
Fixed bug #920
From Martin:
Alright... I corrected SDL_SYS_ToDirection in SDL_syshaptic.c in the linux
directory of haptic. Now in all 3 cases the same value is returned, at least.
Therefore now it should behave the same way as on Windows.
I added some comments and corrected the cases SDL_HAPTIC_CARTESIAN and
SDL_HAPTIC_SPHERICAL.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 18 Jan 2010 14:57:41 +0000 |
parents | 81773a1eac83 |
children | 0c71708adbcb |
comparison
equal
deleted
inserted
replaced
3679:ce290de32f2a | 3680:7c18b38f0f9a |
---|---|
503 Uint32 tmp; | 503 Uint32 tmp; |
504 float f; /* Ideally we'd use fixed point math instead of floats... */ | 504 float f; /* Ideally we'd use fixed point math instead of floats... */ |
505 | 505 |
506 switch (dir->type) { | 506 switch (dir->type) { |
507 case SDL_HAPTIC_POLAR: | 507 case SDL_HAPTIC_POLAR: |
508 /* Linux directions are inverted. */ | 508 /* Linux directions start from south. |
509 tmp = (((18000 + dir->dir[0]) % 36000) * 0xFFFF) / 36000; | 509 (and range from 0 to 0xFFFF) |
510 Quoting include/linux/input.h, line 926: | |
511 Direction of the effect is encoded as follows: | |
512 0 deg -> 0x0000 (down) | |
513 90 deg -> 0x4000 (left) | |
514 180 deg -> 0x8000 (up) | |
515 270 deg -> 0xC000 (right) | |
516 */ | |
517 tmp = (((18000 + dir->dir[0]) % 36000) * 0xFFFF) / 36000; // convert to range [0,0xFFFF] | |
510 return (Uint16) tmp; | 518 return (Uint16) tmp; |
511 | 519 |
520 case SDL_HAPTIC_SPHERICAL: | |
521 /* | |
522 We convert to polar, because that's the only supported direction on Linux. | |
523 The first value of a spherical direction is practically the same as a | |
524 Polar direction, except that we have to add 90 degrees. It is the angle | |
525 from EAST {1,0} towards SOUTH {0,1}. | |
526 --> add 9000 | |
527 --> finally add 18000 and convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR. | |
528 */ | |
529 tmp = ((dir->dir[0]) + 9000) % 36000; /* Convert to polars */ | |
530 tmp = (((18000 + tmp) % 36000) * 0xFFFF) / 36000; // convert to range [0,0xFFFF] | |
531 return (Uint16) tmp; | |
532 | |
512 case SDL_HAPTIC_CARTESIAN: | 533 case SDL_HAPTIC_CARTESIAN: |
513 /* We must invert "x" and "y" to go clockwise. */ | 534 f = atan2(dir->dir[1], dir->dir[0]); |
514 f = atan2(dir->dir[0], dir->dir[1]); | 535 /* |
515 tmp = (int) (f * 18000. / M_PI) % 36000; | 536 atan2 takes the parameters: Y-axis-value and X-axis-value (in that order) |
516 tmp = (tmp * 0xFFFF) / 36000; | 537 - Y-axis-value is the second coordinate (from center to SOUTH) |
517 return (Uint16) tmp; | 538 - X-axis-value is the first coordinate (from center to EAST) |
518 | 539 We add 36000, because atan2 also returns negative values. Then we practically |
519 case SDL_HAPTIC_SPHERICAL: | 540 have the first spherical value. Therefore we proceed as in case |
520 tmp = (36000 - dir->dir[0]) + 27000; /* Convert to polars */ | 541 SDL_HAPTIC_SPHERICAL and add another 9000 to get the polar value. |
521 tmp = (((18000 + tmp) % 36000) * 0xFFFF) / 36000; | 542 --> add 45000 in total |
543 --> finally add 18000 and convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR. | |
544 */ | |
545 tmp = (((int) (f * 18000. / M_PI)) + 45000) % 36000; | |
546 tmp = (((18000 + tmp) % 36000) * 0xFFFF) / 36000; // convert to range [0,0xFFFF] | |
522 return (Uint16) tmp; | 547 return (Uint16) tmp; |
523 | 548 |
524 default: | 549 default: |
525 SDL_SetError("Haptic: Unsupported direction type."); | 550 SDL_SetError("Haptic: Unsupported direction type."); |
526 return (Uint16) - 1; | 551 return (Uint16) - 1; |