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

  1. /* ------------------------------------------------------------------------- *\
  2.    VEC3.H :
  3.  
  4.    Definition and manipulation of a 3D vector (either integers or reals)
  5.  
  6.    by Christophe Schlick (1 June 1992)
  7. \* ------------------------------------------------------------------------- */
  8.  
  9. #ifndef _VEC3_
  10. #define _VEC3_
  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_VEC3(V,X,Y,Z)\
  19.         ((V).x = X,\
  20.          (V).y = Y,\
  21.          (V).z = Z)
  22.  
  23. #define COPY_VEC3(V,A)\
  24.         ((V).x = (A).x,\
  25.          (V).y = (A).y,\
  26.          (V).z = (A).z)
  27.  
  28. #define SWAP_VEC3(A,B,t)\
  29.         (SWAP ((A).x, (B).x, t),\
  30.          SWAP ((A).y, (B).y, t),\
  31.          SWAP ((A).z, (B).z, t))
  32.  
  33. #define ABS_VEC3(V,A)\
  34.         ((V).x = ABS ((A).x),\
  35.          (V).y = ABS ((A).y),\
  36.          (V).z = ABS ((A).z))
  37.  
  38. #define SGN_VEC3(V,A)\
  39.         ((V).x = SGN ((A).x),\
  40.          (V).y = SGN ((A).y),\
  41.          (V).z = SGN ((A).z))
  42.  
  43. #define NEG_VEC3(V,A)\
  44.         ((V).x = -(A).x,\
  45.          (V).y = -(A).y,\
  46.          (V).z = -(A).z)
  47.  
  48. #define ROUND_VEC3(V,A)\
  49.         ((V).x = ROUND ((A).x),\
  50.          (V).y = ROUND ((A).y),\
  51.          (V).z = ROUND ((A).z))
  52.  
  53. #define ZERO_VEC3(A)\
  54.         (ZERO ((A).x) &&\
  55.          ZERO ((A).y) &&\
  56.          ZERO ((A).z))
  57.  
  58. #define ZERO_TOL_VEC3(A,t)\
  59.         (ZERO_TOL ((A).x,t) &&\
  60.          ZERO_TOL ((A).y,t) &&\
  61.          ZERO_TOL ((A).z,t))
  62.  
  63. #define SAME_VEC3(A,B)\
  64.         (SAME ((A).x,(B).x) &&\
  65.          SAME ((A).y,(B).y) &&\
  66.          SAME ((A).z,(B).z))
  67.  
  68. #define SAME_TOL_VEC3(A,B,t)\
  69.         (SAME_TOL ((A).x,(B).x,t) &&\
  70.          SAME_TOL ((A).y,(B).y,t) &&\
  71.          SAME_TOL ((A).z,(B).z,t))
  72.  
  73. #define IN_VEC3(V,A,B)\
  74.         (IN ((V).x,(A).x,(B).x) &&\
  75.          IN ((V).y,(A).y,(B).y) &&\
  76.          IN ((V).z,(A).z,(B).z))
  77.  
  78. #define OUT_VEC3(V,A,B)\
  79.         (OUT ((V).x,(A).x,(B).x) ||\
  80.          OUT ((V).y,(A).y,(B).y) ||\
  81.          OUT ((V).z,(A).z,(B).z))
  82.  
  83. #define CLAMP_VEC3(V,A,B)\
  84.         ((V).x = CLAMP ((A).x,(B).x),\
  85.          (V).y = CLAMP ((A).y,(B).y),\
  86.          (V).z = CLAMP ((A).z,(B).z))
  87.  
  88. #define MIN_VEC3(V,A,B)\
  89.         ((V).x = MIN ((A).x,(B).x),\
  90.          (V).y = MIN ((A).y,(B).y),\
  91.          (V).z = MIN ((A).z,(B).z))
  92.  
  93. #define MAX_VEC3(V,A,B)\
  94.         ((V).x = MAX ((A).x,(B).x),\
  95.          (V).y = MAX ((A).y,(B).y),\
  96.          (V).z = MAX ((A).z,(B).z))
  97.  
  98. #define MINMIN_VEC3(V,A,B,C)\
  99.         ((V).x = MINMIN ((A).x,(B).x,(C).x),\
  100.          (V).y = MINMIN ((A).y,(B).y,(C).y),\
  101.          (V).z = MINMIN ((A).z,(B).z,(C).z))
  102.  
  103. #define MAXMAX_VEC3(V,A,B,C)\
  104.         ((V).x = MAXMAX ((A).x,(B).x,(C).x),\
  105.          (V).y = MAXMAX ((A).y,(B).y,(C).y),\
  106.          (V).z = MAXMAX ((A).z,(B).z,(C).z))
  107.  
  108. /*
  109. ** Addition, subtraction, multiplication, division (by a vector element)
  110. */
  111.  
  112. #define INC_VEC3(V,A)\
  113.         ((V).x += (A).x,\
  114.          (V).y += (A).y,\
  115.          (V).z += (A).z)
  116.  
  117. #define DEC_VEC3(V,A)\
  118.         ((V).x -= (A).x,\
  119.          (V).y -= (A).y,\
  120.          (V).z -= (A).z)
  121.  
  122. #define ADD_VEC3(V,A,B)\
  123.         ((V).x = (A).x + (B).x,\
  124.          (V).y = (A).y + (B).y,\
  125.          (V).z = (A).z + (B).z)
  126.  
  127. #define SUB_VEC3(V,A,B)\
  128.         ((V).x = (A).x - (B).x,\
  129.          (V).y = (A).y - (B).y,\
  130.          (V).z = (A).z - (B).z)
  131.  
  132. #define MUL_VEC3(V,A,B)\
  133.         ((V).x = (A).x * (B).x,\
  134.          (V).y = (A).y * (B).y,\
  135.          (V).z = (A).z * (B).z)
  136.  
  137. #define DIV_VEC3(V,A,B)\
  138.         ((V).x = (A).x / (B).x,\
  139.          (V).y = (A).y / (B).y,\
  140.          (V).z = (A).z / (B).z)
  141.  
  142. /*
  143. ** Addition, subtraction, multiplication, division (by a scalar element)
  144. */
  145.  
  146. #define INCS_VEC3(V,s)\
  147.         ((V).x += (s),\
  148.          (V).y += (s),\
  149.          (V).z += (s))
  150.  
  151. #define DECS_VEC3(V,s)\
  152.         ((V).x -= (s),\
  153.          (V).y -= (s),\
  154.          (V).z -= (s))
  155.  
  156. #define ADDS_VEC3(V,A,s)\
  157.         ((V).x = (A).x + (s),\
  158.          (V).y = (A).y + (s),\
  159.          (V).z = (A).z + (s))
  160.  
  161. #define SUBS_VEC3(V,A,s)\
  162.         ((V).x = (A).x - (s),\
  163.          (V).y = (A).y - (s),\
  164.          (V).z = (A).z - (s))
  165.  
  166. #define MULS_VEC3(V,A,s)\
  167.         ((V).x = (A).x * (s),\
  168.          (V).y = (A).y * (s),\
  169.          (V).z = (A).z * (s))
  170.  
  171. #define DIVS_VEC3(V,A,s)\
  172.         ((V).x = (A).x / (s),\
  173.          (V).y = (A).y / (s),\
  174.          (V).z = (A).z / (s))
  175.  
  176. /*
  177. ** Linear combinations, linear/hermite/cardinal interpolations (see "tool.h")
  178. */
  179.  
  180. #define COMB2_VEC3(V,a,A,b,B)\
  181.         ((V).x = (a) * (A).x + (b) * (B).x,\
  182.          (V).y = (a) * (A).y + (b) * (B).y,\
  183.          (V).z = (a) * (A).z + (b) * (B).z)
  184.  
  185. #define COMB3_VEC3(V,a,A,b,B,c,C)\
  186.         ((V).x = (a) * (A).x + (b) * (B).x + (c) * (C).x,\
  187.          (V).y = (a) * (A).y + (b) * (B).y + (c) * (C).y,\
  188.          (V).z = (a) * (A).z + (b) * (B).z + (c) * (C).z)
  189.  
  190. #define COMB4_VEC3(V,a,A,b,B,c,C,d,D)\
  191.         ((V).x = (a) * (A).x + (b) * (B).x + (c) * (C).x + (d) * (D).x,\
  192.          (V).y = (a) * (A).y + (b) * (B).y + (c) * (C).y + (d) * (D).y,\
  193.          (V).z = (a) * (A).z + (b) * (B).z + (c) * (C).z + (d) * (D).z)
  194.  
  195. #define LERP_VEC3(V,t,A,B)\
  196.         ((V).x = LERP ((t), (A).x, (B).x),\
  197.          (V).y = LERP ((t), (A).y, (B).y),\
  198.          (V).z = LERP ((t), (A).z, (B).z))
  199.  
  200. #define HERP_VEC3(V,t,A,B)\
  201.         ((V).x = HERP ((t), (A).x, (B).x),\
  202.          (V).y = HERP ((t), (A).y, (B).y),\
  203.          (V).z = HERP ((t), (A).z, (B).z))
  204.  
  205. #define CERP_VEC3(V,t,AA,A,B,BB)\
  206.         ((V).x = CERP ((t), (AA).x, (A).x, (B).x, (BB).x),\
  207.          (V).y = CERP ((t), (AA).y, (A).y, (B).y, (BB).y),\
  208.          (V).z = CERP ((t), (AA).z, (A).z, (B).z, (BB).z))
  209.  
  210. /*
  211. ** Perpendicular, determinant, dot product, length, normalization
  212. */
  213.  
  214. #define PERP_VEC3(V,A,B)\
  215.         ((V).x = (A).y * (B).z - (A).z * (B).y,\
  216.          (V).y = (A).z * (B).x - (A).x * (B).z,\
  217.          (V).z = (A).x * (B).y - (A).y * (B).x)
  218.  
  219. #define CROSS_VEC3(V,A,B) PERP_VEC3 (V,A,B)   /* Perp is also cross product */
  220.                              
  221. #define DELTA_VEC3(A,B,C)\
  222.         ((A).x * ((B).y * (C).z - (B).z * (C).y)\
  223.         +(A).y * ((B).z * (C).x - (B).x * (C).z)\
  224.         +(A).z * ((B).x * (C).y - (B).y * (C).x))
  225.  
  226. #define DOT_VEC3(A,B)\
  227.         ((A).x * (B).x + (A).y * (B).y + (A).z * (B).z)
  228.  
  229. #define LEN_VEC3(A)\
  230.         (sqrt ((double) DOT_VEC3 (A, A)))
  231.  
  232. #define UNIT_VEC3(V,A,s)\
  233.         ((s) = LEN_VEC3 (A), (s) ? (DIVS_VEC3 (V,A,s), TRUE) : FALSE)
  234.  
  235. #endif
  236.  
  237. /* ------------------------------------------------------------------------- */
  238.