home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch7_7 / mactbox / vec4.h < prev   
Encoding:
C/C++ Source or Header  |  1994-09-24  |  6.9 KB  |  262 lines

  1. /* ------------------------------------------------------------------------- *\
  2.    VEC4.H :
  3.  
  4.    Definition and manipulation of a 4D vector (either integers or reals)
  5.  
  6.    by Christophe Schlick (1 June 1992)
  7. \* ------------------------------------------------------------------------- */
  8.  
  9. #ifndef _VEC4_
  10. #define _VEC4_
  11.  
  12. #include "tool.h"
  13.  
  14. /*
  15. ** These macros are equivalent (for 3D vectors) to the ones given in tool.h
  16. */
  17.  
  18. #define MAKE_VEC4(V,X,Y,Z,W)\
  19.         ((V).x = X,\
  20.          (V).y = Y,\
  21.          (V).z = Z,\
  22.          (V).w = W)
  23.  
  24. #define COPY_VEC4(V,A)\
  25.         ((V).x = (A).x,\
  26.          (V).y = (A).y,\
  27.          (V).z = (A).z,\
  28.          (V).w = (A).w)
  29.  
  30. #define SWAP_VEC4(A,B,t)\
  31.         (SWAP ((A).x, (B).x, t),\
  32.          SWAP ((A).y, (B).y, t),\
  33.          SWAP ((A).z, (B).z, t),\
  34.          SWAP ((A).w, (B).w, t))
  35.  
  36. #define ABS_VEC4(V,A)\
  37.         ((V).x = ABS ((A).x),\
  38.          (V).y = ABS ((A).y),\
  39.          (V).z = ABS ((A).z),\
  40.          (V).w = ABS ((A).w))
  41.  
  42. #define SGN_VEC4(V,A)\
  43.         ((V).x = SGN ((A).x),\
  44.          (V).y = SGN ((A).y),\
  45.          (V).z = SGN ((A).z),\
  46.          (V).w = SGN ((A).w))
  47.  
  48. #define NEG_VEC4(V)\
  49.         ((V).x = -(V).x,\
  50.          (V).y = -(V).y,\
  51.          (V).z = -(V).z,\
  52.          (V).w = -(V).w)
  53.  
  54. #define ROUND_VEC4(V,A)\
  55.         ((V).x = ROUND ((A).x),\
  56.          (V).y = ROUND ((A).y),\
  57.          (V).z = ROUND ((A).z),\
  58.          (V).w = ROUND ((A).w))
  59.  
  60. #define ZERO_VEC4(A)\
  61.         (ZERO ((A).x) &&\
  62.          ZERO ((A).y) &&\
  63.          ZERO ((A).z) &&\
  64.          ZERO ((A).w))
  65.  
  66. #define ZERO_TOL_VEC4(A,t)\
  67.         (ZERO_TOL ((A).x,t) &&\
  68.          ZERO_TOL ((A).y,t) &&\
  69.          ZERO_TOL ((A).z,t) &&\
  70.          ZERO_TOL ((A).w,t))
  71.  
  72. #define SAME_VEC4(A,B)\
  73.         (SAME ((A).x,(B).x) &&\
  74.          SAME ((A).y,(B).y) &&\
  75.          SAME ((A).z,(B).z) &&\
  76.          SAME ((A).w,(B).w))
  77.  
  78. #define SAME_TOL_VEC4(A,B,t)\
  79.         (SAME_TOL ((A).x,(B).x,t) &&\
  80.          SAME_TOL ((A).y,(B).y,t) &&\
  81.          SAME_TOL ((A).z,(B).z,t) &&\
  82.          SAME_TOL ((A).w,(B).w,t))
  83.  
  84. #define IN_VEC4(V,A,B)\
  85.         (IN ((V).x,(A).x,(B).x) &&\
  86.          IN ((V).y,(A).y,(B).y) &&\
  87.          IN ((V).z,(A).z,(B).z) &&\
  88.          IN ((V).w,(A).w,(B).w))
  89.  
  90. #define OUT_VEC4(V,A,B)\
  91.         (OUT ((V).x,(A).x,(B).x) ||\
  92.          OUT ((V).y,(A).y,(B).y) ||\
  93.          OUT ((V).z,(A).z,(B).z) ||\
  94.          OUT ((V).w,(A).w,(B).w))
  95.  
  96. #define CLAMP_VEC4(V,A,B)\
  97.         ((V).x = CLAMP ((A).x,(B).x),\
  98.          (V).y = CLAMP ((A).y,(B).y),\
  99.          (V).z = CLAMP ((A).z,(B).z),\
  100.          (V).w = CLAMP ((A).w,(B).w))
  101.  
  102. #define MIN_VEC4(V,A,B)\
  103.         ((V).x = MIN ((A).x,(B).x),\
  104.          (V).y = MIN ((A).y,(B).y),\
  105.          (V).z = MIN ((A).z,(B).z),\ 
  106.          (V).w = MIN ((A).w,(B).w))
  107.  
  108. #define MAX_VEC4(V,A,B)\
  109.         ((V).x = MAX ((A).x,(B).x),\ 
  110.          (V).y = MAX ((A).y,(B).y),\
  111.          (V).z = MAX ((A).z,(B).z),\
  112.          (V).w = MAX ((A).w,(B).w))
  113.  
  114. #define MINMIN_VEC4(V,A,B,C)\
  115.         ((V).x = MINMIN ((A).x,(B).x,(C).x),\
  116.          (V).y = MINMIN ((A).y,(B).y,(C).y),\
  117.          (V).z = MINMIN ((A).z,(B).z,(C).z),\
  118.          (V).w = MINMIN ((A).w,(B).w,(C).w))
  119.  
  120. #define MAXMAX_VEC4(V,A,B,C)\
  121.         ((V).x = MAXMAX ((A).x,(B).x,(C).x),\
  122.          (V).y = MAXMAX ((A).y,(B).y,(C).y),\
  123.          (V).z = MAXMAX ((A).z,(B).z,(C).z),\
  124.          (V).w = MAXMAX ((A).w,(B).w,(C).w))
  125.  
  126. /*
  127. ** Addition, subtraction, multiplication, division (by a vector element)
  128. */
  129.  
  130. #define INC_VEC4(V,A)\
  131.         ((V).x += (A).x,\
  132.          (V).y += (A).y,\
  133.          (V).z += (A).z,\
  134.          (V).w += (A).w)
  135.  
  136. #define DEC_VEC4(V,A)\
  137.         ((V).x -= (A).x,\
  138.          (V).y -= (A).y,\
  139.          (V).z -= (A).z,\
  140.          (V).w -= (A).w)
  141.  
  142. #define ADD_VEC4(V,A,B)\
  143.         ((V).x = (A).x + (B).x,\
  144.          (V).y = (A).y + (B).y,\
  145.          (V).z = (A).z + (B).z,\
  146.          (V).w = (A).w + (B).w)
  147.  
  148. #define SUB_VEC4(V,A,B)\
  149.         ((V).x = (A).x - (B).x,\
  150.          (V).y = (A).y - (B).y,\
  151.          (V).z = (A).z - (B).z,\
  152.          (V).w = (A).w - (B).w)
  153.  
  154. #define MUL_VEC4(V,A,B)\
  155.         ((V).x = (A).x * (B).x,\
  156.          (V).y = (A).y * (B).y,\
  157.          (V).z = (A).z * (B).z,\
  158.          (V).w = (A).w * (B).w)
  159.  
  160. #define DIV_VEC4(V,A,B)\
  161.         ((V).x = (A).x / (B).x,\
  162.          (V).y = (A).y / (B).y,\
  163.          (V).z = (A).z / (B).z,\
  164.          (V).w = (A).w / (B).w)
  165.  
  166. /*
  167. ** Addition, subtraction, multiplication, division (by a scalar element)
  168. */
  169.  
  170. #define INCS_VEC4(V,s)\
  171.         ((V).x += (s),\
  172.          (V).y += (s),\
  173.          (V).z += (s),\
  174.          (V).w += (s))
  175.  
  176. #define DECS_VEC4(V,s)\
  177.         ((V).x -= (s),\
  178.          (V).y -= (s),\
  179.          (V).z -= (s),\
  180.          (V).w -= (s))
  181.  
  182. #define ADDS_VEC4(V,A,s)\
  183.         ((V).x = (A).x + (s),\
  184.          (V).y = (A).y + (s),\
  185.          (V).z = (A).z + (s),\
  186.          (V).w = (A).w + (s))
  187.  
  188. #define SUBS_VEC4(V,A,s)\
  189.         ((V).x = (A).x - (s),\
  190.          (V).y = (A).y - (s),\
  191.          (V).z = (A).z - (s),\
  192.          (V).w = (A).w - (s))
  193.  
  194. #define MULS_VEC4(V,A,s)\
  195.         ((V).x = (A).x * (s),\
  196.          (V).y = (A).y * (s),\
  197.          (V).z = (A).z * (s),\
  198.          (V).w = (A).w * (s))
  199.  
  200. #define DIVS_VEC4(V,A,s)\
  201.         ((V).x = (A).x / (s),\
  202.           (V).y = (A).y / (s),\
  203.          (V).z = (A).z / (s),\
  204.           (V).w = (A).w / (s))
  205.  
  206. /*
  207. ** Linear combination
  208. */
  209.  
  210. #define COMB2_VEC4(V,a,A,b,B)\
  211.         ((V).x = (a) * (A).x + (b) * (B).x,\
  212.          (V).y = (a) * (A).y + (b) * (B).y,\
  213.          (V).z = (a) * (A).z + (b) * (B).z,\
  214.          (V).w = (a) * (A).w + (b) * (B).w)
  215.  
  216. #define COMB3_VEC4(V,a,A,b,B,c,C)\
  217.         ((V).x = (a) * (A).x + (b) * (B).x + (c) * (C).x,\
  218.          (V).y = (a) * (A).y + (b) * (B).y + (c) * (C).y,\
  219.          (V).z = (a) * (A).z + (b) * (B).z + (c) * (C).z,\
  220.          (V).w = (a) * (A).w + (b) * (B).w + (c) * (C).w)
  221.  
  222. #define COMB4_VEC4(V,a,A,b,B,c,C,d,D)\
  223.         ((V).x = (a) * (A).x + (b) * (B).x + (c) * (C).x + (d) * (D).x,\
  224.          (V).y = (a) * (A).y + (b) * (B).y + (c) * (C).y + (d) * (D).y,\
  225.          (V).z = (a) * (A).z + (b) * (B).z + (c) * (C).z + (d) * (D).z,\
  226.          (V).w = (a) * (A).w + (b) * (B).w + (c) * (C).w + (d) * (D).w)
  227.  
  228. #define LERP_VEC3(V,t,A,B)\
  229.         ((V).x = LERP ((t), (A).x, (B).x),\
  230.          (V).y = LERP ((t), (A).y, (B).y),\
  231.          (V).z = LERP ((t), (A).z, (B).z),\
  232.          (V).z = LERP ((t), (A).w, (B).w))
  233.  
  234. #define HERP_VEC3(V,t,A,B)\
  235.         ((V).x = HERP ((t), (A).x, (B).x),\
  236.          (V).y = HERP ((t), (A).y, (B).y),\
  237.          (V).z = HERP ((t), (A).z, (B).z),\
  238.          (V).w = HERP ((t), (A).w, (B).w))
  239.  
  240. #define CERP_VEC3(V,t,AA,A,B,BB)\
  241.         ((V).x = CERP ((t), (AA).x, (A).x, (B).x, (BB).x),\
  242.          (V).y = CERP ((t), (AA).y, (A).y, (B).y, (BB).y),\
  243.          (V).z = CERP ((t), (AA).z, (A).z, (B).z, (BB).z),\
  244.          (V).w = CERP ((t), (AA).w, (A).w, (B).w, (BB).w))
  245.  
  246. /*
  247. ** Dot product, length, normalization
  248. */
  249.  
  250. #define DOT_VEC4(A,B)\
  251.         ((A).x * (B).x + (A).y * (B).y + (A).z * (B).z + (A).w * (B).w)
  252.  
  253. #define LEN_VEC4(A)\
  254.         (sqrt ((double) DOT_VEC4 (A,A)))
  255.  
  256. #define UNIT_VEC4(V,A,s)\
  257.         (s = LEN_REAL2 (A), (s) ? (DIVS_REAL2 (V,A,s), TRUE) : FALSE)
  258.  
  259. #endif
  260.  
  261. /* ------------------------------------------------------------------------- */
  262.