VECMAT.H 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
  12. */
  13. /*
  14. * $Source: f:/miner/source/vecmat/rcs/vecmat.h $
  15. * $Revision: 1.37 $
  16. * $Author: john $
  17. * $Date: 1995/02/22 13:23:22 $
  18. *
  19. * Header file for vector/matrix library
  20. *
  21. * $Log: vecmat.h $
  22. * Revision 1.37 1995/02/22 13:23:22 john
  23. * Added the vms_vector_array structure, to access a vms_vector
  24. * with an array.
  25. *
  26. * Revision 1.36 1995/02/22 12:34:33 john
  27. * Took out anonymous unions.
  28. *
  29. * Revision 1.35 1994/12/13 14:44:20 matt
  30. * Added vm_vector_2_matrix_norm()
  31. *
  32. * Revision 1.34 1994/09/11 19:22:55 matt
  33. * Added vm_vec_normalized_dir_quick()
  34. *
  35. * Revision 1.33 1994/08/04 19:45:38 matt
  36. * Added option to make a bunch of functions (add, sub, dotprod) inline
  37. *
  38. * Revision 1.32 1994/07/19 18:52:36 matt
  39. * Added vm_vec_normalize_quick() and vm_vec_copy_normalize_quick()
  40. *
  41. * Revision 1.31 1994/06/16 18:24:30 matt
  42. * Added vm_vec_mag_quick()
  43. *
  44. * Revision 1.30 1994/06/10 23:19:00 matt
  45. * New register usage for vm_vec_ang_2_matrix()
  46. *
  47. * Revision 1.29 1994/06/01 17:32:06 matt
  48. * Fixed modify list for vm_vec_normalized_dir()
  49. *
  50. * Revision 1.28 1994/05/19 12:07:20 matt
  51. * Fixed globals and macros and added a constant
  52. *
  53. * Revision 1.27 1994/05/19 09:19:15 matt
  54. * Made vm_vec_normalized_dir() return mag of vector
  55. *
  56. * Revision 1.26 1994/05/18 22:28:57 matt
  57. * Added function vm_vec_normalized_dir()
  58. * Added C macros IS_ZERO_VEC(), vm_vec_zero(), and vm_set_identity()
  59. * Added C global static vars vmd_zero_vector & vmd_identity_matrix
  60. *
  61. * Revision 1.25 1994/05/18 21:45:06 matt
  62. * Added functions:
  63. * vm_extract_angles_vector()
  64. * vm_extract_angles_vector_normalized()
  65. * vm_vec_copy_normalize()
  66. *
  67. * Revision 1.24 1994/05/13 12:42:16 matt
  68. * Added new function, vm_vec_dist_quick(), which does an approximation.
  69. *
  70. * Revision 1.23 1994/03/30 13:37:34 matt
  71. * Added prototype for vm_vec_scale_add(), and fixed typos
  72. *
  73. * Revision 1.22 1994/03/30 13:29:42 matt
  74. * Header for vm_vec_scale_add2()
  75. *
  76. * Revision 1.21 1994/01/31 19:45:13 matt
  77. * Added function vm_extract_angles_matrix()
  78. *
  79. * Revision 1.20 1993/12/21 19:46:14 matt
  80. * Added function vm_dist_to_plane()
  81. *
  82. * Revision 1.19 1993/12/13 17:26:41 matt
  83. * Added vm_vec_dist()
  84. *
  85. * Revision 1.18 1993/12/02 12:45:11 matt
  86. * New functions: vm_vec_copy_scale(), vm_vec_scale2()
  87. * Aliases: vm_transpose(), vm_vec_dot(), vm_vec_cross(), vm_copy_transpose()
  88. *
  89. * Revision 1.17 1993/10/29 22:38:36 matt
  90. * Changed matrix order, making direction vectors the rows
  91. *
  92. * Revision 1.16 1993/10/25 11:49:57 matt
  93. * Made vm_vec_delta_ang() take optional forward vector to return signed delta
  94. *
  95. * Revision 1.15 1993/10/20 01:10:05 matt
  96. * Added vm_vec_delta_ang(), vm_vec_delta_ang_norm(), and vm_vec_ang_2_matrix()
  97. *
  98. * Revision 1.14 1993/10/17 17:02:52 matt
  99. * vm_vector_2_matrix() now takes optional right vector
  100. *
  101. * Revision 1.13 1993/10/12 19:31:39 matt
  102. * Added IDENTITY_MATRIX constant
  103. *
  104. * Revision 1.12 1993/10/08 18:10:16 matt
  105. * Changed vm_vec_make() and vm_angvec_make() to be inline assembly
  106. * functions, to get rid of compiler warnings. Did not change vm_mat_make(),
  107. * which could still get warnings if the return value is unused.
  108. *
  109. * Revision 1.11 1993/09/29 12:10:07 matt
  110. * Changed modified regs in pragmas to include return register
  111. *
  112. * Revision 1.10 1993/09/28 12:15:41 matt
  113. * Added func vm_vector_2_matrix()
  114. *
  115. * Revision 1.9 1993/09/24 21:18:38 matt
  116. * Added vm_vec_avg(), vm_vec_avg4(), and vm_angvec_make().
  117. * Documented which functions could have dest==source
  118. *
  119. * Revision 1.8 1993/09/20 14:56:11 matt
  120. * Added new function, vm_vec_perp()
  121. *
  122. * Revision 1.7 1993/09/20 14:27:42 mike
  123. * unfix last fix which introduced a bug
  124. *
  125. * Revision 1.6 1993/09/20 10:11:53 mike
  126. * no changes
  127. *
  128. * Revision 1.5 1993/09/20 09:58:58 mike
  129. * Re-fix vm_vec_make
  130. *
  131. * Revision 1.4 1993/09/20 09:41:21 mike
  132. * Correct vm_vec_make and vm_mat_make macros to return the destination
  133. * as the value of the macro.
  134. *
  135. * Revision 1.3 1993/09/17 11:23:47 matt
  136. * Added row access (via xrow,yrow,zrow) to vms_matrix
  137. * Added macro vm_mat_make(), like vm_vec_make()
  138. *
  139. * Revision 1.2 1993/09/17 11:10:32 matt
  140. * Added vm_vec_add2() and vm_vec_sub2(), which take 2 args (dest==src0)
  141. *
  142. * Revision 1.1 1993/09/16 20:10:01 matt
  143. * Initial revision
  144. *
  145. *
  146. */
  147. #ifndef _VECMAT_H
  148. #define _VECMAT_H
  149. #include "fix.h"
  150. //#define INLINE 1 //are some of these functions inline?
  151. //The basic fixed-point vector. Access elements by name or position
  152. typedef struct vms_vector {
  153. fix x,y,z;
  154. } vms_vector;
  155. typedef struct vms_vector_array {
  156. fix xyz[3];
  157. } vms_vector_array;
  158. //Short vector, used for pre-rotation points.
  159. //Access elements by name or position
  160. typedef struct vms_svec {
  161. short sv_x,sv_y,sv_z;
  162. } vms_svec;
  163. //Angle vector. Used to store orientations
  164. typedef struct vms_angvec {
  165. fixang p,b,h;
  166. } vms_angvec;
  167. //A 3x3 rotation matrix. Sorry about the numbering starting with one.
  168. //Ordering is across then down, so <m1,m2,m3> is the first row
  169. typedef struct vms_matrix {
  170. vms_vector rvec,uvec,fvec;
  171. } vms_matrix;
  172. //Macros/functions to fill in fields of structures
  173. //macro to check if vector is zero
  174. #define IS_VEC_NULL(v) (v->x == 0 && v->y == 0 && v->z == 0)
  175. //macro to set a vector to zero. we could do this with an in-line assembly
  176. //macro, but it's probably better to let the compiler optimize it.
  177. //Note: NO RETURN VALUE
  178. #define vm_vec_zero(v) (v)->x=(v)->y=(v)->z=0
  179. //macro set set a matrix to the identity. Note: NO RETURN VALUE
  180. #define vm_set_identity(m) do {m->rvec.x = m->uvec.y = m->fvec.z = f1_0; \
  181. m->rvec.y = m->rvec.z = \
  182. m->uvec.x = m->uvec.z = \
  183. m->fvec.x = m->fvec.y = 0;} while (0)
  184. vms_vector *vm_vec_make(vms_vector *v,fix x,fix y,fix z);
  185. #pragma aux vm_vec_make "*_" parm [eax] [edx] [ebx] [ecx] value [eax] modify exact [] = \
  186. "mov 0[eax],edx" \
  187. "mov 4[eax],ebx" \
  188. "mov 8[eax],ecx";
  189. vms_angvec *vm_angvec_make(vms_angvec *v,fixang p,fixang b,fixang h);
  190. #pragma aux vm_angvec_make "*_" parm [eax] [dx] [bx] [cx] value [eax] modify exact [] = \
  191. "mov 0[eax],dx" \
  192. "mov 2[eax],bx" \
  193. "mov 4[eax],cx";
  194. //Global constants
  195. extern vms_vector vmd_zero_vector;
  196. extern vms_matrix vmd_identity_matrix;
  197. //Here's a handy constant
  198. #define ZERO_VECTOR {0,0,0}
  199. #define IDENTITY_MATRIX {f1_0,0,0,0,f1_0,0,0,0,f1_0}
  200. //#define vm_vec_make(v,_x,_y,_z) (((v)->x=(_x), (v)->y=(_y), (v)->z=(_z)), (v))
  201. //#pragma off (unreferenced)
  202. ////make this local, so compiler can in-line it
  203. //static vms_vector *vm_vec_make(vms_vector *v,fix x,fix y,fix z)
  204. //{
  205. // v->x = x;
  206. // v->y = y;
  207. // v->z = z;
  208. //
  209. // return v;
  210. //}
  211. //#pragma on (unreferenced)
  212. ////macro to fill in elements of a matrix, also for Mike
  213. //#define vm_mat_make(m,_m1,_m2,_m3,_m4,_m5,_m6,_m7,_m8,_m9) \
  214. // do { (m)->m1=(_m1); (m)->m2=(_m2); (m)->m3=(_m3); \
  215. // (m)->m4=(_m4); (m)->m5=(_m5); (m)->m6=(_m6); \
  216. // (m)->m7=(_m7); (m)->m8=(_m8); (m)->m9=(_m9);} while (0)
  217. #if 0 //kill this, since bogus with new matrix ordering
  218. //macro to fill in elements of a matrix, also for Mike
  219. #define vm_mat_make(m,_m1,_m2,_m3,_m4,_m5,_m6,_m7,_m8,_m9) \
  220. ( ((m)->m1=(_m1), (m)->m2=(_m2), (m)->m3=(_m3), \
  221. (m)->m4=(_m4), (m)->m5=(_m5), (m)->m6=(_m6), \
  222. (m)->m7=(_m7), (m)->m8=(_m8), (m)->m9=(_m9)), (m))
  223. #endif
  224. ////fills in fields of an angle vector
  225. //#define vm_angvec_make(v,_p,_b,_h) (((v)->p=(_p), (v)->b=(_b), (v)->h=(_h)), (v))
  226. //negate a vector
  227. #define vm_vec_negate(v) do {(v)->x = - (v)->x; (v)->y = - (v)->y; (v)->z = - (v)->z;} while (0);
  228. //Functions in library
  229. #ifndef INLINE
  230. //adds two vectors, fills in dest, returns ptr to dest
  231. //ok for dest to equal either source, but should use vm_vec_add2() if so
  232. vms_vector *vm_vec_add(vms_vector *dest,vms_vector *src0,vms_vector *src1);
  233. //subs two vectors, fills in dest, returns ptr to dest
  234. //ok for dest to equal either source, but should use vm_vec_sub2() if so
  235. vms_vector *vm_vec_sub(vms_vector *dest,vms_vector *src0,vms_vector *src1);
  236. //adds one vector to another. returns ptr to dest
  237. //dest can equal source
  238. vms_vector *vm_vec_add2(vms_vector *dest,vms_vector *src);
  239. //subs one vector from another, returns ptr to dest
  240. //dest can equal source
  241. vms_vector *vm_vec_sub2(vms_vector *dest,vms_vector *src);
  242. #else
  243. #define vm_vec_add(dest,src0,src1) do { \
  244. (dest)->x = (src0)->x + (src1)->x; \
  245. (dest)->y = (src0)->y + (src1)->y; \
  246. (dest)->z = (src0)->z + (src1)->z; \
  247. } while (0);
  248. #define vm_vec_sub(dest,src0,src1) do { \
  249. (dest)->x = (src0)->x - (src1)->x; \
  250. (dest)->y = (src0)->y - (src1)->y; \
  251. (dest)->z = (src0)->z - (src1)->z; \
  252. } while (0);
  253. #define vm_vec_add2(dest,src) do { \
  254. (dest)->x += (src)->x; \
  255. (dest)->y += (src)->y; \
  256. (dest)->z += (src)->z; \
  257. } while (0);
  258. #define vm_vec_sub2(dest,src) do { \
  259. (dest)->x -= (src)->x; \
  260. (dest)->y -= (src)->y; \
  261. (dest)->z -= (src)->z; \
  262. } while (0);
  263. #endif
  264. //averages two vectors. returns ptr to dest
  265. //dest can equal either source
  266. vms_vector *vm_vec_avg(vms_vector *dest,vms_vector *src0,vms_vector *src1);
  267. //averages four vectors. returns ptr to dest
  268. //dest can equal any source
  269. vms_vector *vm_vec_avg4(vms_vector *dest,vms_vector *src0,vms_vector *src1,vms_vector *src2,vms_vector *src3);
  270. //scales a vector in place. returns ptr to vector
  271. vms_vector *vm_vec_scale(vms_vector *dest,fix s);
  272. //scales and copies a vector. returns ptr to dest
  273. vms_vector *vm_vec_copy_scale(vms_vector *dest,vms_vector *src,fix s);
  274. //scales a vector, adds it to another, and stores in a 3rd vector
  275. //dest = src1 + k * src2
  276. vms_vector *vm_vec_scale_add(vms_vector *dest,vms_vector *src1,vms_vector *src2,fix k);
  277. //scales a vector and adds it to another
  278. //dest += k * src
  279. vms_vector *vm_vec_scale_add2(vms_vector *dest,vms_vector *src,fix k);
  280. //scales a vector in place, taking n/d for scale. returns ptr to vector
  281. //dest *= n/d
  282. vms_vector *vm_vec_scale2(vms_vector *dest,fix n,fix d);
  283. //returns magnitude of a vector
  284. fix vm_vec_mag(vms_vector *v);
  285. //computes the distance between two points. (does sub and mag)
  286. fix vm_vec_dist(vms_vector *v0,vms_vector *v1);
  287. //computes an approximation of the magnitude of the vector
  288. //uses dist = largest + next_largest*3/8 + smallest*3/16
  289. fix vm_vec_mag_quick(vms_vector *v);
  290. //computes an approximation of the distance between two points.
  291. //uses dist = largest + next_largest*3/8 + smallest*3/16
  292. fix vm_vec_dist_quick(vms_vector *v0,vms_vector *v1);
  293. //normalize a vector in place. returns mag of source vec
  294. fix vm_vec_normalize(vms_vector *v);
  295. //normalize a vector in place. returns mag of source vec. used approx mag.
  296. fix vm_vec_normalize_quick(vms_vector *v);
  297. //normalize a vector. returns mag of source vec
  298. fix vm_vec_copy_normalize(vms_vector *dest,vms_vector *src);
  299. //normalize a vector. returns mag of source vec. uses approx mag
  300. fix vm_vec_copy_normalize_quick(vms_vector *dest,vms_vector *src);
  301. //return the normalized direction vector between two points
  302. //dest = normalized(end - start). Returns mag of direction vector
  303. //NOTE: the order of the parameters matches the vector subtraction
  304. fix vm_vec_normalized_dir(vms_vector *dest,vms_vector *end,vms_vector *start);
  305. fix vm_vec_normalized_dir_quick(vms_vector *dest,vms_vector *end,vms_vector *start);
  306. #ifndef INLINE
  307. ////returns dot product of two vectors
  308. fix vm_vec_dotprod(vms_vector *v0,vms_vector *v1);
  309. fix vm_vec_dot(vms_vector *v0,vms_vector *v1);
  310. #else
  311. #define vm_vec_dotprod(v0,v1) vm_vec_dot((v0),(v1))
  312. fix vm_vec_dotprod(vms_vector *v0,vms_vector *v1);
  313. #pragma aux vm_vec_dotprod parm [esi] [edi] value [eax] modify exact [eax ebx ecx edx] = \
  314. "mov eax,[esi]" \
  315. "imul dword ptr [edi]" \
  316. "mov ebx,eax" \
  317. "mov ecx,edx" \
  318. \
  319. "mov eax,4[esi]" \
  320. "imul dword ptr 4[edi]" \
  321. "add ebx,eax" \
  322. "adc ecx,edx" \
  323. \
  324. "mov eax,8[esi]" \
  325. "imul dword ptr 8[edi]" \
  326. "add eax,ebx" \
  327. "adc edx,ecx" \
  328. \
  329. "shrd eax,edx,16";
  330. #endif
  331. //computes cross product of two vectors. returns ptr to dest
  332. //dest CANNOT equal either source
  333. vms_vector *vm_vec_crossprod(vms_vector *dest,vms_vector *src0,vms_vector *scr1);
  334. vms_vector *vm_vec_cross(vms_vector *dest,vms_vector *src0,vms_vector *scr1);
  335. //computes surface normal from three points. result is normalized
  336. //returns ptr to dest
  337. //dest CANNOT equal either source
  338. vms_vector *vm_vec_normal(vms_vector *dest,vms_vector *p0,vms_vector *p1,vms_vector *p2);
  339. //computes non-normalized surface normal from three points.
  340. //returns ptr to dest
  341. //dest CANNOT equal either source
  342. vms_vector *vm_vec_perp(vms_vector *dest,vms_vector *p0,vms_vector *p1,vms_vector *p2);
  343. //computes the delta angle between two vectors.
  344. //vectors need not be normalized. if they are, call vm_vec_delta_ang_norm()
  345. //the forward vector (third parameter) can be NULL, in which case the absolute
  346. //value of the angle in returned. Otherwise the angle around that vector is
  347. //returned.
  348. fixang vm_vec_delta_ang(vms_vector *v0,vms_vector *v1,vms_vector *fvec);
  349. //computes the delta angle between two normalized vectors.
  350. fixang vm_vec_delta_ang_norm(vms_vector *v0,vms_vector *v1,vms_vector *fvec);
  351. //computes a matrix from a set of three angles. returns ptr to matrix
  352. vms_matrix *vm_angles_2_matrix(vms_matrix *m,vms_angvec *a);
  353. //computes a matrix from a forward vector and an angle
  354. vms_matrix *vm_vec_ang_2_matrix(vms_matrix *m,vms_vector *v,fixang a);
  355. //computes a matrix from one or more vectors. The forward vector is required,
  356. //with the other two being optional. If both up & right vectors are passed,
  357. //the up vector is used. If only the forward vector is passed, a bank of
  358. //zero is assumed
  359. //returns ptr to matrix
  360. vms_matrix *vm_vector_2_matrix(vms_matrix *m,vms_vector *fvec,vms_vector *uvec,vms_vector *rvec);
  361. //this version of vector_2_matrix requires that the vectors be more-or-less
  362. //normalized and close to perpendicular
  363. vms_matrix *vm_vector_2_matrix_norm(vms_matrix *m,vms_vector *fvec,vms_vector *uvec,vms_vector *rvec);
  364. //rotates a vector through a matrix. returns ptr to dest vector
  365. //dest CANNOT equal either source
  366. vms_vector *vm_vec_rotate(vms_vector *dest,vms_vector *src,vms_matrix *m);
  367. //transpose a matrix in place. returns ptr to matrix
  368. vms_matrix *vm_transpose_matrix(vms_matrix *m);
  369. vms_matrix *vm_transpose(vms_matrix *m); //same as vm_transpose_matrix()
  370. //copy and transpose a matrix. returns ptr to matrix
  371. //dest CANNOT equal source. use vm_transpose_matrix() if this is the case
  372. vms_matrix *vm_copy_transpose_matrix(vms_matrix *dest,vms_matrix *src);
  373. vms_matrix *vm_copy_transpose(vms_matrix *dest,vms_matrix *src);
  374. //mulitply 2 matrices, fill in dest. returns ptr to dest
  375. //dest CANNOT equal either source
  376. vms_matrix *vm_matrix_x_matrix(vms_matrix *dest,vms_matrix *src0,vms_matrix *src1);
  377. //extract angles from a matrix
  378. vms_angvec *vm_extract_angles_matrix(vms_angvec *a,vms_matrix *m);
  379. //extract heading and pitch from a vector, assuming bank==0
  380. vms_angvec *vm_extract_angles_vector(vms_angvec *a,vms_vector *v);
  381. //compute the distance from a point to a plane. takes the normalized normal
  382. //of the plane (ebx), a point on the plane (edi), and the point to check (esi).
  383. //returns distance in eax
  384. //distance is signed, so negative dist is on the back of the plane
  385. fix vm_dist_to_plane(vms_vector *checkp,vms_vector *norm,vms_vector *planep);
  386. //Pragmas for functions
  387. #ifndef INLINE
  388. #pragma aux vm_vec_add "*" parm [eax] [esi] [edi] value [eax] modify exact [];
  389. #pragma aux vm_vec_sub "*" parm [eax] [esi] [edi] value [eax] modify exact [];
  390. #pragma aux vm_vec_add2 "*" parm [edi] [esi] value [edi] modify exact [];
  391. #pragma aux vm_vec_sub2 "*" parm [edi] [esi] value [edi] modify exact [];
  392. #endif
  393. #pragma aux vm_vec_avg "*" parm [eax] [esi] [edi] value [eax] modify exact [];
  394. #pragma aux vm_vec_avg4 "*" parm [eax] [esi] [edi] [ecx] [edx] value [eax] modify exact [];
  395. #pragma aux vm_vec_scale "*" parm [ebx] [ecx] value [ebx] modify exact [];
  396. #pragma aux vm_vec_copy_scale "*" parm [edi] [ebx] [ecx] value [edi] modify exact [];
  397. #pragma aux vm_vec_scale2 "*" parm [edi] [ebx] [ecx] value [edi] modify exact [];
  398. #pragma aux vm_vec_mag "*" parm [esi] value [eax] modify exact [eax];
  399. #pragma aux vm_vec_dist "*" parm [esi] [edi] value [eax] modify exact [eax];
  400. #pragma aux vm_vec_mag_quick "*" parm [esi] value [eax] modify exact [eax];
  401. #pragma aux vm_vec_dist_quick "*" parm [esi] [edi] value [eax] modify exact [eax];
  402. #pragma aux vm_vec_normalize "*" parm [esi] value [ecx] modify exact [ecx];
  403. #pragma aux vm_vec_normalize_quick "*" parm [esi] value [ecx] modify exact [ecx];
  404. #pragma aux vm_vec_copy_normalize "*" parm [edi] [esi] value [ecx] modify exact [ecx];
  405. #pragma aux vm_vec_copy_normalize_quick "*" parm [edi] [esi] value [ecx] modify exact [ecx];
  406. #ifndef INLINE
  407. #pragma aux vm_vec_dotprod "*" parm [esi] [edi] value [eax] modify exact [eax];
  408. #pragma aux vm_vec_dot "vm_vec_dotprod" parm [esi] [edi] value [eax] modify exact [eax];
  409. #endif
  410. #pragma aux vm_vec_crossprod "*" parm [eax esi edi] value [eax] modify exact [];
  411. #pragma aux vm_vec_cross "vm_vec_crossprod" parm [eax esi edi] value [eax] modify exact [];
  412. #pragma aux vm_vec_normal "*" parm [ebx] [eax] [esi] [edi] value [eax] modify exact [eax];
  413. #pragma aux vm_vec_perp "*" parm [ebx] [eax] [esi] [edi] value [eax] modify exact [eax];
  414. #pragma aux vm_angles_2_matrix "*" parm [edi] [esi] value [edi] modify exact [];
  415. #pragma aux vm_vector_2_matrix "*" parm [edi] [esi] [eax] [ebx] value [edi] modify exact [eax ebx esi];
  416. #pragma aux vm_vector_2_matrix_norm "*" parm [edi] [esi] [eax] [ebx] value [edi] modify exact [eax ebx esi];
  417. #pragma aux vm_vec_rotate "*" parm [eax] [esi] [edi] value [eax] modify exact [];
  418. #pragma aux vm_transpose_matrix "*" parm [edi] value [edi] modify exact [];
  419. #pragma aux vm_transpose "vm_transpose_matrix" parm [edi] value [edi] modify exact [];
  420. #pragma aux vm_copy_transpose_matrix "*" parm [edi] [esi] value [edi] modify exact [];
  421. #pragma aux vm_copy_transpose "vm_copy_transpose_matrix" parm [edi] [esi] value [edi] modify exact [];
  422. #pragma aux vm_matrix_x_matrix "*" parm [eax] [esi] [edi] value [eax] modify exact [];
  423. #pragma aux vm_vec_delta_ang "*" parm [esi] [edi] [eax] value [ax] modify exact [eax];
  424. #pragma aux vm_vec_delta_ang_norm "*" parm [esi] [edi] [eax] value [ax] modify exact [eax];
  425. #pragma aux vm_vec_ang_2_matrix "*" parm [edi] [esi] [eax] value [edi] modify exact [];
  426. #pragma aux vm_dist_to_plane "*" parm [esi] [ebx] [edi] value [eax] modify exact [eax];
  427. #pragma aux vm_extract_angles_matrix "*" parm [edi] [esi] value [edi] modify exact [];
  428. #pragma aux vm_vec_scale_add "*" parm [edi] [ebx] [esi] [ecx] value [edi] modify exact [];
  429. #pragma aux vm_vec_scale_add2 "*" parm [edi] [esi] [ecx] value [edi] modify exact [];
  430. #pragma aux vm_vec_normalized_dir "*" parm [edi] [esi] [ebx] value [ecx] modify exact [ecx];
  431. #pragma aux vm_vec_normalized_dir_quick "*" parm [edi] [esi] [ebx] value [ecx] modify exact [ecx];
  432. #pragma aux vm_extract_angles_vector "*" parm [edi] [esi] value [edi] modify exact [esi];
  433. #pragma aux vm_extract_angles_vector_normalized "*" parm [edi] [esi] value [edi] modify exact [];
  434. /*
  435. Questions:
  436. should simple functions like vec_add() and vec_sub() be macros?
  437. */
  438. #endif
  439.