From: <av...@us...> - 2009-06-30 05:32:38
|
Revision: 3162 http://sc2.svn.sourceforge.net/sc2/?rev=3162&view=rev Author: avolkov Date: 2009-06-30 05:32:24 +0000 (Tue, 30 Jun 2009) Log Message: ----------- Rounding-error correction in log(x|y)ToUniverse; bug #1046; from Nic Modified Paths: -------------- trunk/sc2/ChangeLog trunk/sc2/src/sc2code/units.h Modified: trunk/sc2/ChangeLog =================================================================== --- trunk/sc2/ChangeLog 2009-06-30 01:37:53 UTC (rev 3161) +++ trunk/sc2/ChangeLog 2009-06-30 05:32:24 UTC (rev 3162) @@ -1,4 +1,5 @@ Changes towards version 0.7: +- Rounding-error correction in log(x|y)ToUniverse (bug #1046), from Nic - Change hardcoded Starbase and Sa-Matra values to pretty enum values (bug #1047), from Nic - Load override.cfg from user's dir to add or override menu controls - Alex Modified: trunk/sc2/src/sc2code/units.h =================================================================== --- trunk/sc2/src/sc2code/units.h 2009-06-30 01:37:53 UTC (rev 3161) +++ trunk/sc2/src/sc2code/units.h 2009-06-30 05:32:24 UTC (rev 3162) @@ -92,11 +92,18 @@ #define UNIT_SCREEN_WIDTH 63 #define UNIT_SCREEN_HEIGHT 50 +#define LOG_UNITS_X ((SDWORD)(LOG_SPACE_WIDTH >> 4) * SECTOR_WIDTH) +#define LOG_UNITS_Y ((SDWORD)(LOG_SPACE_HEIGHT >> 4) * SECTOR_HEIGHT) +#define UNIVERSE_UNITS_X (((MAX_X_UNIVERSE + 1) >> 4) * 10) +#define UNIVERSE_UNITS_Y (((MAX_Y_UNIVERSE + 1) >> 4)) + +#define ROUNDING_ERROR(div) ((div) >> 1) + static inline COORD logxToUniverse (SDWORD lx) { - return (COORD) ((lx * ((MAX_X_UNIVERSE + 1) >> 4)) * 10 - / ((SDWORD) ((LOG_SPACE_WIDTH) >> 4) * SECTOR_WIDTH)); + return (COORD) ((lx * UNIVERSE_UNITS_X + ROUNDING_ERROR(LOG_UNITS_X)) + / LOG_UNITS_X); } #define LOGX_TO_UNIVERSE(lx) \ logxToUniverse (lx) @@ -104,27 +111,25 @@ logyToUniverse (SDWORD ly) { return (COORD) (MAX_Y_UNIVERSE - - (COORD)(((SDWORD) (ly) * ((MAX_Y_UNIVERSE + 1) >> 4)) - / ((SDWORD) ((LOG_SPACE_HEIGHT) >> 4) * SECTOR_HEIGHT))); + ((ly * UNIVERSE_UNITS_Y + ROUNDING_ERROR(LOG_UNITS_Y)) + / LOG_UNITS_Y)); } #define LOGY_TO_UNIVERSE(ly) \ logyToUniverse (ly) static inline SDWORD universeToLogx (COORD ux) { - return ((SDWORD) ux * ((SDWORD) ((LOG_SPACE_WIDTH) >> 4) * SECTOR_WIDTH) - + ((((MAX_X_UNIVERSE + 1) >> 4) * 10) >> 1)) - / (((MAX_X_UNIVERSE + 1) >> 4) * 10); + return (ux * LOG_UNITS_X + ROUNDING_ERROR(UNIVERSE_UNITS_X)) + / UNIVERSE_UNITS_X; } #define UNIVERSE_TO_LOGX(ux) \ universeToLogx (ux) static inline SDWORD universeToLogy (COORD uy) { - return ((SDWORD) (MAX_Y_UNIVERSE - uy) - * ((SDWORD) ((LOG_SPACE_HEIGHT) >> 4) * SECTOR_HEIGHT) - + (((MAX_Y_UNIVERSE + 1) >> 4) >> 1)) - / ((MAX_Y_UNIVERSE + 1) >> 4); + return ((MAX_Y_UNIVERSE - uy) * LOG_UNITS_Y + + ROUNDING_ERROR(UNIVERSE_UNITS_Y)) + / UNIVERSE_UNITS_Y; } #define UNIVERSE_TO_LOGY(uy) \ universeToLogy (uy) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |