35 #endif //tells VCC not to generate min/max macros
38 # define M_PI 3.14159265358979323846
44 using namespace GFXMatrices;
101 glMatrixMode( GL_MODELVIEW );
107 id[0] =
id[5] =
id[10] =
id[15] = 1;
108 id[1] =
id[2] =
id[3] =
id[4] =
id[6] =
id[7] =
id[8] =
id[9] =
id[11] =
id[12] =
id[13] =
id[14] = 0;
113 dest[0] = m1[0]*m2.
r[0]+m1[4]*m2.
r[1]+m1[8]*m2.
r[2];
114 dest[1] = m1[1]*m2.
r[0]+m1[5]*m2.
r[1]+m1[9]*m2.
r[2];
115 dest[2] = m1[2]*m2.
r[0]+m1[6]*m2.
r[1]+m1[10]*m2.
r[2];
116 dest[3] = m1[3]*m2.
r[0]+m1[7]*m2.
r[1]+m1[11]*m2.
r[2];
118 dest[4] = m1[0]*m2.
r[3]+m1[4]*m2.
r[4]+m1[8]*m2.
r[5];
119 dest[5] = m1[1]*m2.
r[3]+m1[5]*m2.
r[4]+m1[9]*m2.
r[5];
120 dest[6] = m1[2]*m2.
r[3]+m1[6]*m2.
r[4]+m1[10]*m2.
r[5];
121 dest[7] = m1[3]*m2.
r[3]+m1[7]*m2.
r[4]+m1[11]*m2.
r[5];
123 dest[8] = m1[0]*m2.
r[6]+m1[4]*m2.
r[7]+m1[8]*m2.
r[8];
124 dest[9] = m1[1]*m2.
r[6]+m1[5]*m2.
r[7]+m1[9]*m2.
r[8];
125 dest[10] = m1[2]*m2.
r[6]+m1[6]*m2.
r[7]+m1[10]*m2.
r[8];
126 dest[11] = m1[3]*m2.
r[6]+m1[7]*m2.
r[7]+m1[11]*m2.
r[8];
128 dest[12] = m1[0]*m2.
p.i+m1[4]*m2.
p.j+m1[8]*m2.
p.k+m1[12];
129 dest[13] = m1[1]*m2.
p.i+m1[5]*m2.
p.j+m1[9]*m2.
p.k+m1[13];
130 dest[14] = m1[2]*m2.
p.i+m1[6]*m2.
p.j+m1[10]*m2.
p.k+m1[14];
131 dest[15] = m1[3]*m2.
p.i+m1[7]*m2.
p.j+m1[11]*m2.
p.k+m1[15];
136 dest[0] = (m1[0]*m2.
r[0]+m1[4]*m2.
r[1]+m1[8]*m2.
r[2]);
137 dest[1] = (m1[1]*m2.
r[0]+m1[5]*m2.
r[1]+m1[9]*m2.
r[2]);
138 dest[2] = (m1[2]*m2.
r[0]+m1[6]*m2.
r[1]+m1[10]*m2.
r[2]);
139 dest[3] = (m1[3]*m2.
r[0]+m1[7]*m2.
r[1]+m1[11]*m2.
r[2]);
141 dest[4] = (m1[0]*m2.
r[3]+m1[4]*m2.
r[4]+m1[8]*m2.
r[5]);
142 dest[5] = (m1[1]*m2.
r[3]+m1[5]*m2.
r[4]+m1[9]*m2.
r[5]);
143 dest[6] = (m1[2]*m2.
r[3]+m1[6]*m2.
r[4]+m1[10]*m2.
r[5]);
144 dest[7] = (m1[3]*m2.
r[3]+m1[7]*m2.
r[4]+m1[11]*m2.
r[5]);
146 dest[8] = (m1[0]*m2.
r[6]+m1[4]*m2.
r[7]+m1[8]*m2.
r[8]);
147 dest[9] = (m1[1]*m2.
r[6]+m1[5]*m2.
r[7]+m1[9]*m2.
r[8]);
148 dest[10] = (m1[2]*m2.
r[6]+m1[6]*m2.
r[7]+m1[10]*m2.
r[8]);
149 dest[11] = (m1[3]*m2.
r[6]+m1[7]*m2.
r[7]+m1[11]*m2.
r[8]);
161 glMatrixMode( GL_PROJECTION );
221 glViewport( minx, miny, maxx, maxy );
229 view.
p.Set( 0, 0, 0 );
230 glMatrixMode( GL_MODELVIEW );
240 glMatrixMode( GL_MODELVIEW );
242 glMatrixMode( GL_PROJECTION );
249 glMatrixMode( GL_MODELVIEW );
252 glMatrixMode( GL_PROJECTION );
256 glMatrixMode( GL_PROJECTION );
258 glMatrixMode( GL_MODELVIEW );
269 glMatrixMode( GL_MODELVIEW );
282 glMatrixMode( GL_PROJECTION );
297 static void gl_Frustum(
float left,
float right,
float bottom,
float top,
float nearval,
float farval )
303 void GFXFrustum(
float *m,
float *i,
float left,
float right,
float bottom,
float top,
float nearval,
float farval )
306 x = ( ( (
float) 2.0 )*nearval )/(right-left);
307 y = ( ( (
float) 2.0 )*nearval )/(top-bottom);
308 a = (right+left)/(right-left);
309 b = (top+bottom)/(top-bottom);
315 c = -(farval+nearval)/(farval-nearval);
316 d = -( ( (
float) 2.0 )*farval*nearval )/(farval-nearval);
318 #define M( row, col ) m[col*4+row]
336 #define M( row, col ) i[col*4+row]
356 void GFXPerspective(
float fov,
float aspect,
float znear,
float zfar,
float cockpit_offset )
363 float xmin, xmax, ymin, ymax;
365 ymax = znear*tanf( fov*
M_PI/( (
float) 360.0 ) );
369 xmin = (ymin-cockpit_offset/2)*aspect;
370 xmax = (ymax+cockpit_offset/2)*aspect;
371 ymin -= cockpit_offset;
372 gl_Frustum( xmin, xmax, ymin, ymax, znear, zfar );
376 void GFXParallel(
float left,
float right,
float bottom,
float top,
float nearval,
float farval )
379 x = 2.0/(right-left);
380 y = 2.0/(top-bottom);
381 z = -2.0/(farval-nearval);
382 tx = -(right+left)/(right-left);
383 ty = -(top+bottom)/(top-bottom);
384 tz = -(farval+nearval)/(farval-nearval);
386 #define M( row, col ) m[col*4+row]
419 double x[3],
y[3],
z[3];
428 mag = sqrtf( z[0]*z[0]+z[1]*z[1]+z[2]*z[2] );
444 x[0] = y[1]*z[2]-y[2]*z[1];
445 x[1] = -y[0]*z[2]+y[2]*z[0];
446 x[2] = y[0]*z[1]-y[1]*z[0];
452 y[0] = z[1]*x[2]-z[2]*x[1];
453 y[1] = -z[0]*x[2]+z[2]*x[0];
454 y[2] = z[0]*x[1]-z[1]*x[0];
461 mag = sqrtf( x[0]*x[0]+x[1]*x[1]+x[2]*x[2] );
467 mag = sqrtf( y[0]*y[0]+y[1]*y[1]+y[2]*y[2] );
473 #define M( row, col ) view.r[col*3+row]
488 view.
p.i = centerx+eyex;
489 view.
p.j = centery+eyey;
490 view.
p.k = centerz+eyez;
497 LookAtHelper( eye.i, eye.j, eye.k, center.i, center.j, center.k, up.i, up.j, up.k );
515 void GFXMultMatrixView(
const &
Matrix )
517 const int MULTMATRIXVIEWNOTIMPLEMENTED = 0;
518 assert( MULTMATRIXVIEWNOTIMPLEMENTED );
522 glMatrixMode( GL_MODELVIEW );
528 glLoadMatrixf(
model );
561 glMatrixMode( GL_TEXTURE );
568 cubemapincamspace.Normalize();
571 float theta = asinf( axis.Dot( cubemapincamspace ) );
572 axis = axis.Cross( axis.Cross( cubemapincamspace ) );
573 glRotatef( theta, axis.i, axis.j, axis.k );