home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************/
- /* headers */
- /****************************************************************/
- #include <math.h>
- #include "macros.h"
-
- /****************************************************************/
- /* defines */
- /****************************************************************/
- #define X 0
- #define Y 1
- #define Z 2
- #define W 3
-
- /******************************************************************/
- #define print_mat( mat, str ) \
- { \
- printf( "%s:\n", (str) ? (str) : "" ); \
- print_vect( (mat)[0], NULL ); \
- print_vect( (mat)[1], NULL ); \
- print_vect( (mat)[2], NULL ); \
- print_vect( (mat)[3], NULL ); \
- }
-
- /******************************************************************/
- #define copy_matrix( dst_mat, src_mat ) \
- { \
- copy_vect( (dst_mat)[0], (src_mat)[0] ); \
- copy_vect( (dst_mat)[1], (src_mat)[1] ); \
- copy_vect( (dst_mat)[2], (src_mat)[2] ); \
- copy_vect( (dst_mat)[3], (src_mat)[3] ); \
- }
-
- /******************************************************************/
- #define ident_mat( mat ) \
- { \
- (mat)[0][1] = (mat)[0][2] = (mat)[0][3] = 0.0; \
- (mat)[1][0] = (mat)[1][2] = (mat)[1][3] = 0.0; \
- (mat)[2][0] = (mat)[2][1] = (mat)[2][3] = 0.0; \
- (mat)[3][0] = (mat)[3][1] = (mat)[3][2] = 0.0; \
- (mat)[0][0] = (mat)[1][1] = (mat)[2][2] = (mat)[3][3] = 1.0; \
- }
-
- /******************************************************************/
- #define init_trans( mat, tx, ty, tz ) \
- { \
- ident_mat( (mat) ); \
- (mat)[0][3] = (tx); \
- (mat)[1][3] = (ty); \
- (mat)[2][3] = (tz); \
- }
-
- /******************************************************************/
- #define init_scale( mat, sx, sy, sz ) \
- { \
- ident_mat( (mat) ); \
- (mat)[0][0] = (sx); \
- (mat)[1][1] = (sy); \
- (mat)[2][2] = (sz); \
- }
-
- /******************************************************************/
- #define init_xrot( mat, theta ) \
- { \
- FLOAT32 cos_theta = cos( DEG2RAD(theta) ); \
- FLOAT32 sin_theta = sin( DEG2RAD(theta) ); \
- ident_mat( (mat) ); \
- (mat)[1][1] = cos_theta; \
- (mat)[1][2] = -sin_theta; \
- (mat)[2][1] = sin_theta; \
- (mat)[2][2] = cos_theta; \
- }
-
- /******************************************************************/
- #define init_yrot( mat, theta ) \
- { \
- FLOAT32 cos_theta = cos( DEG2RAD(theta) ); \
- FLOAT32 sin_theta = sin( DEG2RAD(theta) ); \
- ident_mat( (mat) ); \
- (mat)[0][0] = cos_theta; \
- (mat)[0][2] = sin_theta; \
- (mat)[2][0] = -sin_theta; \
- (mat)[2][2] = cos_theta; \
- }
-
- /******************************************************************/
- #define init_zrot( mat, theta ) \
- { \
- FLOAT32 cos_theta = cos( DEG2RAD(theta) ); \
- FLOAT32 sin_theta = sin( DEG2RAD(theta) ); \
- ident_mat( (mat) ); \
- (mat)[0][0] = cos_theta; \
- (mat)[0][1] = -sin_theta; \
- (mat)[1][0] = sin_theta; \
- (mat)[1][1] = cos_theta; \
- }
-
- /******************************************************************/
- #define transpose_matrix( src_mat, dst_mat ) \
- { \
- int i, j; \
- for( i = 0; i < 4; i++ ) \
- for( j = 0; j < 4; j++ ) \
- (dst_mat)[j][i] = (src_mat)[i][j]; \
- }
-
-
- /******************************************************************/
- #define trans_mat( mat, tx, ty, tz ) \
- { \
- MATRIX trans, tmp; \
- init_trans( trans, (tx), (ty), (tz) ); \
- copy_matrix( tmp, (mat) ); \
- matrix_mult( tmp, trans, (mat) ); \
- }
-
- /******************************************************************/
- #define scale_mat( mat, sx, sy, sz ) \
- { \
- MATRIX scale, tmp; \
- init_scale( scale, (sx), (sy), (sz) ); \
- copy_matrix( tmp, (mat) ); \
- matrix_mult( tmp, scale, (mat) ); \
- }
-
- /******************************************************************/
- #define xrot_mat( mat, theta ) \
- { \
- MATRIX rot, tmp; \
- init_xrot( rot, (theta) ); \
- copy_matrix( tmp, (mat) ); \
- matrix_mult( tmp, rot, (mat) ); \
- }
-
- /******************************************************************/
- #define yrot_mat( mat, theta ) \
- { \
- MATRIX rot, tmp; \
- init_yrot( rot, (theta) ); \
- copy_matrix( tmp, (mat) ); \
- matrix_mult( tmp, rot, (mat) ); \
- }
-
- /******************************************************************/
- #define zrot_mat( mat, theta ) \
- { \
- MATRIX rot, tmp; \
- init_zrot( rot, (theta) ); \
- copy_matrix( tmp, (mat) ); \
- matrix_mult( tmp, rot, (mat) ); \
- }
-
- /******************************************************************/
- #define set_vect( v, x, y, z, w ) (v)[X]=(x), (v)[Y]=(y), (v)[Z]=(z), (v)[W]=(w)
-
- /******************************************************************/
- #define print_vect( v, str ) printf( "%s:\n%5.3lf %5.3lf %5.3lf %5.3lf\n", (str)?(str):"", (v)[X], (v)[Y], (v)[Z], (v)[W] )
-
- /******************************************************************/
- #define dot( a, b ) ( (a)[X]*(b)[X] + (a)[Y]*(b)[Y] + (a)[Z]*(b)[Z] )
-
- /******************************************************************/
- #define cross( a, b, n ) \
- { \
- n[X] = a[Y]*b[Z] - a[Z]*b[Y]; \
- n[Y] = a[Z]*b[X] - a[X]*b[Z]; \
- n[Z] = a[X]*b[Y] - a[Y]*b[X]; \
- n[W] = 1.0; \
- }
-
- /******************************************************************/
- #define veclen( v ) sqrt( SQR((v)[X]) + SQR((v)[Y]) + SQR((v)[Z]) )
-
- /******************************************************************/
- #define dist( v1, v2 ) sub_vect( (v2), (v1), _util_vect ), veclen( _util_vect );
-
- /******************************************************************/
- #define eq_vect( v1, v2, tolerance ) (ABS(DOT( (v1), (v2) ) - 1.0) > (tolerance))
-
- /******************************************************************/
- #define norm( v ) \
- { \
- _util_FLOAT321 = veclen(v); \
- if( !FLT_ZERO(_util_FLOAT321) ) \
- { \
- _util_FLOAT322 = 1.0/_util_FLOAT321; \
- mult_vect( _util_FLOAT322, (v) ); \
- } \
- }
-
- /******************************************************************/
- #define copy_vect( v1, v2 ) (v1)[X] = (v2)[X], (v1)[Y] = (v2)[Y], (v1)[Z] = (v2)[Z], (v1)[W] = (v2)[W]
-
- /******************************************************************/
- #define sub_vect( v1, v2, result ) \
- { \
- (result)[X] = (v1)[X] - (v2)[X]; \
- (result)[Y] = (v1)[Y] - (v2)[Y]; \
- (result)[Z] = (v1)[Z] - (v2)[Z]; \
- (result)[W] = 1.0; \
- }
-
- /******************************************************************/
- #define add_vect( v1, v2, result ) \
- { \
- (result)[X] = (v1)[X] + (v2)[X]; \
- (result)[Y] = (v1)[Y] + (v2)[Y]; \
- (result)[Z] = (v1)[Z] + (v2)[Z]; \
- (result)[W] = 1.0; \
- }
-
- /******************************************************************/
- #define mult_vect( f, v ) (v)[X] *= (f), (v)[Y] *= (f), (v)[Z] *= (f)
-
- /******************************************************************/
- #define vect_mult_vect( v1, v2, result ) \
- { \
- (result)[X] = (v1)[X] * (v2)[X]; \
- (result)[Y] = (v1)[Y] * (v2)[Y]; \
- (result)[Z] = (v1)[Z] * (v2)[Z]; \
- (result)[W] = (v1)[W] * (v2)[W]; \
- }
-
- /******************************************************************/
- #define vect_mult_vect_add( v1, v2, result ) \
- { \
- (result)[X] += (v1)[X] * (v2)[X]; \
- (result)[Y] += (v1)[Y] * (v2)[Y]; \
- (result)[Z] += (v1)[Z] * (v2)[Z]; \
- (result)[W] += (v1)[W] * (v2)[W]; \
- }
-
- /******************************************************************/
- #define div_vect( v, f ) \
- { \
- if( !FLT_ZERO(f) ) \
- { \
- _util_FLOAT321 = 1.0/(f); \
- mult_vect( _util_FLOAT321, (v) ); \
- } \
- }
-
- /******************************************************************/
- #define homo_vect( v ) \
- { \
- _util_FLOAT321 = (FLT_ZERO((v)[W])) ? 1000.0 : 1.0/(v)[W]; \
- (v)[X] *= _util_FLOAT321; \
- (v)[Y] *= _util_FLOAT321; \
- (v)[Z] *= -1; /*_util_FLOAT321;*/ \
- (v)[W] = 1.0; \
- }
-
- /******************************************************************/
- #define avg_vect( v1, v2, result ) \
- { \
- (result)[X] = ((v1)[X] + (v2)[X])*0.5; \
- (result)[Y] = ((v1)[Y] + (v2)[Y])*0.5; \
- (result)[Z] = ((v1)[Z] + (v2)[Z])*0.5; \
- (result)[W] = 1.0; \
- }
-
- /******************************************************************/
- #define clamp_vect( v, l, h ) \
- { \
- (v)[0] = CLAMP( (v)[0], (l), (h) ); \
- (v)[1] = CLAMP( (v)[1], (l), (h) ); \
- (v)[2] = CLAMP( (v)[2], (l), (h) ); \
- }
-
- /****************************************************************/
- /* typedefs */
- /****************************************************************/
- typedef float FLOAT32;
- typedef FLOAT32 VECT[4];
- typedef FLOAT32 MATRIX[4][4];
-
- /****************************************************************/
- /* function prototypes */
- /****************************************************************/
- extern void matrix_mult( MATRIX, MATRIX, MATRIX );
- extern void vect_matrix_mult( VECT, MATRIX, VECT );
- extern void rotate_about_axis( VECT axis, FLOAT32 angle, MATRIX M );
- extern int intersect_unit_sphere( VECT hit );
-
- /****************************************************************/
- /* global variables */
- /****************************************************************/
- extern VECT _util_vect;
- extern FLOAT32 _util_FLOAT321;
- extern FLOAT32 _util_FLOAT322;
-
-