t3dlib4.h
上传用户:husern
上传日期:2018-01-20
资源大小:42486k
文件大小:22k
源码类别:

游戏

开发平台:

Visual C++

  1. // T3DLIB4.H - Header file for T3DLIB4.CPP game engine library
  2. // watch for multiple inclusions
  3. #ifndef T3DLIB4
  4. #define T3DLIB4
  5. // DEFINES & CONSTANTS /////////////////////////////////////
  6. // defines for small numbers
  7. #define EPSILON_E3 (float)(1E-3) 
  8. #define EPSILON_E4 (float)(1E-4) 
  9. #define EPSILON_E5 (float)(1E-5)
  10. #define EPSILON_E6 (float)(1E-6)
  11. // defines for parametric line intersections
  12. #define PARM_LINE_NO_INTERSECT          0
  13. #define PARM_LINE_INTERSECT_IN_SEGMENT  1
  14. #define PARM_LINE_INTERSECT_OUT_SEGMENT 2
  15. #define PARM_LINE_INTERSECT_EVERYWHERE  3
  16. // TYPES //////////////////////////////////////////////////
  17. // 2x2 matrix /////////////////////////////////////////////
  18. typedef struct MATRIX2X2_TYP
  19. {
  20. union
  21.     {
  22.     float M[2][2]; // array indexed data storage
  23.     // storage in row major form with explicit names
  24.     struct
  25.          {
  26.          float M00, M01;
  27.          float M10, M11;
  28.          }; // end explicit names
  29.      }; // end union
  30. } MATRIX2X2, *MATRIX2X2_PTR;
  31. // 1x4 matrix /////////////////////////////////////////////
  32. typedef struct MATRIX1X4_TYP
  33. {
  34. union
  35.     {
  36.     float M[4]; // array indexed data storage
  37.     // storage in row major form with explicit names
  38.     struct
  39.          {
  40.          float M00, M01, M02, M03;
  41.          }; // end explicit names
  42.      }; // end union
  43. } MATRIX1X4, *MATRIX1X4_PTR;
  44. // 4x4 matrix /////////////////////////////////////////////
  45. typedef struct MATRIX4X4_TYP
  46. {
  47. union
  48.     {
  49.     float M[4][4]; // array indexed data storage
  50.     // storage in row major form with explicit names
  51.     struct
  52.          {
  53.          float M00, M01, M02, M03;
  54.          float M10, M11, M12, M13;
  55.          float M20, M21, M22, M23;
  56.          float M30, M31, M32, M33;
  57.          }; // end explicit names
  58.     }; // end union
  59. } MATRIX4X4, *MATRIX4X4_PTR;
  60. // 4x3 matrix /////////////////////////////////////////////
  61. typedef struct MATRIX4X3_TYP
  62. {
  63. union
  64.     {
  65.     float M[4][3]; // array indexed data storage
  66.     // storage in row major form with explicit names
  67.     struct
  68.          {
  69.          float M00, M01, M02;
  70.          float M10, M11, M12;
  71.          float M20, M21, M22;
  72.          float M30, M31, M32;
  73.          }; // end explicit names
  74.     }; // end union
  75. } MATRIX4X3, *MATRIX4X3_PTR;
  76. // vector types ///////////////////////////////////////////
  77. // 2D vector, point without the w ////////////////////////
  78. typedef struct VECTOR2D_TYP
  79. {
  80. union
  81.     {
  82.     float M[2]; // array indexed storage
  83.     // explicit names
  84.     struct
  85.          {
  86.          float x,y;
  87.          }; // end struct
  88.     }; // end union
  89. } VECTOR2D, POINT2D, *VECTOR2D_PTR, *POINT2D_PTR;
  90. // 3D vector, point without the w ////////////////////////
  91. typedef struct VECTOR3D_TYP
  92. {
  93. union
  94.     {
  95.     float M[3]; // array indexed storage
  96.     // explicit names
  97.     struct
  98.          {
  99.          float x,y,z;
  100.          }; // end struct
  101.     }; // end union
  102. } VECTOR3D, POINT3D, *VECTOR3D_PTR, *POINT3D_PTR;
  103. // 4D homogenous vector, point with w ////////////////////
  104. typedef struct VECTOR4D_TYP
  105. {
  106. union
  107.     {
  108.     float M[4]; // array indexed storage
  109.     // explicit names
  110.     struct
  111.          {
  112.          float x,y,z,w;
  113.          }; // end struct
  114.     }; // end union
  115. } VECTOR4D, POINT4D, *VECTOR4D_PTR, *POINT4D_PTR;
  116. // 2D parametric line /////////////////////////////////////////
  117. typedef struct PARMLINE2D_TYP
  118. {
  119. POINT2D  p0; // start point of parametric line
  120. POINT2D  p1; // end point of parametric line
  121. VECTOR2D v;  // direction vector of line segment
  122.              // |v|=|p0->p1|
  123. } PARMLINE2D, *PARMLINE2D_PTR;
  124. // 3D parametric line /////////////////////////////////////////
  125. typedef struct PARMLINE3D_TYP
  126. {
  127. POINT3D  p0; // start point of parametric line
  128. POINT3D  p1; // end point of parametric line
  129. VECTOR3D v;  // direction vector of line segment
  130.              // |v|=|p0->p1|
  131. } PARMLINE3D, *PARMLINE3D_PTR;
  132. // 3D plane ///////////////////////////////////////////////////
  133. typedef struct PLANE3D_TYP
  134. {
  135. POINT3D p0; // point on the plane
  136. VECTOR3D n; // normal to the plane (not necessarily a unit vector)
  137. } PLANE3D, *PLANE3D_PTR;
  138. // 2D polar coordinates ///////////////////////////////////////
  139. typedef struct POLAR2D_TYP
  140. {
  141. float r;     // the radi of the point
  142. float theta; // the angle in rads
  143. } POLAR2D, *POLAR2D_PTR;
  144. // 3D cylindrical coordinates ////////////////////////////////
  145. typedef struct CYLINDRICAL3D_TYP
  146. {
  147. float r;     // the radi of the point
  148. float theta; // the angle in degrees about the z axis
  149. float z;     // the z-height of the point
  150. } CYLINDRICAL3D, *CYLINDRICAL3D_PTR;
  151. // 3D spherical coordinates //////////////////////////////////
  152. typedef struct SPHERICAL3D_TYP
  153. {
  154. float p;      // rho, the distance to the point from the origin
  155. float theta;  // the angle from the z-axis and the line segment o->p
  156. float phi;    // the angle from the projection if o->p onto the x-y 
  157.               // plane and the x-axis
  158. } SPHERICAL3D, *SPHERICAL3D_PTR;
  159. // 4d quaternion ////////////////////////////////////////////
  160. // note the union gives us a number of ways to work with
  161. // the components of the quaternion
  162. typedef struct QUAT_TYP
  163. {
  164. union
  165.     {
  166.     float M[4]; // array indexed storage w,x,y,z order
  167.     // vector part, real part format
  168.     struct 
  169.          {
  170.          float    q0;  // the real part
  171.          VECTOR3D qv;  // the imaginary part xi+yj+zk
  172.          };
  173.     struct
  174.          {
  175.          float w,x,y,z;
  176.          }; 
  177.     }; // end union
  178. } QUAT, *QUAT_PTR;
  179. // fixed point types //////////////////////////////////////////
  180. typedef int FIXP16;
  181. typedef int *FIXP16_PTR;
  182. ///////////////////////////////////////////////////////////////
  183. // FORWARD REF DEFINES & CONSTANTS ////////////////////////////
  184. // identity matrices
  185. // 4x4 identity matrix
  186. const MATRIX4X4 IMAT_4X4 = {1,0,0,0, 
  187.                             0,1,0,0, 
  188.                             0,0,1,0, 
  189.                             0,0,0,1};
  190. // 4x3 identity matrix (note this is not correct mathematically)
  191. // but later we may use 4x3 matrices with the assumption that 
  192. // the last column is always [0 0 0 1]t
  193. const MATRIX4X3 IMAT_4X3 = {1,0,0, 
  194.                             0,1,0, 
  195.                             0,0,1, 
  196.                             0,0,0,};
  197. // 3x3 identity matrix
  198. const MATRIX3X3 IMAT_3X3 = {1,0,0, 
  199.                             0,1,0, 
  200.                             0,0,1};
  201. // 2x2 identity matrix
  202. const MATRIX2X2 IMAT_2X2 = {1,0, 
  203.                             0,1};
  204. // MACROS, SMALL INLINE FUNCS /////////////////////////////////
  205. // matrix macros
  206. // macros to clear out matrices
  207. #define MAT_ZERO_2X2(m) {memset((void *)(m), 0, sizeof(MATRIX2X2));}
  208. #define MAT_ZERO_3X3(m) {memset((void *)(m), 0, sizeof(MATRIX3X3));}
  209. #define MAT_ZERO_4X4(m) {memset((void *)(m), 0, sizeof(MATRIX4X4));}
  210. #define MAT_ZERO_4X3(m) {memset((void *)(m), 0, sizeof(MATRIX4X3));}
  211. // macros to set the identity matrix
  212. #define MAT_IDENTITY_2X2(m) {memcpy((void *)(m), (void *)&IMAT_2X2, sizeof(MATRIX2X2));}
  213. #define MAT_IDENTITY_3X3(m) {memcpy((void *)(m), (void *)&IMAT_3X3, sizeof(MATRIX3X3));}
  214. #define MAT_IDENTITY_4X4(m) {memcpy((void *)(m), (void *)&IMAT_4X4, sizeof(MATRIX4X4));}
  215. #define MAT_IDENTITY_4X3(m) {memcpy((void *)(m), (void *)&IMAT_4X3, sizeof(MATRIX4X3));}
  216. // matrix copying macros
  217. #define MAT_COPY_2X2(src_mat, dest_mat) {memcpy((void *)(dest_mat), (void *)(src_mat), sizeof(MATRIX2X2) ); }
  218. #define MAT_COPY_3X3(src_mat, dest_mat) {memcpy((void *)(dest_mat), (void *)(src_mat), sizeof(MATRIX3X3) ); }
  219. #define MAT_COPY_4X4(src_mat, dest_mat) {memcpy((void *)(dest_mat), (void *)(src_mat), sizeof(MATRIX4X4) ); }
  220. #define MAT_COPY_4X3(src_mat, dest_mat) {memcpy((void *)(dest_mat), (void *)(src_mat), sizeof(MATRIX4X3) ); }
  221. // matrix transposing macros
  222. inline void MAT_TRANSPOSE_3X3(MATRIX3X3_PTR m) 
  223. { MATRIX3X3 mt;
  224. mt.M00 = m->M00; mt.M01 = m->M10; mt.M02 = m->M20;
  225. mt.M10 = m->M01; mt.M11 = m->M11; mt.M12 = m->M21;
  226. mt.M20 = m->M02; mt.M21 = m->M12; mt.M22 = m->M22;
  227. memcpy((void *)m,(void *)&mt, sizeof(MATRIX3X3)); }
  228. inline void MAT_TRANSPOSE_4X4(MATRIX4X4_PTR m) 
  229. { MATRIX4X4 mt;
  230. mt.M00 = m->M00; mt.M01 = m->M10; mt.M02 = m->M20; mt.M03 = m->M30; 
  231. mt.M10 = m->M01; mt.M11 = m->M11; mt.M12 = m->M21; mt.M13 = m->M31; 
  232. mt.M20 = m->M02; mt.M21 = m->M12; mt.M22 = m->M22; mt.M23 = m->M32; 
  233. mt.M30 = m->M03; mt.M31 = m->M13; mt.M32 = m->M22; mt.M33 = m->M33; 
  234. memcpy((void *)m,(void *)&mt, sizeof(MATRIX4X4)); }
  235. inline void MAT_TRANSPOSE_3X3(MATRIX3X3_PTR m, MATRIX3X3_PTR mt) 
  236. { mt->M00 = m->M00; mt->M01 = m->M10; mt->M02 = m->M20;
  237.   mt->M10 = m->M01; mt->M11 = m->M11; mt->M12 = m->M21;
  238.   mt->M20 = m->M02; mt->M21 = m->M12; mt->M22 = m->M22; }
  239. inline void MAT_TRANSPOSE_4X4(MATRIX4X4_PTR m, MATRIX4X4_PTR mt) 
  240. { mt->M00 = m->M00; mt->M01 = m->M10; mt->M02 = m->M20; mt->M03 = m->M30; 
  241.   mt->M10 = m->M01; mt->M11 = m->M11; mt->M12 = m->M21; mt->M13 = m->M31; 
  242.   mt->M20 = m->M02; mt->M21 = m->M12; mt->M22 = m->M22; mt->M23 = m->M32; 
  243.   mt->M30 = m->M03; mt->M31 = m->M13; mt->M32 = m->M22; mt->M33 = m->M33; }
  244. // small inline functions that could be re-written as macros, but would
  245. // be less robust
  246. // matrix and vector column swaping macros
  247. inline void MAT_COLUMN_SWAP_2X2(MATRIX2X2_PTR m, int c, MATRIX1X2_PTR v) 
  248. { m->M[0][c]=v->M[0]; m->M[1][c]=v->M[1]; } 
  249. inline void MAT_COLUMN_SWAP_3X3(MATRIX3X3_PTR m, int c, MATRIX1X3_PTR v) 
  250. { m->M[0][c]=v->M[0]; m->M[1][c]=v->M[1]; m->M[2][c]=v->M[2]; } 
  251. inline void MAT_COLUMN_SWAP_4X4(MATRIX4X4_PTR m, int c, MATRIX1X4_PTR v) 
  252. {m->M[0][c]=v->M[0]; m->M[1][c]=v->M[1]; m->M[2][c]=v->M[2]; m->M[3][c]=v->M[3]; } 
  253. inline void MAT_COLUMN_SWAP_4X3(MATRIX4X3_PTR m, int c, MATRIX1X4_PTR v) 
  254. {m->M[0][c]=v->M[0]; m->M[1][c]=v->M[1]; m->M[2][c]=v->M[2]; m->M[3][c]=v->M[3]; } 
  255. // vector macros, note the 4D vector sets w=1
  256. // vector zeroing macros
  257. inline void VECTOR2D_ZERO(VECTOR2D_PTR v) 
  258. {(v)->x = (v)->y = 0.0;}
  259. inline void VECTOR3D_ZERO(VECTOR3D_PTR v) 
  260. {(v)->x = (v)->y = (v)->z = 0.0;}
  261. inline void VECTOR4D_ZERO(VECTOR4D_PTR v) 
  262. {(v)->x = (v)->y = (v)->z = 0.0; (v)->w = 1.0;}
  263. // macros to initialize vectors with explicit components
  264. inline void VECTOR2D_INITXY(VECTOR2D_PTR v, float x, float y) 
  265. {(v)->x = (x); (v)->y = (y);}
  266. inline void VECTOR3D_INITXYZ(VECTOR3D_PTR v, float x, float y, float z) 
  267. {(v)->x = (x); (v)->y = (y); (v)->z = (z);}
  268. inline void VECTOR4D_INITXYZ(VECTOR4D_PTR v, float x,float y,float z) 
  269. {(v)->x = (x); (v)->y = (y); (v)->z = (z); (v)->w = 1.0;}
  270. // used to convert from 4D homogenous to 4D non-homogenous
  271. inline void VECTOR4D_DIV_BY_W(VECTOR4D_PTR v) 
  272. {(v)->x/=(v)->w; (v)->y/=(v)->w; (v)->z/=(v)->w;  }
  273. inline void VECTOR4D_DIV_BY_W_VECTOR3D(VECTOR4D_PTR v4, VECTOR3D_PTR v3) 
  274. {(v3)->x = (v4)->x/(v4)->w; (v3)->y = (v4)->y/(v4)->w; (v3)->z = (v4)->z/(v4)->w;  }
  275. // vector intialization macros to initialize with other vectors
  276. inline void VECTOR2D_INIT(VECTOR2D_PTR vdst, VECTOR2D_PTR vsrc) 
  277. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  }
  278. inline void VECTOR3D_INIT(VECTOR3D_PTR vdst, VECTOR3D_PTR vsrc) 
  279. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  (vdst)->z = (vsrc)->z; }
  280. inline void VECTOR4D_INIT(VECTOR4D_PTR vdst, VECTOR4D_PTR vsrc) 
  281. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  
  282. (vdst)->z = (vsrc)->z; (vdst)->w = (vsrc)->w;  }
  283. // vector copying macros
  284. inline void VECTOR2D_COPY(VECTOR2D_PTR vdst, VECTOR2D_PTR vsrc) 
  285. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  }
  286. inline void VECTOR3D_COPY(VECTOR3D_PTR vdst, VECTOR3D_PTR vsrc) 
  287. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  (vdst)->z = (vsrc)->z; }
  288. inline void VECTOR4D_COPY(VECTOR4D_PTR vdst, VECTOR4D_PTR vsrc) 
  289. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  
  290. (vdst)->z = (vsrc)->z; (vdst)->w = (vsrc)->w;  }
  291. // point initialization macros
  292. inline void POINT2D_INIT(POINT2D_PTR vdst, POINT2D_PTR vsrc) 
  293. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  }
  294. inline void POINT3D_INIT(POINT3D_PTR vdst, POINT3D_PTR vsrc) 
  295. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  (vdst)->z = (vsrc)->z; }
  296. inline void POINT4D_INIT(POINT4D_PTR vdst, POINT4D_PTR vsrc) 
  297. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  
  298. (vdst)->z = (vsrc)->z; (vdst)->w = (vsrc)->w;  }
  299. // point copying macros
  300. inline void POINT2D_COPY(POINT2D_PTR vdst, POINT2D_PTR vsrc) 
  301. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  }
  302. inline void POINT3D_COPY(POINT3D_PTR vdst, POINT3D_PTR vsrc) 
  303. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  (vdst)->z = (vsrc)->z; }
  304. inline void POINT4D_COPY(POINT4D_PTR vdst, POINT4D_PTR vsrc) 
  305. {(vdst)->x = (vsrc)->x; (vdst)->y = (vsrc)->y;  
  306. (vdst)->z = (vsrc)->z; (vdst)->w = (vsrc)->w;  }
  307. // quaternion macros
  308. inline void QUAT_ZERO(QUAT_PTR q) 
  309. {(q)->x = (q)->y = (q)->z = (q)->w = 0.0;}
  310. inline void QUAT_INITWXYZ(QUAT_PTR q, float w, float x,float y,float z) 
  311. { (q)->w = (w); (q)->x = (x); (q)->y = (y); (q)->z = (z); }
  312. inline void QUAT_INIT_VECTOR3D(QUAT_PTR q, VECTOR3D_PTR v) 
  313. { (q)->w = 0; (q)->x = (v->x); (q)->y = (v->y); (q)->z = (v->z); }
  314. inline void QUAT_INIT(QUAT_PTR qdst, QUAT_PTR qsrc) 
  315. {(qdst)->w = (qsrc)->w;  (qdst)->x = (qsrc)->x;  
  316.  (qdst)->y = (qsrc)->y;  (qdst)->z = (qsrc)->z;  }
  317. inline void QUAT_COPY(QUAT_PTR qdst, QUAT_PTR qsrc) 
  318. {(qdst)->x = (qsrc)->x; (qdst)->y = (qsrc)->y;  
  319. (qdst)->z = (qsrc)->z; (qdst)->w = (qsrc)->w;  }
  320. // convert integer and float to fixed point 16.16
  321. #define INT_TO_FIXP16(i) ((i) <<  FIXP16_SHIFT)
  322. #define FLOAT_TO_FIXP16(f) (((float)(f) * (float)FIXP16_MAG+0.5))
  323. // convert fixed point to float
  324. #define FIXP16_TO_FLOAT(fp) ( ((float)fp)/FIXP16_MAG)
  325. // extract the whole part and decimal part from a fixed point 16.16
  326. #define FIXP16_WP(fp) ((fp) >> FIXP16_SHIFT)
  327. #define FIXP16_DP(fp) ((fp) && FIXP16_DP_MASK)
  328. // PROTOTYPES /////////////////////////////////////////////
  329. // trig functions
  330. float Fast_Sin(float theta);
  331. float Fast_Cos(float theta);
  332. // polar, cylindrical, spherical functions
  333. void POLAR2D_To_POINT2D(POLAR2D_PTR polar, POINT2D_PTR rect);
  334. void POLAR2D_To_RectXY(POLAR2D_PTR polar, float *x, float *y);
  335. void POINT2D_To_POLAR2D(POINT2D_PTR rect, POLAR2D_PTR polar);
  336. void POINT2D_To_PolarRTh(POINT2D_PTR rect, float *r, float *theta);
  337. void CYLINDRICAL3D_To_POINT3D(CYLINDRICAL3D_PTR cyl, POINT3D_PTR rect);
  338. void CYLINDRICAL3D_To_RectXYZ(CYLINDRICAL3D_PTR cyl, float *x, float *y, float *z);
  339. void POINT3D_To_CYLINDRICAL3D(POINT3D_PTR rect, CYLINDRICAL3D_PTR cyl);
  340. void POINT3D_To_CylindricalRThZ(POINT3D_PTR rect, float *r, float *theta, float *z);
  341. void SPHERICAL3D_To_POINT3D(SPHERICAL3D_PTR sph, POINT3D_PTR rect);
  342. void SPHERICAL3D_To_RectXYZ(SPHERICAL3D_PTR sph, float *x, float *y, float *z);
  343. void POINT3D_To_SPHERICAL3D(POINT3D_PTR rect, SPHERICAL3D_PTR sph);
  344. void POINT3D_To_SphericalPThPh(POINT3D_PTR rect, float *p, float *theta, float *phi);
  345. // 2d vector functions
  346. void VECTOR2D_Add(VECTOR2D_PTR va, VECTOR2D_PTR vb, VECTOR2D_PTR vsum);
  347. VECTOR2D VECTOR2D_Add(VECTOR2D_PTR va, VECTOR2D_PTR vb);
  348. void VECTOR2D_Sub(VECTOR2D_PTR va, VECTOR2D_PTR vb, VECTOR2D_PTR vdiff);
  349. VECTOR2D VECTOR2D_Sub(VECTOR2D_PTR va, VECTOR2D_PTR vb);
  350. void VECTOR2D_Scale(float k, VECTOR2D_PTR va);
  351. void VECTOR2D_Scale(float k, VECTOR2D_PTR va, VECTOR2D_PTR vscaled);
  352. float VECTOR2D_Dot(VECTOR2D_PTR va, VECTOR2D_PTR vb);
  353. float VECTOR2D_Length(VECTOR2D_PTR va);
  354. float VECTOR2D_Length_Fast(VECTOR2D_PTR va);
  355. void VECTOR2D_Normalize(VECTOR2D_PTR va);
  356. void VECTOR2D_Normalize(VECTOR2D_PTR va, VECTOR2D_PTR vn);
  357. void VECTOR2D_Build(VECTOR2D_PTR init, VECTOR2D_PTR term, VECTOR2D_PTR result);
  358. float VECTOR2D_CosTh(VECTOR2D_PTR va, VECTOR2D_PTR vb);
  359. void VECTOR2D_Print(VECTOR2D_PTR va, char *name);
  360. // 3d vector functions
  361. void VECTOR3D_Add(VECTOR3D_PTR va, VECTOR3D_PTR vb, VECTOR3D_PTR vsum);
  362. VECTOR3D VECTOR3D_Add(VECTOR3D_PTR va, VECTOR3D_PTR vb);
  363. void VECTOR3D_Sub(VECTOR3D_PTR va, VECTOR3D_PTR vb, VECTOR3D_PTR vdiff);
  364. VECTOR3D VECTOR3D_Sub(VECTOR3D_PTR va, VECTOR3D_PTR vb);
  365. void VECTOR3D_Scale(float k, VECTOR3D_PTR va);
  366. void VECTOR3D_Scale(float k, VECTOR3D_PTR va, VECTOR3D_PTR vscaled);
  367. float VECTOR3D_Dot(VECTOR3D_PTR va, VECTOR3D_PTR vb);
  368. void VECTOR3D_Cross(VECTOR3D_PTR va,VECTOR3D_PTR vb,VECTOR3D_PTR vn);
  369. VECTOR3D VECTOR3D_Cross(VECTOR3D_PTR va, VECTOR3D_PTR vb);
  370. float VECTOR3D_Length(VECTOR3D_PTR va);
  371. float VECTOR3D_Length_Fast(VECTOR3D_PTR va);
  372. void VECTOR3D_Normalize(VECTOR3D_PTR va);
  373. void VECTOR3D_Normalize(VECTOR3D_PTR va, VECTOR3D_PTR vn);
  374. void VECTOR3D_Build(VECTOR3D_PTR init, VECTOR3D_PTR term, VECTOR3D_PTR result);
  375. float VECTOR3D_CosTh(VECTOR3D_PTR va, VECTOR3D_PTR vb);
  376. void VECTOR3D_Print(VECTOR3D_PTR va, char *name);
  377. // 4d vector functions
  378. void VECTOR4D_Add(VECTOR4D_PTR va, VECTOR4D_PTR vb, VECTOR4D_PTR vsum);
  379. VECTOR4D VECTOR4D_Add(VECTOR4D_PTR va, VECTOR4D_PTR vb);
  380. void VECTOR4D_Sub(VECTOR4D_PTR va, VECTOR4D_PTR vb, VECTOR4D_PTR vdiff);
  381. VECTOR4D VECTOR4D_Sub(VECTOR4D_PTR va, VECTOR4D_PTR vb);
  382. void VECTOR4D_Scale(float k, VECTOR4D_PTR va);
  383. void VECTOR4D_Scale(float k, VECTOR4D_PTR va, VECTOR4D_PTR vscaled);
  384. float VECTOR4D_Dot(VECTOR4D_PTR va, VECTOR4D_PTR vb);
  385. void VECTOR4D_Cross(VECTOR4D_PTR va,VECTOR4D_PTR vb,VECTOR4D_PTR vn);
  386. VECTOR4D VECTOR4D_Cross(VECTOR4D_PTR va, VECTOR4D_PTR vb);
  387. float VECTOR4D_Length(VECTOR4D_PTR va);
  388. float VECTOR4D_Length_Fast(VECTOR4D_PTR va);
  389. void VECTOR4D_Normalize(VECTOR4D_PTR va);
  390. void VECTOR4D_Normalize(VECTOR4D_PTR va, VECTOR4D_PTR vn);
  391. void VECTOR4D_Build(VECTOR4D_PTR init, VECTOR4D_PTR term, VECTOR4D_PTR result);
  392. float VECTOR4D_CosTh(VECTOR4D_PTR va, VECTOR4D_PTR vb);
  393. void VECTOR4D_Print(VECTOR4D_PTR va, char *name);
  394. // 2x2 matrix functions  (note there others in T3DLIB1.CPP|H)
  395. void Mat_Init_2X2(MATRIX2X2_PTR ma, float m00, float m01, float m10, float m11);
  396. void Print_Mat_2X2(MATRIX2X2_PTR ma, char *name);
  397. float Mat_Det_2X2(MATRIX2X2_PTR m);
  398. void Mat_Add_2X2(MATRIX2X2_PTR ma, MATRIX2X2_PTR mb, MATRIX2X2_PTR msum);
  399. void Mat_Mul_2X2(MATRIX2X2_PTR ma, MATRIX2X2_PTR mb, MATRIX2X2_PTR mprod);
  400. int Mat_Inverse_2X2(MATRIX2X2_PTR m, MATRIX2X2_PTR mi);
  401. int Solve_2X2_System(MATRIX2X2_PTR A, MATRIX1X2_PTR X, MATRIX1X2_PTR B);
  402. // 3x3 matrix functions (note there others in T3DLIB1.CPP|H)
  403. void Mat_Add_3X3(MATRIX3X3_PTR ma, MATRIX3X3_PTR mb, MATRIX3X3_PTR msum);
  404. void Mat_Mul_VECTOR3D_3X3(VECTOR3D_PTR  va, MATRIX3X3_PTR mb,VECTOR3D_PTR  vprod);
  405. int Mat_Inverse_3X3(MATRIX3X3_PTR m, MATRIX3X3_PTR mi);
  406. void Mat_Init_3X3(MATRIX3X3_PTR ma, 
  407.                         float m00, float m01, float m02,
  408.                         float m10, float m11, float m12,
  409.                         float m20, float m21, float m22);
  410. void Print_Mat_3X3(MATRIX3X3_PTR ma, char *name);
  411. float Mat_Det_3X3(MATRIX3X3_PTR m);
  412. int Solve_3X3_System(MATRIX3X3_PTR A, MATRIX1X3_PTR X, MATRIX1X3_PTR B);
  413. // 4x4 matrix functions
  414. void Mat_Add_4X4(MATRIX4X4_PTR ma, MATRIX4X4_PTR mb, MATRIX4X4_PTR msum);
  415. void Mat_Mul_4X4(MATRIX4X4_PTR ma, MATRIX4X4_PTR mb, MATRIX4X4_PTR mprod);
  416. void Mat_Mul_1X4_4X4(MATRIX1X4_PTR ma, MATRIX4X4_PTR mb, MATRIX1X4_PTR mprod);
  417. void Mat_Mul_VECTOR3D_4X4(VECTOR3D_PTR  va, MATRIX4X4_PTR mb, VECTOR3D_PTR  vprod);
  418. void Mat_Mul_VECTOR3D_4X3(VECTOR3D_PTR  va, MATRIX4X3_PTR mb, VECTOR3D_PTR  vprod);
  419. void Mat_Mul_VECTOR4D_4X4(VECTOR4D_PTR  va, MATRIX4X4_PTR mb, VECTOR4D_PTR  vprod);
  420. void Mat_Mul_VECTOR4D_4X3(VECTOR4D_PTR  va, MATRIX4X4_PTR mb, VECTOR4D_PTR  vprod);
  421. int Mat_Inverse_4X4(MATRIX4X4_PTR m, MATRIX4X4_PTR mi);
  422. void Mat_Init_4X4(MATRIX4X4_PTR ma, 
  423.                         float m00, float m01, float m02, float m03,
  424.                         float m10, float m11, float m12, float m13,
  425.                         float m20, float m21, float m22, float m23,
  426.                         float m30, float m31, float m32, float m33);
  427. void Print_Mat_4X4(MATRIX4X4_PTR ma, char *name);
  428. // quaternion functions
  429. void QUAT_Add(QUAT_PTR q1, QUAT_PTR q2, QUAT_PTR qsum);
  430. void QUAT_Sub(QUAT_PTR q1, QUAT_PTR q2, QUAT_PTR qdiff);
  431. void QUAT_Conjugate(QUAT_PTR q, QUAT_PTR qconj);
  432. void QUAT_Scale(QUAT_PTR q, float scale, QUAT_PTR qs);
  433. void QUAT_Scale(QUAT_PTR q, float scale);
  434. float QUAT_Norm(QUAT_PTR q);
  435. float QUAT_Norm2(QUAT_PTR q);
  436. void QUAT_Normalize(QUAT_PTR q, QUAT_PTR qn);
  437. void QUAT_Normalize(QUAT_PTR q);
  438. void QUAT_Unit_Inverse(QUAT_PTR q, QUAT_PTR qi);
  439. void QUAT_Unit_Inverse(QUAT_PTR q);
  440. void QUAT_Inverse(QUAT_PTR q, QUAT_PTR qi);
  441. void QUAT_Inverse(QUAT_PTR q);
  442. void QUAT_Mul(QUAT_PTR q1, QUAT_PTR q2, QUAT_PTR qprod);
  443. void QUAT_Triple_Product(QUAT_PTR q1, QUAT_PTR q2, QUAT_PTR q3, QUAT_PTR qprod);
  444. void VECTOR3D_Theta_To_QUAT(QUAT_PTR q, VECTOR3D_PTR v, float theta);
  445. void VECTOR4D_Theta_To_QUAT(QUAT_PTR q, VECTOR4D_PTR v, float theta);
  446. void EulerZYX_To_QUAT(QUAT_PTR q, float theta_z, float theta_y, float theta_x);
  447. void QUAT_To_VECTOR3D_Theta(QUAT_PTR q, VECTOR3D_PTR v, float *theta);
  448. void QUAT_Print(QUAT_PTR q, char *name);
  449. // 2d parametric line functions
  450. void Init_Parm_Line2D(POINT2D_PTR p_init, POINT2D_PTR p_term, PARMLINE2D_PTR p);
  451. void Compute_Parm_Line2D(PARMLINE2D_PTR p, float t, POINT2D_PTR pt);
  452. int Intersect_Parm_Lines2D(PARMLINE2D_PTR p1, PARMLINE2D_PTR p2, float *t1, float *t2);
  453. int Intersect_Parm_Lines2D(PARMLINE2D_PTR p1, PARMLINE2D_PTR p2, POINT2D_PTR pt);
  454. // 3d parametric line functions
  455. void Init_Parm_Line3D(POINT3D_PTR p_init, POINT3D_PTR p_term, PARMLINE3D_PTR p);
  456. void Compute_Parm_Line3D(PARMLINE3D_PTR p, float t, POINT3D_PTR pt);
  457. // 3d plane functions
  458. void PLANE3D_Init(PLANE3D_PTR plane, POINT3D_PTR p0, 
  459.                          VECTOR3D_PTR normal, int normalize);
  460. float Compute_Point_In_Plane3D(POINT3D_PTR pt, PLANE3D_PTR plane);
  461. int Intersect_Parm_Line3D_Plane3D(PARMLINE3D_PTR pline, PLANE3D_PTR plane, 
  462.                                          float *t, POINT3D_PTR pt);
  463. // fixed point functions
  464. FIXP16 FIXP16_MUL(FIXP16 fp1, FIXP16 fp2);
  465. FIXP16 FIXP16_DIV(FIXP16 fp1, FIXP16 fp2);
  466. void FIXP16_Print(FIXP16 fp);
  467. // GLOBALS ////////////////////////////////////////////////
  468. // EXTERNALS //////////////////////////////////////////////
  469. #endif