home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / atomart.tar.gz / atomart.tar / macro.h < prev    next >
Text File  |  1990-06-14  |  5KB  |  259 lines

  1.  
  2. /*
  3.  * macros for processing vectors
  4.  */
  5.  
  6. /*
  7.  * dprod
  8.  *
  9.  *    returns the dot product of a and b.
  10.  */
  11. #define    dprod(a, b)    ((a).x * (b).x + (a).y * (b).y + (a).z * (b).z)
  12.  
  13. /*
  14.  * xprod
  15.  *
  16.  *    returns the vector cross product of b and c in a
  17.  */
  18. #define xprod(a, b, c) { \
  19.     (a).x = (b).y * (c).z - (b).z * (c).y; \
  20.     (a).y = (b).z * (c).x - (b).x * (c).z; \
  21.     (a).z = (b).x * (c).y - (b).y * (c).x; \
  22. }
  23.  
  24. /*
  25.  * normalise
  26.  *
  27.  *    normalise vector a
  28.  */
  29. #define    normalise(a) {\
  30.     register float    _norm;\
  31. \
  32.     _norm = sqrt((double)dprod((a), (a)));\
  33.     (a).x /= _norm;\
  34.     (a).y /= _norm;\
  35.     (a).z /= _norm;\
  36. }
  37.  
  38. /*
  39.  * reverse
  40.  *
  41.  *    reverse the vector a
  42.  */
  43. #define reverse(a) {\
  44.     (a).x = -(a).x;\
  45.     (a).y = -(a).y;\
  46.     (a).z = -(a).z;\
  47. }
  48.  
  49. /*
  50.  * vsub
  51.  *
  52.  *    assign the subtraction of c from b to a
  53.  */
  54. #define vsub(a, b, c) {\
  55.     (a).x = (b).x - (c).x;\
  56.     (a).y = (b).y - (c).y;\
  57.     (a).z = (b).z - (c).z;\
  58. }
  59.  
  60. /*
  61.  * vadd
  62.  *
  63.  *    assign the addition of b and c into a
  64.  */
  65. #define vadd(a, b, c) {\
  66.     (a).x = (b).x + (c).x;\
  67.     (a).y = (b).y + (c).y;\
  68.     (a).z = (b).z + (c).z;\
  69. }
  70.  
  71. /*
  72.  * smult
  73.  *
  74.  *    scalar multiply vector a by b
  75.  */
  76. #define    smult(a, b) {\
  77.     (a).x *= (b);\
  78.     (a).y *= (b);\
  79.     (a).z *= (b);\
  80. }
  81.  
  82. /*
  83.  * vmmult
  84.  *
  85.  *    multiply a vector b by matrix m, putiing the result in a
  86.  *
  87.  */
  88. #define    vmmult(a, b, m) {\
  89.     (a).x = (b).x * m[0][0] + (b).y * m[1][0] + (b).z * m[2][0] + m[3][0]; \
  90.     (a).y = (b).x * m[0][1] + (b).y * m[1][1] + (b).z * m[2][1] + m[3][1]; \
  91.     (a).z = (b).x * m[0][2] + (b).y * m[1][2] + (b).z * m[2][2] + m[3][2]; \
  92. }
  93.  
  94. /*
  95.  * cp3x3
  96.  *
  97.  *    copy a 3 x 3 matrix out of b into a
  98.  */
  99. #define cp3x3(a, b) { \
  100.     a[0][0] = b[0][0]; a[0][1] = b[0][1]; a[0][2] = b[0][2]; \
  101.     a[1][0] = b[1][0]; a[1][1] = b[1][1]; a[1][2] = b[1][2]; \
  102.     a[2][0] = b[2][0]; a[2][1] = b[2][1]; a[2][2] = b[2][2]; \
  103. }
  104.  
  105. /*
  106.  * v3x3mult
  107.  *
  108.  *    multiply a vector b by matrix m, puting the result in a
  109.  *
  110.  */
  111. #define    v3x3mult(a, b, m) {\
  112.     (a).x = (b).x * m[0][0] + (b).y * m[1][0] + (b).z * m[2][0]; \
  113.     (a).y = (b).x * m[0][1] + (b).y * m[1][1] + (b).z * m[2][1]; \
  114.     (a).z = (b).x * m[0][2] + (b).y * m[1][2] + (b).z * m[2][2]; \
  115. }
  116.  
  117. /*
  118.  * v3x3tmult
  119.  *
  120.  *    multiply a vector b by the transpose of matrix m, puting the
  121.  * result in a
  122.  *
  123.  */
  124. #define    v3x3tmult(a, b, m) {\
  125.     (a).x = (b).x * m[0][0] + (b).y * m[0][1] + (b).z * m[0][2]; \
  126.     (a).y = (b).x * m[1][0] + (b).y * m[1][1] + (b).z * m[1][2]; \
  127.     (a).z = (b).x * m[2][0] + (b).y * m[2][1] + (b).z * m[2][2]; \
  128. }
  129.  
  130. /*
  131.  * macros from moving from ray to object space and visa versa
  132.  */
  133.  
  134. /*
  135.  * transray
  136.  *
  137.  *    calculate ray a which is ray b transformed into
  138.  * the object space of o.
  139.  */
  140. #define transray(o, a, b) {\
  141. \
  142.     if (o->mat != (mat3x3 *)NULL) {\
  143.         v3x3mult((a).org, (b).org, (*o->mat));\
  144.         v3x3mult((a).dir, (b).dir, (*o->mat));\
  145.     } else {\
  146.         (a).org = (b).org;\
  147.         (a).dir = (b).dir;\
  148.     }\
  149. \
  150.     (a).org.x += o->trans.x;\
  151.     (a).org.y += o->trans.y;\
  152.     (a).org.z += o->trans.z;\
  153. \
  154.     (a).org.x *= o->scales.x;\
  155.     (a).org.y *= o->scales.y;\
  156.     (a).org.z *= o->scales.z;\
  157. \
  158.     (a).dir.x *= o->scales.x;\
  159.     (a).dir.y *= o->scales.y;\
  160.     (a).dir.z *= o->scales.z;\
  161. }
  162.  
  163. /*
  164.  * toobject
  165.  *
  166.  *    transform the point in world space b into object space 
  167.  * and save in a.
  168.  */
  169. #define    toobject(o, a, b) { \
  170.     if (o->mat != (mat3x3 *)NULL) { \
  171.         v3x3mult((a), (b), (*o->mat)); \
  172.     } else \
  173.         a = b; \
  174. \
  175.     (a).x += o->trans.x; \
  176.     (a).y += o->trans.y; \
  177.     (a).z += o->trans.z; \
  178. \
  179.     (a).x *= o->scales.x;\
  180.     (a).y *= o->scales.y;\
  181.     (a).z *= o->scales.z;\
  182. }
  183.  
  184. /*
  185.  * totexture
  186.  *
  187.  *    transform the point in world space b into texture space 
  188.  * and save in a.
  189.  */
  190. #define    totexture(txt, a, b) { \
  191.     v3x3mult((a), (b), txt->mat); \
  192. \
  193.     (a).x += txt->trans.x; \
  194.     (a).y += txt->trans.y; \
  195.     (a).z += txt->trans.z; \
  196. \
  197.     (a).x *= txt->scales.x;\
  198.     (a).y *= txt->scales.y;\
  199.     (a).z *= txt->scales.z;\
  200. }
  201.  
  202. /*
  203.  * toworld
  204.  *
  205.  *    transform the point in object space b into world space 
  206.  * and save in a.
  207.  */
  208. #define    toworld(o, a, b) { \
  209.     (a).x *= o->scales.x;\
  210.     (a).y *= o->scales.y;\
  211.     (a).z *= o->scales.z;\
  212. \
  213.     if (o->mat != (mat3x3 *)NULL) { \
  214.         v3x3tmult((a), (b), (*o->mat)); \
  215.     } else \
  216.         a = b; \
  217. \
  218.     (a).x -= o->trans.x; \
  219.     (a).y -= o->trans.y; \
  220.     (a).z -= o->trans.z; \
  221. }
  222.  
  223. /*
  224.  * macros to handle allocation of hitlist entries
  225.  */
  226. #define release(p)    {\
  227.     p->nxt = fhlist;\
  228.     fhlist = p;\
  229. }
  230.  
  231. #define    fetch(p)    {\
  232.     if (fhlist != (hlist *)NULL) {\
  233.         p = fhlist;\
  234.         fhlist = fhlist->nxt;\
  235.     } else\
  236.         p = (hlist *)smalloc(sizeof(hlist));\
  237. }
  238.  
  239. /*
  240.  * macro for accessing random number table
  241.  */
  242. #define    randnum()    ((randp == erandp) ? *(randp = randtable) : *randp++)
  243.  
  244.  
  245. /*
  246.  * miscellaneous macros
  247.  */
  248. #define    sqr(x)    ((x) * (x))
  249.  
  250. /*
  251.  * set a or b depending on whether c is a minimum or maximum value
  252.  */
  253. #define    minmax(a, b, c)    {\
  254.     if ((a) > (c)) \
  255.         (a) = (c); \
  256.     else if ((b) < (c)) \
  257.         (b) = (c); \
  258. }
  259.