home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / INCLUDE / DEMO4B / INTMATH.H < prev    next >
C/C++ Source or Header  |  1992-10-31  |  4KB  |  108 lines

  1. /* Matrix math, assembly by Dave Stampe */
  2. /* Protoypes for matrix and integer math routines */
  3.  
  4. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  5.    May be freely used to write software for release into the public domain;
  6.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  7.    for permission to incorporate any part of this software into their
  8.    products!
  9.  */
  10.  
  11. /* Contact: broehl@sunee.waterloo.edu or dstampe@sunee.waterloo.edu */
  12.  
  13. extern long isine(long angle);
  14. extern long icosine(long angle);
  15. extern long arcsine(long x);
  16. extern long arccosine(long x);
  17. extern long arctan2(long y, long x);
  18.  
  19.     /* Create rotation/translation "matrix" from angle data.  */
  20.     /* Can only be used after setup_render() has been called */
  21. extern void std_matrix(MATRIX m,
  22.         long rx, long ry, long rz,
  23.         long tx, long ty, long tz);
  24.  
  25. #define RXYZ 1        /* matrix rotation types */
  26. #define RYXZ 0          /* ONLY RYXZ guaranteed to be tested */
  27. #define RXZY 2
  28. #define RZYX 5
  29. #define RZXY 4
  30. #define RYZX 6
  31.  
  32. extern void multi_matrix(MATRIX m, long rx, long ry, long rz,
  33.                                                  long tx, long ty, long tz, int type );
  34.  
  35.     /* multiplies upper left 3x3 submatrices A and B giving C */
  36. extern void matrix_mult(MATRIX a, MATRIX b, MATRIX c);
  37.  
  38.     /* multiplies matrices: A*B->C */
  39. extern void matrix_product(MATRIX a, MATRIX b, MATRIX c);
  40.  
  41.     /* rotate & translate XYZ by matrix */
  42. extern void matrix_point(MATRIX m, long *xp, long *yp, long *zp);
  43.  
  44.     /* rotate XYZ by matrix */
  45. extern void matrix_rotate(MATRIX m, long *xp, long *yp, long *zp);
  46.  
  47.     /* generate inverse of rotate matrix (transpose) */
  48.     /* ONLY WORKS FOR ORTHOGONAL MATRICES */
  49. extern void matrix_transpose(MATRIX a, MATRIX b);
  50.  
  51.     /* generate inverse of rotate/translate matrix */
  52. extern void inverse_matrix(MATRIX a, MATRIX b);
  53.  
  54.         /* use "matrix" to compute world coords from object coords for obj */
  55. extern void apply_matrix(OBJECT *obj, MATRIX m);
  56.  
  57.         /* move bounds sphere only */
  58. extern void matmove_osphere(OBJECT *obj, MATRIX m);
  59.  
  60.         /* move all of rep's polys, vertices */
  61. extern void matmove_rep(REP *rep, MATRIX m);
  62.  
  63.         /* create identity matrix */
  64. extern void identity_matrix(MATRIX m);
  65.  
  66.         /* copy matrix */
  67. extern void matrix_copy(MATRIX s, MATRIX d);
  68.  
  69.     /* copies upper left 3x3 submatrix, zeros translation part (bottom row) */
  70. extern void matrix_rot_copy(MATRIX s, MATRIX d);
  71.  
  72.     /* perform multiplication of <3.29> matrix elements */
  73. extern long m_mult(long a, long b);
  74.  
  75.     /* returns (ax+by+cz)>>29) */
  76. extern long dot_prod_29(long a, long b, long c, long x, long y, long z);
  77.  
  78.     /* returns (ax+cz+d)/-b) */
  79. extern long plane_y(long a, long b, long c, long d, long x, long z);
  80.  
  81.     /* returns >65536 if not in sphere     */
  82.     /* else ((D/R)^2)<<16 ratio to find    */
  83.     /* closest to center (choose smallest) */
  84. extern long sphere_pretest(OBJECT *obj, long x, long y, long z);
  85.  
  86.     /* makes matrix that will xform Z axis to given vector */
  87. extern void vector_to_matrix(MATRIX m, long x, long y, long z);
  88.  
  89. extern void matrix_to_angle(MATRIX m, long *rx, long *ry, long *rz);
  90.  
  91. extern void cross_column(MATRIX m, int col);
  92.  
  93. extern long big_dist(long x1, long y1, long z1,
  94.                  long x2, long y2, long z2);
  95.  
  96. extern int find_normal(long x1, long y1, long z1,
  97.         long x2, long y2, long z2,
  98.         long x3, long y3, long z3,
  99.         long *xn, long *yn, long *zn);
  100.  
  101.                                              /* rescale matrix: do every 1000 mults or so */
  102. extern void fix_matrix_scale(MATRIX m);
  103.  
  104. extern long scale_16(long s, long a, long x);  /* s*(x+a) */
  105. extern long calc_scale_16(long a, long b, long s);  /* 2s/(a-b) */
  106.  
  107. /* End of intmath.h */
  108.