home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / lib / imath1.h < prev    next >
C/C++ Source or Header  |  1998-06-08  |  3KB  |  104 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /* imath.h */
  14. /* Created 12/14/94 */
  15. /* John Schultz */
  16.  
  17. #ifndef IMATH_H
  18. #define IMATH_H
  19.  
  20. typedef long coord;
  21. typedef unsigned long ulong;
  22. typedef struct {coord sin,cos;} sinCos;
  23.  
  24. #define FBITS 14
  25. #define SHR(n) ((n)>>FBITS)
  26. #define SHL(n) ((n)<<FBITS)
  27. #define ONE (1<<FBITS)
  28. #define FONE ((float)ONE)
  29. #define TOFIXED(n) (long)((n)*ONE)
  30. #define TOFLOAT(n) ((float)(n)/FONE)
  31.  
  32. #ifdef __WATCOMC__
  33. #define M_PI 3.14159265358979323846264338327950288
  34. #endif
  35.  
  36. #define M_TWOPI (M_PI*2)
  37.  
  38. #define RAD090DEG TOFIXED(M_PI/2)
  39. #define RAD180DEG TOFIXED(M_PI)
  40. #define RAD270DEG TOFIXED(M_PI*3/2)
  41. #define RAD360DEG TOFIXED(M_PI*2)
  42.  
  43. #define DEG090 TOFIXED(90.)
  44. #define DEG180 TOFIXED(180.)
  45. #define DEG270 TOFIXED(270.)
  46. #define DEG360 TOFIXED(360.)
  47.  
  48. #define TORADIANS(a) MUL(a,TOFIXED(M_PI/180.))
  49. #define TODEGREES(a) MUL(a,TOFIXED(180./M_PI))
  50.  
  51. // The 14 below is FBITS
  52. long mul64(long a,long b);
  53. #pragma aux mul64 =      \
  54.     "imul   edx"         \
  55.     "shrd   eax,edx,14"  \
  56.     "adc    eax,0"       \
  57.     parm [eax] [edx]     \
  58.     modify [eax edx]     \
  59.     value [eax];
  60.  
  61. long div64(long a,long b);
  62. #pragma aux div64 =      \
  63.     "push   ebx"         \
  64.     "mov    ebx,edx"     \
  65.     "cdq"                \
  66.     "shld   edx,eax,14"  \
  67.     "shl    eax,14"      \
  68.     "idiv   ebx"         \
  69.     "pop    ebx"         \
  70.     parm [eax] [edx]     \
  71.     modify [eax edx]     \
  72.     value [eax];
  73.  
  74. long muldiv64(long a,long b,long c);
  75. #pragma aux muldiv64 =     \
  76.     "imul    edx"          \
  77.     "idiv    ebx"          \
  78.     parm [eax] [edx] [ebx] \
  79.     modify [eax edx ebx]   \
  80.     value [eax];
  81.  
  82. #define MUL(a,b) mul64(a,b)
  83. #define DIV(a,b) div64(a,b)
  84. #define MULDIV(a,b,c) muldiv64(a,b,c)
  85.  
  86. #define abs(x) ((x) < 0 ? -(x) : (x))
  87. #define sgn(x) ((x) > 0 ? 1 : ((x) < 0 ? -1 : 0))
  88.  
  89. #define CLAMPMIN(n,min) if ((n) < (min)) (n) = (min);
  90. #define CLAMPMAX(n,max) if ((n) > (max)) (n) = (max);
  91. #define CLAMPMINMAX(n,min,max) CLAMPMIN(n,min) else CLAMPMAX(n,max)
  92.  
  93. ulong isqrt(ulong n);
  94. coord getsin(coord radians);
  95. coord getcos(coord radians);
  96. coord getatan(coord sine);
  97. coord getatan2(coord sine,coord cosine);
  98. void sincos(sinCos * sc,coord radians);
  99.  
  100. #endif
  101.  
  102. /* imath.h */
  103.  
  104.