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

  1. /* ------------------------------------------------------------------------- *\
  2.    MAT4.H :
  3.  
  4.    Definition and manipulation of a 4D matrix (either integers or reals)
  5.  
  6.    by Christophe Schlick (1 June 1992)
  7. \* ------------------------------------------------------------------------- */
  8.  
  9. #ifndef _MAT4_
  10. #define _MAT4_
  11.  
  12. #include "tool.h"
  13. #include "vec4.h"
  14.  
  15. /*
  16. ** Creation, duplication, swapping
  17. */
  18.  
  19. #define MAKE_MAT4(M,A,B,C,D)\
  20.         (COPY_VEC4 ((M)[0],(A)),\
  21.          COPY_VEC4 ((M)[1],(B)),\
  22.          COPY_VEC4 ((M)[2],(C)),\
  23.          COPY_VEC4 ((M)[3],(D)))
  24.  
  25. #define COPY_MAT4(M,A)\
  26.         (COPY_VEC4 ((M)[0],(A)[0]),\
  27.          COPY_VEC4 ((M)[1],(A)[1]),\
  28.          COPY_VEC4 ((M)[2],(A)[2]),\
  29.          COPY_VEC4 ((M)[3],(A)[3]))
  30.  
  31. #define SWAP_MAT4(A,B,t)\
  32.         (SWAP_VEC4 ((A)[0], (B)[0], t),\
  33.          SWAP_VEC4 ((A)[1], (B)[1], t),\
  34.          SWAP_VEC4 ((A)[2], (B)[2], t))
  35.          SWAP_VEC4 ((A)[3], (B)[3], t))
  36.  
  37. /*
  38. ** Addition, subtraction, multiplication, division (by a matrix element)
  39. */
  40.  
  41. #define INC_MAT4(M,A)\
  42.         (INC_VEC4 ((M)[0],(A)[0]),\
  43.          INC_VEC4 ((M)[1],(A)[1]),\
  44.          INC_VEC4 ((M)[2],(A)[2]),\
  45.          INC_VEC4 ((M)[3],(A)[3]))
  46.  
  47. #define DEC_MAT4(M,A)\
  48.         (DEC_VEC4 ((M)[0],(A)[0]),\
  49.          DEC_VEC4 ((M)[1],(A)[1]),\
  50.          DEC_VEC4 ((M)[2],(A)[2]),\
  51.          DEC_VEC4 ((M)[3],(A)[3]))
  52.  
  53. #define ADD_MAT4(M,A,B)\
  54.         (ADD_VEC4 ((M)[0],(A)[0],(B)[0]),\
  55.          ADD_VEC4 ((M)[1],(A)[1],(B)[1]),\
  56.          ADD_VEC4 ((M)[2],(A)[2],(B)[2]),\
  57.          ADD_VEC4 ((M)[3],(A)[3],(B)[3]))
  58.  
  59. #define SUB_MAT4(V,A,B)\
  60.         (SUB_VEC4 ((M)[0],(A)[0],(B)[0]),\
  61.          SUB_VEC4 ((M)[1],(A)[1],(B)[1]),\
  62.          SUB_VEC4 ((M)[2],(A)[2],(B)[2]),\
  63.          SUB_VEC4 ((M)[3],(A)[3],(B)[3]))
  64.  
  65. #define MUL_MAT4(V,A,B)\
  66.         (MUL_VEC4 ((M)[0],(A)[0],(B)[0]),\
  67.          MUL_VEC4 ((M)[1],(A)[1],(B)[1]),\
  68.          MUL_VEC4 ((M)[2],(A)[2],(B)[2]),\
  69.          MUL_VEC4 ((M)[3],(A)[3],(B)[3]))
  70.  
  71. #define DIV_MAT4(V,A,B)\
  72.         (DIV_VEC4 ((M)[0],(A)[0],(B)[0]),\
  73.          DIV_VEC4 ((M)[1],(A)[1],(B)[1]),\
  74.          DIV_VEC4 ((M)[2],(A)[2],(B)[2]),\
  75.          DIV_VEC4 ((M)[3],(A)[3],(B)[3]))
  76.  
  77. /*
  78. ** Addition, subtraction, multiplication, division (by a scalar element)
  79. */
  80.  
  81. #define ADDS_MAT4(M,A,s)\
  82.         (ADDS_VEC4 ((M)[0],(A)[0],s),\
  83.          ADDS_VEC4 ((M)[1],(A)[1],s),\  
  84.          ADDS_VEC4 ((M)[2],(A)[2],s),\
  85.          ADDS_VEC4 ((M)[3],(A)[3],s))
  86.  
  87. #define SUBS_MAT4(V,A,B)\
  88.         (SUBS_VEC4 ((M)[0],(A)[0],s),\
  89.          SUBS_VEC4 ((M)[1],(A)[1],s),\
  90.          SUBS_VEC4 ((M)[2],(A)[2],s),\
  91.          SUBS_VEC4 ((M)[3],(A)[3],s))
  92.  
  93. #define MULS_MAT4(V,A,B)\
  94.         (MULS_VEC4 ((M)[0],(A)[0],s),\
  95.          MULS_VEC4 ((M)[1],(A)[1],s),\
  96.          MULS_VEC4 ((M)[2],(A)[2],s),\
  97.          MULS_VEC4 ((M)[3],(A)[3],s))
  98.  
  99. #define DIVS_MAT4(V,A,B)\
  100.         (DIVS_VEC4 ((M)[0],(A)[0],s),\
  101.          DIVS_VEC4 ((M)[1],(A)[1],s),\
  102.          DIVS_VEC4 ((M)[2],(A)[2],s),\
  103.          DIVS_VEC4 ((M)[3],(A)[3],s))
  104.  
  105. /*
  106. ** Determinant, transposition, ajunction, inversion --> YET TO DO
  107. */ 
  108.  
  109. /*
  110. #define DELTA_MAT4(M)
  111.  
  112. #define TRANS_MAT4(M,A)
  113.  
  114. #define ADJ_MAT4(M,A)
  115.  
  116. #define INV_MAT4(M,A,s)
  117. */
  118.  
  119. /*
  120. ** Matrix product, left vector product, right vector product
  121. */
  122.  
  123. #define ROW_VEC4(M,n,V)\
  124.         ((M)[0].n*(V).x + (M)[1].n*(V).y + (M)[2].n*(V).z + (M)[3].n*(V).w)
  125.  
  126. #define PROD_MAT4(M,A,B)\
  127.         ((M)[0].x = ROW_VEC4 ((A),x,(B)[0]),\
  128.          (M)[0].y = ROW_VEC4 ((A),y,(B)[0]),\
  129.          (M)[0].z = ROW_VEC4 ((A),z,(B)[0]),\
  130.          (M)[0].w = ROW_VEC4 ((A),w,(B)[0]),\
  131.          (M)[1].x = ROW_VEC4 ((A),x,(B)[1]),\
  132.          (M)[1].y = ROW_VEC4 ((A),y,(B)[1]),\
  133.          (M)[1].z = ROW_VEC4 ((A),z,(B)[1]),\
  134.          (M)[1].w = ROW_VEC4 ((A),w,(B)[1]),\
  135.          (M)[2].x = ROW_VEC4 ((A),x,(B)[2]),\
  136.          (M)[2].y = ROW_VEC4 ((A),y,(B)[2]),\
  137.          (M)[2].z = ROW_VEC4 ((A),z,(B)[2]),\
  138.          (M)[2].w = ROW_VEC4 ((A),w,(B)[2]),\
  139.          (M)[3].x = ROW_VEC4 ((A),x,(B)[3]),\
  140.          (M)[3].y = ROW_VEC4 ((A),y,(B)[3]),\
  141.          (M)[3].z = ROW_VEC4 ((A),z,(B)[3]),\
  142.          (M)[3].w = ROW_VEC4 ((A),w,(B)[3]))
  143.  
  144. #define LMAT_VEC4(V,A,M)\
  145.         ((V).x = ROW_VEC4 ((M),x,(A)),\
  146.          (V).y = ROW_VEC4 ((M),y,(A)),\
  147.          (V).z = ROW_VEC4 ((M),z,(A)),\
  148.          (V).w = ROW_VEC4 ((M),w,(A)))
  149.  
  150. #define RMAT_VEC4(V,M,A)\
  151.         ((V).x = DOT_VEC4 ((A),(M)[0]),\
  152.          (V).y = DOT_VEC4 ((A),(M)[1]),\
  153.          (V).z = DOT_VEC4 ((A),(M)[2]),\
  154.          (V).w = DOT_VEC4 ((A),(M)[3]))
  155.  
  156. #endif
  157.  
  158. /* ------------------------------------------------------------------------- */
  159.