31 #endif //tells VCC not to generate min/max macros
34 # define M_PI 3.14159265358979323846
43 inline void Zero(
float matrix[] )
91 return sqrtf( v.i*v.i+v.j*v.j+v.k*v.k );
105 inline void MultMatrix(
float dest[],
const float m1[],
const float m2[] )
107 dest[0] = m1[0]*m2[0]+m1[4]*m2[1]+m1[8]*m2[2]+m1[12]*m2[3];
108 dest[1] = m1[1]*m2[0]+m1[5]*m2[1]+m1[9]*m2[2]+m1[13]*m2[3];
109 dest[2] = m1[2]*m2[0]+m1[6]*m2[1]+m1[10]*m2[2]+m1[14]*m2[3];
110 dest[3] = m1[3]*m2[0]+m1[7]*m2[1]+m1[11]*m2[2]+m1[15]*m2[3];
112 dest[4] = m1[0]*m2[4]+m1[4]*m2[5]+m1[8]*m2[6]+m1[12]*m2[7];
113 dest[5] = m1[1]*m2[4]+m1[5]*m2[5]+m1[9]*m2[6]+m1[13]*m2[7];
114 dest[6] = m1[2]*m2[4]+m1[6]*m2[5]+m1[10]*m2[6]+m1[14]*m2[7];
115 dest[7] = m1[3]*m2[4]+m1[7]*m2[5]+m1[11]*m2[6]+m1[15]*m2[7];
117 dest[8] = m1[0]*m2[8]+m1[4]*m2[9]+m1[8]*m2[10]+m1[12]*m2[11];
118 dest[9] = m1[1]*m2[8]+m1[5]*m2[9]+m1[9]*m2[10]+m1[13]*m2[11];
119 dest[10] = m1[2]*m2[8]+m1[6]*m2[9]+m1[10]*m2[10]+m1[14]*m2[11];
120 dest[11] = m1[3]*m2[8]+m1[7]*m2[9]+m1[11]*m2[10]+m1[15]*m2[11];
122 dest[12] = m1[0]*m2[12]+m1[4]*m2[13]+m1[8]*m2[14]+m1[12]*m2[15];
123 dest[13] = m1[1]*m2[12]+m1[5]*m2[13]+m1[9]*m2[14]+m1[13]*m2[15];
124 dest[14] = m1[2]*m2[12]+m1[6]*m2[13]+m1[10]*m2[14]+m1[14]*m2[15];
125 dest[15] = m1[3]*m2[12]+m1[7]*m2[13]+m1[11]*m2[14]+m1[15]*m2[15];
146 dest[10] = source[10];
147 dest[11] = source[11];
148 dest[12] = source[12];
149 dest[13] = source[13];
150 dest[14] = source[14];
151 dest[15] = source[15];
159 using namespace GFXMatrices;
166 #define M( row, col ) rotview[col*4+row]
202 float left, right, bottom, top, nearval, farval;
205 printf(
"nearval: %f, left: %f, right: %f, z: %f\n", nearval, left, right, z );
207 float xs = 2*nearval/(right-left);
208 float a = (right+left)/(right-left);
236 glMatrixMode( GL_MODELVIEW );
237 glTranslatef( a.i, a.j, a.k );
243 glMatrixMode( GL_MODELVIEW );
248 glMultMatrixf(
model );
257 glMatrixMode( GL_PROJECTION );
272 glMatrixMode( GL_MODELVIEW );
275 glMultMatrixf( matrix );
282 glMatrixMode( GL_PROJECTION );
297 glMatrixMode( GL_PROJECTION );
313 glMatrixMode( GL_MODELVIEW );
316 glLoadMatrixf(
model );
317 model[12] = matrix[12];
318 model[13] = matrix[13];
319 model[14] = matrix[14];
335 glMatrixMode( GL_PROJECTION );
341 glMatrixMode( GL_PROJECTION );
350 glViewport( minx, miny, maxx, maxy );
356 glMatrixMode( GL_MODELVIEW );
359 glMatrixMode( GL_PROJECTION );
363 glMatrixMode( GL_PROJECTION );
365 glMatrixMode( GL_MODELVIEW );
376 glMatrixMode( GL_MODELVIEW );
385 glMatrixMode( GL_MODELVIEW );
387 glLoadMatrixf(
model );
389 glMatrixMode( GL_PROJECTION );
394 glMatrixMode( GL_PROJECTION );
422 static void gl_Frustum(
float left,
float right,
float bottom,
float top,
float nearval,
float farval )
430 static float nnear, ffar, left, right, bot, top;
449 void GFXFrustum(
float *m,
float *i,
float left,
float right,
float bottom,
float top,
float nearval,
float farval )
452 x = ( ( (
float) 2.0 )*nearval )/(right-left);
453 y = ( ( (
float) 2.0 )*nearval )/(top-bottom);
454 a = (right+left)/(right-left);
455 b = (top+bottom)/(top-bottom);
461 c = -(farval+nearval)/(farval-nearval);
462 d = -( ( (
float) 2.0 )*farval*nearval )/(farval-nearval);
464 #define M( row, col ) m[col*4+row]
482 #define M( row, col ) i[col*4+row]
502 void GFXPerspective(
float fov,
float aspect,
float znear,
float zfar,
float cockpit_offset )
505 float xmin, xmax, ymin, ymax;
506 ymax = znear*tanf( fov*
M_PI/( (
float) 360.0 ) );
508 xmin = (ymin-cockpit_offset/2)*aspect;
509 xmax = (ymax+cockpit_offset/2)*aspect;
510 ymin -= cockpit_offset;
511 gl_Frustum( xmin, xmax, ymin, ymax, znear, zfar );
512 glMatrixMode( GL_PROJECTION );
516 void GFXParallel(
float left,
float right,
float bottom,
float top,
float nearval,
float farval )
519 x = 2.0/(right-left);
520 y = 2.0/(top-bottom);
521 z = -2.0/(farval-nearval);
522 tx = -(right+left)/(right-left);
523 ty = -(top+bottom)/(top-bottom);
524 tz = -(farval+nearval)/(farval-nearval);
525 #define M( row, col ) m[col*4+row]
558 float x[3],
y[3],
z[3];
565 mag = sqrtf( z[0]*z[0]+z[1]*z[1]+z[2]*z[2] );
580 x[0] = y[1]*z[2]-y[2]*z[1];
581 x[1] = -y[0]*z[2]+y[2]*z[0];
582 x[2] = y[0]*z[1]-y[1]*z[0];
587 y[0] = z[1]*x[2]-z[2]*x[1];
588 y[1] = -z[0]*x[2]+z[2]*x[0];
589 y[2] = z[0]*x[1]-z[1]*x[0];
594 mag = sqrtf( x[0]*x[0]+x[1]*x[1]+x[2]*x[2] );
600 mag = sqrtf( y[0]*y[0]+y[1]*y[1]+y[2]*y[2] );
606 #define M( row, col ) m[col*4+row]
627 bzero( tm,
sizeof (tm) );
630 #define M( row, col ) tm[col*4+row]
665 glMatrixMode( GL_TEXTURE );
668 Vector axis( centerx, centery, centerz );
669 Vector cubemapincamspace( eyex, eyey, eyez );
670 cubemapincamspace.Normalize();
673 float theta = asinf( axis.Dot( cubemapincamspace ) );
674 axis = axis.Cross( axis.Cross( cubemapincamspace ) );
675 glRotatef( theta, axis.i, axis.j, axis.k );
688 LookAtHelper( eye.i, eye.j, eye.k, center.i, center.j, center.k, up.i, up.j, up.k );
711 for (p = 0; p < 5; p++) {
713 d = f[p][0]*Cnt.i+f[p][1]*Cnt.j+f[p][2]*Cnt.k+f[p][3];
744 clip[0] = modl[0]*proj[0]+modl[1]*proj[4]+modl[2]*proj[8]+modl[3]*proj[12];
745 clip[1] = modl[0]*proj[1]+modl[1]*proj[5]+modl[2]*proj[9]+modl[3]*proj[13];
746 clip[2] = modl[0]*proj[2]+modl[1]*proj[6]+modl[2]*proj[10]+modl[3]*proj[14];
747 clip[3] = modl[0]*proj[3]+modl[1]*proj[7]+modl[2]*proj[11]+modl[3]*proj[15];
749 clip[4] = modl[4]*proj[0]+modl[5]*proj[4]+modl[6]*proj[8]+modl[7]*proj[12];
750 clip[5] = modl[4]*proj[1]+modl[5]*proj[5]+modl[6]*proj[9]+modl[7]*proj[13];
751 clip[6] = modl[4]*proj[2]+modl[5]*proj[6]+modl[6]*proj[10]+modl[7]*proj[14];
752 clip[7] = modl[4]*proj[3]+modl[5]*proj[7]+modl[6]*proj[11]+modl[7]*proj[15];
754 clip[8] = modl[8]*proj[0]+modl[9]*proj[4]+modl[10]*proj[8]+modl[11]*proj[12];
755 clip[9] = modl[8]*proj[1]+modl[9]*proj[5]+modl[10]*proj[9]+modl[11]*proj[13];
756 clip[10] = modl[8]*proj[2]+modl[9]*proj[6]+modl[10]*proj[10]+modl[11]*proj[14];
757 clip[11] = modl[8]*proj[3]+modl[9]*proj[7]+modl[10]*proj[11]+modl[11]*proj[15];
759 clip[12] = modl[12]*proj[0]+modl[13]*proj[4]+modl[14]*proj[8]+modl[15]*proj[12];
760 clip[13] = modl[12]*proj[1]+modl[13]*proj[5]+modl[14]*proj[9]+modl[15]*proj[13];
761 clip[14] = modl[12]*proj[2]+modl[13]*proj[6]+modl[14]*proj[10]+modl[15]*proj[14];
762 clip[15] = modl[12]*proj[3]+modl[13]*proj[7]+modl[14]*proj[11]+modl[15]*proj[15];
765 frustum[0][0] = clip[3]-clip[0];
766 frustum[0][1] = clip[7]-clip[4];
767 frustum[0][2] = clip[11]-clip[8];
768 frustum[0][3] = clip[15]-clip[12];
771 t = sqrtf( frustum[0][0]*frustum[0][0]+frustum[0][1]*frustum[0][1]+frustum[0][2]*frustum[0][2] );
778 frustum[1][0] = clip[3]+clip[0];
779 frustum[1][1] = clip[7]+clip[4];
780 frustum[1][2] = clip[11]+clip[8];
781 frustum[1][3] = clip[15]+clip[12];
784 t = sqrtf( frustum[1][0]*frustum[1][0]+frustum[1][1]*frustum[1][1]+frustum[1][2]*frustum[1][2] );
791 frustum[2][0] = clip[3]+clip[1];
792 frustum[2][1] = clip[7]+clip[5];
793 frustum[2][2] = clip[11]+clip[9];
794 frustum[2][3] = clip[15]+clip[13];
797 t = sqrtf( frustum[2][0]*frustum[2][0]+frustum[2][1]*frustum[2][1]+frustum[2][2]*frustum[2][2] );
804 frustum[3][0] = clip[3]-clip[1];
805 frustum[3][1] = clip[7]-clip[5];
806 frustum[3][2] = clip[11]-clip[9];
807 frustum[3][3] = clip[15]-clip[13];
810 t = sqrtf( frustum[3][0]*frustum[3][0]+frustum[3][1]*frustum[3][1]+frustum[3][2]*frustum[3][2] );
817 frustum[5][0] = clip[3]-clip[2];
818 frustum[5][1] = clip[7]-clip[6];
819 frustum[5][2] = clip[11]-clip[10];
820 frustum[5][3] = clip[15]-clip[14];
823 t = sqrtf( frustum[5][0]*frustum[5][0]+frustum[5][1]*frustum[5][1]+frustum[5][2]*frustum[5][2] );
830 frustum[4][0] = clip[3]+clip[2];
831 frustum[4][1] = clip[7]+clip[6];
832 frustum[4][2] = clip[11]+clip[10];
833 frustum[4][3] = clip[15]+clip[14];
836 t = sqrtf( frustum[4][0]*frustum[4][0]+frustum[4][1]*frustum[4][1]+frustum[4][2]*frustum[4][2] );