home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch7_7 / mactbox / mat3.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-28  |  5.1 KB  |  173 lines

  1. /* ------------------------------------------------------------------------- *\
  2.    MAT3.H :
  3.  
  4.    Definition and manipulation of a 3D matrix (either integers or reals)
  5.  
  6.    by Christophe Schlick (1 June 1992)
  7. \* ------------------------------------------------------------------------- */
  8.  
  9. #ifndef _MAT3_
  10. #define _MAT3_
  11.  
  12. #include "tool.h"
  13. #include "vec3.h"
  14.  
  15. /*
  16. ** Creation, duplication, swapping
  17. */
  18.  
  19. #define MAKE_MAT3(M,A,B,C)\
  20.         (COPY_VEC3 ((M)[0],(A)),\
  21.          COPY_VEC3 ((M)[1],(B)),\
  22.          COPY_VEC3 ((M)[2],(C)))
  23.  
  24. #define COPY_MAT3(M,A)\
  25.         (COPY_VEC3 ((M)[0],(A)[0]),\
  26.          COPY_VEC3 ((M)[1],(A)[1]),\
  27.          COPY_VEC3 ((M)[2],(A)[2]))
  28.  
  29. #define SWAP_MAT3(A,B,t)\
  30.         (SWAP_VEC3 ((A)[0], (B)[0], t),\
  31.          SWAP_VEC3 ((A)[1], (B)[1], t),\
  32.          SWAP_VEC3 ((A)[2], (B)[2], t))
  33.  
  34. /*
  35. ** Addition, subtraction, multiplication, division (by a matrix element)
  36. */
  37.  
  38. #define INC_MAT3(M,A)\
  39.         (INC_VEC3 ((M)[0],(A)[0]),\
  40.          INC_VEC3 ((M)[1],(A)[1]),\
  41.          INC_VEC3 ((M)[2],(A)[2]))
  42.  
  43. #define DEC_MAT3(M,A)\
  44.         (DEC_VEC3 ((M)[0],(A)[0]),\
  45.          DEC_VEC3 ((M)[1],(A)[1]),\
  46.          DEC_VEC3 ((M)[2],(A)[2]))
  47.  
  48. #define ADD_MAT3(M,A,B)\
  49.         (ADD_VEC3 ((M)[0],(A)[0],(B)[0]),\
  50.          ADD_VEC3 ((M)[1],(A)[1],(B)[1]),\
  51.          ADD_VEC3 ((M)[2],(A)[2],(B)[2]))
  52.  
  53. #define SUB_MAT3(M,A,B)\
  54.         (SUB_VEC3 ((M)[0],(A)[0],(B)[0]),\
  55.          SUB_VEC3 ((M)[1],(A)[1],(B)[1]),\
  56.          SUB_VEC3 ((M)[2],(A)[2],(B)[2]))
  57.  
  58. #define MUL_MAT3(M,A,B)\
  59.         (MUL_VEC3 ((M)[0],(A)[0],(B)[0]),\
  60.          MUL_VEC3 ((M)[1],(A)[1],(B)[1]),\
  61.          MUL_VEC3 ((M)[2],(A)[2],(B)[2]))
  62.  
  63. #define DIV_MAT3(M,A,B)\
  64.         (DIV_VEC3 ((M)[0],(A)[0],(B)[0]),\
  65.          DIV_VEC3 ((M)[1],(A)[1],(B)[1]),\
  66.          DIV_VEC3 ((M)[2],(A)[2],(B)[2]))
  67.  
  68. /*
  69. ** Addition, subtraction, multiplication, division (by a scalar element)
  70. */
  71.  
  72. #define ADDS_MAT3(M,A,s)\
  73.         (ADDS_VEC3 ((M)[0],(A)[0],s),\
  74.          ADDS_VEC3 ((M)[1],(A)[1],s),\
  75.          ADDS_VEC3 ((M)[2],(A)[2],s))
  76.  
  77. #define SUBS_MAT3(M,A,B)\
  78.         (SUBS_VEC3 ((M)[0],(A)[0],s),\
  79.          SUBS_VEC3 ((M)[1],(A)[1],s),\
  80.          SUBS_VEC3 ((M)[2],(A)[2],s))
  81.  
  82. #define MULS_MAT3(M,A,B)\
  83.         (MULS_VEC3 ((M)[0],(A)[0],s),\
  84.          MULS_VEC3 ((M)[1],(A)[1],s),\
  85.          MULS_VEC3 ((M)[2],(A)[2],s))
  86.  
  87. #define DIVS_MAT3(M,A,B)\
  88.         (DIVS_VEC3 ((M)[0],(A)[0],s),\
  89.          DIVS_VEC3 ((M)[1],(A)[1],s),\
  90.          DIVS_VEC3 ((M)[2],(A)[2],s))
  91.  
  92. /*
  93. ** Determinant, transposition, adjunction, inversion
  94. */ 
  95.  
  96. #define DELTA_MAT3(M)\
  97.         (DELTA_VEC3 ((M)[0],(M)[1],(M)[2]))
  98.  
  99. #define TRANS_MAT3(M,A)\
  100.         ((M)[0].x = (A)[0].x, (M)[0].y = (A)[1].x, (M)[0].z = (A)[2].x,\
  101.          (M)[1].x = (A)[0].y, (M)[1].y = (A)[1].y, (M)[1].z = (A)[2].y,\
  102.          (M)[2].x = (A)[0].z, (M)[2].y = (A)[1].z, (M)[2].z = (A)[2].z)
  103.  
  104. #define ADJ_MAT3(M,A)\
  105.         ((M)[0].x = (A)[1].y * (A)[2].z - (A)[1].z * (A)[2].y,\
  106.          (M)[1].x = (A)[2].y * (A)[0].z - (A)[2].z * (A)[0].y,\
  107.          (M)[2].x = (A)[0].y * (A)[1].z - (A)[0].z * (A)[1].y,\
  108.          (M)[0].y = (A)[1].z * (A)[2].x - (A)[1].x * (A)[2].z,\
  109.          (M)[1].y = (A)[2].z * (A)[0].x - (A)[2].x * (A)[0].z,\
  110.          (M)[2].y = (A)[0].z * (A)[1].x - (A)[0].x * (A)[1].z,\
  111.          (M)[0].z = (A)[1].x * (A)[2].y - (A)[1].y * (A)[2].x,\
  112.          (M)[1].z = (A)[2].x * (A)[0].y - (A)[2].y * (A)[0].x,\
  113.          (M)[2].z = (A)[0].x * (A)[1].y - (A)[0].y * (A)[1].x)
  114.  
  115. #define INV_MAT3(M,A,s)\
  116.         (ADJ_MAT3 (M,A), (s) = DOT_VEC3((M)[0],(A)[0]),\
  117.          ZERO (s) ? (DIVS_MAT3 (M,M,s), TRUE) : FALSE)
  118.  
  119. /*
  120. ** Matrix product, left vector product, right vector product
  121. */
  122.  
  123. #define ROW_VEC3(V,M,n)\
  124.         ((V).x*(M)[0].n + (V).y*(M)[1].n + (V).z*(M)[2].n)
  125.  
  126. #define PROD_MAT3(M,A,B)\
  127.         ((M)[0].x = ROW_VEC3 ((A)[0],(B),x),\
  128.          (M)[0].y = ROW_VEC3 ((A)[0],(B),y),\
  129.          (M)[0].z = ROW_VEC3 ((A)[0],(B),z),\
  130.          (M)[1].x = ROW_VEC3 ((A)[1],(B),x),\
  131.          (M)[1].y = ROW_VEC3 ((A)[1],(B),y),\
  132.          (M)[1].z = ROW_VEC3 ((A)[1],(B),z),\
  133.          (M)[2].x = ROW_VEC3 ((A)[2],(B),x),\
  134.          (M)[2].y = ROW_VEC3 ((A)[2],(B),y),\
  135.          (M)[2].z = ROW_VEC3 ((A)[2],(B),z))
  136.  
  137. #define LMAT_VEC3(V,A,M)\
  138.         ((V).x = ROW_VEC3 ((A),(M),x),\
  139.          (V).y = ROW_VEC3 ((A),(M),y),\
  140.          (V).z = ROW_VEC3 ((A),(M),z))
  141.  
  142. #define RMAT_VEC3(V,M,A)\
  143.         ((V).x = DOT_VEC3 ((A),(M)[0]),\
  144.          (V).y = DOT_VEC3 ((A),(M)[1]),\
  145.          (V).z = DOT_VEC3 ((A),(M)[2]))
  146.  
  147. /*
  148. ** MAKE_FRAME3(F,O,A,B,C,s) = Create a local frame F where O is the origin,
  149. **                          (A,B,C) are the axis and 's' a dummy real variable
  150. ** LOCAL_FRAME3(V,F,A) = Transform A from world frame into local frame F
  151. ** WORLD_FRAME3(V,F,A) = Transform A from local frame F into world frame
  152. */
  153.  
  154. #define MAKE_FRAME3(F,O,A,B,C,s)\
  155.         (COPY_VEC3 ((F)[0],(A)),\
  156.          COPY_VEC3 ((F)[1],(B)),\
  157.          COPY_VEC3 ((F)[2],(C)),\
  158.          COPY_VEC3 ((F)[3],(O)),\
  159.      INV_MAT3 ((F)+12,(F),s))
  160.  
  161. #define LOCAL_FRAME3(V,F,A)\
  162.         (DEC_VEC3 ((A),(F)[3]),\
  163.          LMAT_VEC3 ((V),(A),(F)+12),\
  164.          INC_VEC3 ((A),(F)[3]))
  165.  
  166. #define WORLD_FRAME3(V,F,A)\
  167.         (LMAT_VEC3 ((V),(A),(F)),\
  168.          INC_VEC3 ((V),(F)[3]))
  169.  
  170. #endif
  171.  
  172. /* ------------------------------------------------------------------------- */
  173.