00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef CMacrosGLH
00024 #define CMacrosGLH
00025
00026 #include "math/CMaths.h"
00027 #include "extras/CGlobals.h"
00028
00029
00030
00038
00039
00040
00041
00042
00043
00045 void cLookAt(const cVector3d& a_eye, const cVector3d& a_at, const cVector3d& a_up);
00046
00047
00048
00068
00069 struct cMatrixGL
00070 {
00071 public:
00072
00073
00074
00075
00076
00077
00081
00082 cMatrixGL()
00083 {
00084 identity();
00085 }
00086
00087
00088
00094
00095 const double* pMatrix() const { return m[0]; }
00096
00097
00098
00105
00106 inline void set(const cVector3d& a_pos)
00107 {
00108 m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = 0.0;
00109 m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = 0.0;
00110 m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = 0.0;
00111 m[3][0] = a_pos.x; m[3][1] = a_pos.y; m[3][2] = a_pos.z; m[3][3] = 1.0;
00112 }
00113
00114
00115
00119
00120 inline cVector3d getPos() const
00121 {
00122 return cVector3d(m[3][0],m[3][1],m[3][2]);
00123 }
00124
00125
00126
00130
00131 inline cMatrix3d getRot() const
00132 {
00133 cMatrix3d mat;
00134 mat.set(m[0][0],m[1][0],m[2][0],
00135 m[0][1],m[1][1],m[2][1],
00136 m[0][2],m[1][2],m[2][2]);
00137 return mat;
00138 }
00139
00140
00141
00148
00149 void set(const cMatrix3d& a_rot)
00150 {
00151 m[0][0] = a_rot.m[0][0]; m[0][1] = a_rot.m[1][0]; m[0][2] = a_rot.m[2][0]; m[0][3] = 0.0;
00152 m[1][0] = a_rot.m[0][1]; m[1][1] = a_rot.m[1][1]; m[1][2] = a_rot.m[2][1]; m[1][3] = 0.0;
00153 m[2][0] = a_rot.m[0][2]; m[2][1] = a_rot.m[1][2]; m[2][2] = a_rot.m[2][2]; m[2][3] = 0.0;
00154 m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
00155 }
00156
00157
00158
00166
00167 void set(const cVector3d& a_pos, const cMatrix3d& a_rot)
00168 {
00169 m[0][0] = a_rot.m[0][0]; m[0][1] = a_rot.m[1][0]; m[0][2] = a_rot.m[2][0]; m[0][3] = 0.0;
00170 m[1][0] = a_rot.m[0][1]; m[1][1] = a_rot.m[1][1]; m[1][2] = a_rot.m[2][1]; m[1][3] = 0.0;
00171 m[2][0] = a_rot.m[0][2]; m[2][1] = a_rot.m[1][2]; m[2][2] = a_rot.m[2][2]; m[2][3] = 0.0;
00172 m[3][0] = a_pos.x; m[3][1] = a_pos.y; m[3][2] = a_pos.z; m[3][3] = 1.0;
00173 }
00174
00175
00176
00182
00183 inline void copyto(cMatrixGL& a_destination) const
00184 {
00185 a_destination.m[0][0] = m[0][0]; a_destination.m[0][1] = m[0][1];
00186 a_destination.m[0][2] = m[0][2]; a_destination.m[0][3] = m[0][3];
00187 a_destination.m[1][0] = m[1][0]; a_destination.m[1][1] = m[1][1];
00188 a_destination.m[1][2] = m[1][2]; a_destination.m[1][3] = m[1][3];
00189 a_destination.m[2][0] = m[2][0]; a_destination.m[2][1] = m[2][1];
00190 a_destination.m[2][2] = m[2][2]; a_destination.m[2][3] = m[2][3];
00191 a_destination.m[3][0] = m[3][0]; a_destination.m[3][1] = m[3][1];
00192 a_destination.m[3][2] = m[3][2]; a_destination.m[3][3] = m[3][3];
00193 }
00194
00195
00196
00202
00203 inline void copyfrom(const cMatrixGL& a_source)
00204 {
00205 m[0][0] = a_source.m[0][0]; m[0][1] = a_source.m[0][1];
00206 m[0][2] = a_source.m[0][2]; m[0][3] = a_source.m[0][3];
00207 m[1][0] = a_source.m[1][0]; m[1][1] = a_source.m[1][1];
00208 m[1][2] = a_source.m[1][2]; m[1][3] = a_source.m[1][3];
00209 m[2][0] = a_source.m[2][0]; m[2][1] = a_source.m[2][1];
00210 m[2][2] = a_source.m[2][2]; m[2][3] = a_source.m[2][3];
00211 m[3][0] = a_source.m[3][0]; m[3][1] = a_source.m[3][1];
00212 m[3][2] = a_source.m[3][2]; m[3][3] = a_source.m[3][3];
00213 }
00214
00215
00216
00220
00221 inline void identity()
00222 {
00223 m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = 0.0;
00224 m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = 0.0;
00225 m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = 0.0;
00226 m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
00227 }
00228
00229
00230
00242
00243 inline void mul(const cMatrixGL& a_matrix)
00244 {
00245
00246 double m00 = m[0][0] * a_matrix.m[0][0] + m[0][1] * a_matrix.m[1][0] +
00247 m[0][2] * a_matrix.m[2][0] + m[0][3] * a_matrix.m[3][0];
00248 double m01 = m[0][0] * a_matrix.m[0][1] + m[0][1] * a_matrix.m[1][1] +
00249 m[0][2] * a_matrix.m[2][1] + m[0][3] * a_matrix.m[3][1];
00250 double m02 = m[0][0] * a_matrix.m[0][2] + m[0][1] * a_matrix.m[1][2] +
00251 m[0][2] * a_matrix.m[2][2] + m[0][3] * a_matrix.m[3][2];
00252 double m03 = m[0][0] * a_matrix.m[0][3] + m[0][1] * a_matrix.m[1][3] +
00253 m[0][2] * a_matrix.m[2][3] + m[0][3] * a_matrix.m[3][3];
00254
00255 double m10 = m[1][0] * a_matrix.m[0][0] + m[1][1] * a_matrix.m[1][0] +
00256 m[1][2] * a_matrix.m[2][0] + m[1][3] * a_matrix.m[3][0];
00257 double m11 = m[1][0] * a_matrix.m[0][1] + m[1][1] * a_matrix.m[1][1] +
00258 m[1][2] * a_matrix.m[2][1] + m[1][3] * a_matrix.m[3][1];
00259 double m12 = m[1][0] * a_matrix.m[0][2] + m[1][1] * a_matrix.m[1][2] +
00260 m[1][2] * a_matrix.m[2][2] + m[1][3] * a_matrix.m[3][2];
00261 double m13 = m[1][0] * a_matrix.m[0][3] + m[1][1] * a_matrix.m[1][3] +
00262 m[1][2] * a_matrix.m[2][3] + m[1][3] * a_matrix.m[3][3];
00263
00264 double m20 = m[2][0] * a_matrix.m[0][0] + m[2][1] * a_matrix.m[1][0] +
00265 m[2][2] * a_matrix.m[2][0] + m[2][3] * a_matrix.m[3][0];
00266 double m21 = m[2][0] * a_matrix.m[0][1] + m[2][1] * a_matrix.m[1][1] +
00267 m[2][2] * a_matrix.m[2][1] + m[2][3] * a_matrix.m[3][1];
00268 double m22 = m[2][0] * a_matrix.m[0][2] + m[2][1] * a_matrix.m[1][2] +
00269 m[2][2] * a_matrix.m[2][2] + m[2][3] * a_matrix.m[3][2];
00270 double m23 = m[2][0] * a_matrix.m[0][3] + m[2][1] * a_matrix.m[1][3] +
00271 m[2][2] * a_matrix.m[2][3] + m[2][3] * a_matrix.m[3][3];
00272
00273 double m30 = m[3][0] * a_matrix.m[0][0] + m[3][1] * a_matrix.m[1][0] +
00274 m[3][2] * a_matrix.m[2][0] + m[3][3] * a_matrix.m[3][0];
00275 double m31 = m[3][0] * a_matrix.m[0][1] + m[3][1] * a_matrix.m[1][1] +
00276 m[3][2] * a_matrix.m[2][1] + m[3][3] * a_matrix.m[3][1];
00277 double m32 = m[3][0] * a_matrix.m[0][2] + m[3][1] * a_matrix.m[1][2] +
00278 m[3][2] * a_matrix.m[2][2] + m[3][3] * a_matrix.m[3][2];
00279 double m33 = m[3][0] * a_matrix.m[0][3] + m[3][1] * a_matrix.m[1][3] +
00280 m[3][2] * a_matrix.m[2][3] + m[3][3] * a_matrix.m[3][3];
00281
00282
00283 m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03;
00284 m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13;
00285 m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23;
00286 m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33;
00287 }
00288
00289
00290
00303
00304 inline void mulr(const cMatrix3d& a_matrix, cMatrix3d& a_result) const
00305 {
00306
00307 a_result.m[0][0] = m[0][0] * a_matrix.m[0][0] + m[0][1] * a_matrix.m[1][0] + m[0][2] * a_matrix.m[2][0];
00308 a_result.m[0][1] = m[0][0] * a_matrix.m[0][1] + m[0][1] * a_matrix.m[1][1] + m[0][2] * a_matrix.m[2][1];
00309 a_result.m[0][2] = m[0][0] * a_matrix.m[0][2] + m[0][1] * a_matrix.m[1][2] + m[0][2] * a_matrix.m[2][2];
00310 a_result.m[1][0] = m[1][0] * a_matrix.m[0][0] + m[1][1] * a_matrix.m[1][0] + m[1][2] * a_matrix.m[2][0];
00311 a_result.m[1][1] = m[1][0] * a_matrix.m[0][1] + m[1][1] * a_matrix.m[1][1] + m[1][2] * a_matrix.m[2][1];
00312 a_result.m[1][2] = m[1][0] * a_matrix.m[0][2] + m[1][1] * a_matrix.m[1][2] + m[1][2] * a_matrix.m[2][2];
00313 a_result.m[2][0] = m[2][0] * a_matrix.m[0][0] + m[2][1] * a_matrix.m[1][0] + m[2][2] * a_matrix.m[2][0];
00314 a_result.m[2][1] = m[2][0] * a_matrix.m[0][1] + m[2][1] * a_matrix.m[1][1] + m[2][2] * a_matrix.m[2][1];
00315 a_result.m[2][2] = m[2][0] * a_matrix.m[0][2] + m[2][1] * a_matrix.m[1][2] + m[2][2] * a_matrix.m[2][2];
00316 }
00317
00318
00319
00323
00324 inline void trans()
00325 {
00326 double t;
00327
00328 t = m[0][1]; m[0][1] = m[1][0]; m[1][0] = t;
00329 t = m[0][2]; m[0][2] = m[2][0]; m[2][0] = t;
00330 t = m[0][3]; m[0][3] = m[3][0]; m[3][0] = t;
00331 t = m[1][2]; m[1][2] = m[2][1]; m[2][1] = t;
00332 t = m[1][3]; m[1][3] = m[3][1]; m[3][1] = t;
00333 t = m[2][3]; m[2][3] = m[3][2]; m[3][2] = t;
00334 }
00335
00336
00337
00343
00344 inline void transr(cMatrixGL& a_result) const
00345 {
00346 a_result.m[0][0] = m[0][0];
00347 a_result.m[0][1] = m[1][0];
00348 a_result.m[0][2] = m[2][0];
00349 a_result.m[0][3] = m[3][0];
00350
00351 a_result.m[1][0] = m[0][1];
00352 a_result.m[1][1] = m[1][1];
00353 a_result.m[1][2] = m[2][1];
00354 a_result.m[1][3] = m[3][1];
00355
00356 a_result.m[2][0] = m[0][2];
00357 a_result.m[2][1] = m[1][2];
00358 a_result.m[2][2] = m[2][2];
00359 a_result.m[2][3] = m[3][2];
00360
00361 a_result.m[3][0] = m[0][3];
00362 a_result.m[3][1] = m[1][3];
00363 a_result.m[3][2] = m[2][3];
00364 a_result.m[3][3] = m[3][3];
00365 }
00366
00367
00368
00372
00373 inline void buildFrustumMatrix(double l, double r, double b, double t,
00374 double n, double f)
00375 {
00376 m[0][0] = (2.0*n) / (r-l);
00377 m[0][1] = 0.0;
00378 m[0][2] = 0.0;
00379 m[0][3] = 0.0;
00380
00381 m[1][0] = 0.0;
00382 m[1][1] = (2.0*n) / (t-b);
00383 m[1][2] = 0.0;
00384 m[1][3] = 0.0;
00385
00386 m[2][0] = (r+l) / (r-l);
00387 m[2][1] = (t+b) / (t-b);
00388 m[2][2] = -(f+n) / (f-n);
00389 m[2][3] = -1.0;
00390
00391 m[3][0] = 0.0;
00392 m[3][1] = 0.0;
00393 m[3][2] = -(2.0*f*n) / (f-n);
00394 m[3][3] = 0.0;
00395 }
00396
00397
00398
00404
00405 bool inline invert()
00406 {
00407
00408
00409 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00410 #define SWAP_ROWS(a, b) { GLdouble *_tmp = a; (a)=(b); (b)=_tmp; }
00411 #define MAT(m,r,c) (m)[(c)*4+(r)]
00412 #endif // DOXYGEN_SHOULD_SKIP_THIS
00413
00414 double *mat = m[0];
00415
00416 GLdouble wtmp[4][8];
00417 GLdouble m0, m1, m2, m3, s;
00418 GLdouble *r0, *r1, *r2, *r3;
00419
00420 r0 = wtmp[0], r1 = wtmp[1], r2 = wtmp[2], r3 = wtmp[3];
00421
00422 r0[0] = MAT(mat,0,0), r0[1] = MAT(mat,0,1),
00423 r0[2] = MAT(mat,0,2), r0[3] = MAT(mat,0,3),
00424 r0[4] = 1.0, r0[5] = r0[6] = r0[7] = 0.0,
00425
00426 r1[0] = MAT(mat,1,0), r1[1] = MAT(mat,1,1),
00427 r1[2] = MAT(mat,1,2), r1[3] = MAT(mat,1,3),
00428 r1[5] = 1.0, r1[4] = r1[6] = r1[7] = 0.0,
00429
00430 r2[0] = MAT(mat,2,0), r2[1] = MAT(mat,2,1),
00431 r2[2] = MAT(mat,2,2), r2[3] = MAT(mat,2,3),
00432 r2[6] = 1.0, r2[4] = r2[5] = r2[7] = 0.0,
00433
00434 r3[0] = MAT(mat,3,0), r3[1] = MAT(mat,3,1),
00435 r3[2] = MAT(mat,3,2), r3[3] = MAT(mat,3,3),
00436 r3[7] = 1.0, r3[4] = r3[5] = r3[6] = 0.0;
00437
00438
00439 if (fabs(r3[0])>fabs(r2[0])) SWAP_ROWS(r3, r2);
00440 if (fabs(r2[0])>fabs(r1[0])) SWAP_ROWS(r2, r1);
00441 if (fabs(r1[0])>fabs(r0[0])) SWAP_ROWS(r1, r0);
00442 if (0.0 == r0[0])
00443 {
00444 return false;
00445 }
00446
00447
00448 m1 = r1[0]/r0[0]; m2 = r2[0]/r0[0]; m3 = r3[0]/r0[0];
00449 s = r0[1]; r1[1] -= m1 * s; r2[1] -= m2 * s; r3[1] -= m3 * s;
00450 s = r0[2]; r1[2] -= m1 * s; r2[2] -= m2 * s; r3[2] -= m3 * s;
00451 s = r0[3]; r1[3] -= m1 * s; r2[3] -= m2 * s; r3[3] -= m3 * s;
00452 s = r0[4];
00453 if (s != 0.0) { r1[4] -= m1 * s; r2[4] -= m2 * s; r3[4] -= m3 * s; }
00454 s = r0[5];
00455 if (s != 0.0) { r1[5] -= m1 * s; r2[5] -= m2 * s; r3[5] -= m3 * s; }
00456 s = r0[6];
00457 if (s != 0.0) { r1[6] -= m1 * s; r2[6] -= m2 * s; r3[6] -= m3 * s; }
00458 s = r0[7];
00459 if (s != 0.0) { r1[7] -= m1 * s; r2[7] -= m2 * s; r3[7] -= m3 * s; }
00460
00461
00462 if (fabs(r3[1])>fabs(r2[1])) SWAP_ROWS(r3, r2);
00463 if (fabs(r2[1])>fabs(r1[1])) SWAP_ROWS(r2, r1);
00464 if (0.0 == r1[1])
00465 {
00466 return false;
00467 }
00468
00469
00470 m2 = r2[1]/r1[1]; m3 = r3[1]/r1[1];
00471 r2[2] -= m2 * r1[2]; r3[2] -= m3 * r1[2];
00472 r2[3] -= m2 * r1[3]; r3[3] -= m3 * r1[3];
00473 s = r1[4]; if (0.0 != s) { r2[4] -= m2 * s; r3[4] -= m3 * s; }
00474 s = r1[5]; if (0.0 != s) { r2[5] -= m2 * s; r3[5] -= m3 * s; }
00475 s = r1[6]; if (0.0 != s) { r2[6] -= m2 * s; r3[6] -= m3 * s; }
00476 s = r1[7]; if (0.0 != s) { r2[7] -= m2 * s; r3[7] -= m3 * s; }
00477
00478
00479 if (fabs(r3[2])>fabs(r2[2])) SWAP_ROWS(r3, r2);
00480 if (0.0 == r2[2])
00481 {
00482 return false;
00483 }
00484
00485
00486 m3 = r3[2]/r2[2];
00487 r3[3] -= m3 * r2[3], r3[4] -= m3 * r2[4],
00488 r3[5] -= m3 * r2[5], r3[6] -= m3 * r2[6],
00489 r3[7] -= m3 * r2[7];
00490
00491
00492 if (0.0 == r3[3])
00493 {
00494 return false;
00495 }
00496
00497 s = 1.0/r3[3];
00498 r3[4] *= s; r3[5] *= s; r3[6] *= s; r3[7] *= s;
00499
00500 m2 = r2[3];
00501 s = 1.0/r2[2];
00502 r2[4] = s * (r2[4] - r3[4] * m2), r2[5] = s * (r2[5] - r3[5] * m2),
00503 r2[6] = s * (r2[6] - r3[6] * m2), r2[7] = s * (r2[7] - r3[7] * m2);
00504 m1 = r1[3];
00505 r1[4] -= r3[4] * m1, r1[5] -= r3[5] * m1,
00506 r1[6] -= r3[6] * m1, r1[7] -= r3[7] * m1;
00507 m0 = r0[3];
00508 r0[4] -= r3[4] * m0, r0[5] -= r3[5] * m0,
00509 r0[6] -= r3[6] * m0, r0[7] -= r3[7] * m0;
00510
00511 m1 = r1[2];
00512 s = 1.0/r1[1];
00513 r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1),
00514 r1[6] = s * (r1[6] - r2[6] * m1), r1[7] = s * (r1[7] - r2[7] * m1);
00515 m0 = r0[2];
00516 r0[4] -= r2[4] * m0, r0[5] -= r2[5] * m0,
00517 r0[6] -= r2[6] * m0, r0[7] -= r2[7] * m0;
00518
00519 m0 = r0[1];
00520 s = 1.0/r0[0];
00521 r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0),
00522 r0[6] = s * (r0[6] - r1[6] * m0), r0[7] = s * (r0[7] - r1[7] * m0);
00523
00524 MAT(mat,0,0) = r0[4]; MAT(mat,0,1) = r0[5],
00525 MAT(mat,0,2) = r0[6]; MAT(mat,0,3) = r0[7],
00526 MAT(mat,1,0) = r1[4]; MAT(mat,1,1) = r1[5],
00527 MAT(mat,1,2) = r1[6]; MAT(mat,1,3) = r1[7],
00528 MAT(mat,2,0) = r2[4]; MAT(mat,2,1) = r2[5],
00529 MAT(mat,2,2) = r2[6]; MAT(mat,2,3) = r2[7],
00530 MAT(mat,3,0) = r3[4]; MAT(mat,3,1) = r3[5],
00531 MAT(mat,3,2) = r3[6]; MAT(mat,3,3) = r3[7];
00532
00533 return true;
00534
00535
00536 #undef MAT
00537 #undef SWAP_ROWS
00538 }
00539
00540
00541
00545
00546 inline void buildPerspectiveMatrix(double fovy, double aspect,
00547 double zNear, double zFar)
00548 {
00549 double xMin, xMax, yMin, yMax;
00550
00551 yMax = zNear * tan(fovy * CHAI_PI / 360.0);
00552 yMin = -yMax;
00553
00554 xMin = yMin * aspect;
00555 xMax = yMax * aspect;
00556
00557 buildFrustumMatrix(xMin, xMax, yMin, yMax, zNear, zFar);
00558 }
00559
00560
00561
00565
00566 inline void buildLookAtMatrix(double eyex, double eyey, double eyez,
00567 double centerx, double centery, double centerz,
00568 double upx, double upy, double upz)
00569 {
00570 double x[3], y[3], z[3];
00571 double mag;
00572
00573
00574
00575
00576 z[0] = eyex - centerx;
00577 z[1] = eyey - centery;
00578 z[2] = eyez - centerz;
00579 mag = sqrt( z[0]*z[0] + z[1]*z[1] + z[2]*z[2] );
00580 if (mag) {
00581 z[0] /= mag;
00582 z[1] /= mag;
00583 z[2] /= mag;
00584 }
00585
00586
00587 y[0] = upx;
00588 y[1] = upy;
00589 y[2] = upz;
00590
00591
00592 x[0] = y[1]*z[2] - y[2]*z[1];
00593 x[1] = -y[0]*z[2] + y[2]*z[0];
00594 x[2] = y[0]*z[1] - y[1]*z[0];
00595
00596
00597 y[0] = z[1]*x[2] - z[2]*x[1];
00598 y[1] = -z[0]*x[2] + z[2]*x[0];
00599 y[2] = z[0]*x[1] - z[1]*x[0];
00600
00601
00602
00603 mag = sqrt( x[0]*x[0] + x[1]*x[1] + x[2]*x[2] );
00604 if (mag) {
00605 x[0] /= mag;
00606 x[1] /= mag;
00607 x[2] /= mag;
00608 }
00609
00610 mag = sqrt( y[0]*y[0] + y[1]*y[1] + y[2]*y[2] );
00611 if (mag) {
00612 y[0] /= mag;
00613 y[1] /= mag;
00614 y[2] /= mag;
00615 }
00616
00617 m[0][0] = x[0]; m[1][0] = x[1]; m[2][0] = x[2]; m[3][0] = -x[0]*eyex + -x[1]*eyey + -x[2]*eyez;
00618 m[0][1] = y[0]; m[1][1] = y[1]; m[2][1] = y[2]; m[3][1] = -y[0]*eyex + -y[1]*eyey + -y[2]*eyez;
00619 m[0][2] = z[0]; m[1][2] = z[1]; m[2][2] = z[2]; m[3][2] = -z[0]*eyex + -z[1]*eyey + -z[2]*eyez;
00620 m[0][3] = 0.0; m[1][3] = 0.0; m[2][3] = 0.0; m[3][3] = 1.0;
00621 }
00622
00623
00624
00628
00629 inline void buildLookAtMatrix(cVector3d& a_eye, cVector3d& a_lookAt, cVector3d a_up)
00630 {
00631 buildLookAtMatrix(a_eye.x, a_eye.y, a_eye.z,
00632 a_lookAt.x, a_lookAt.y, a_lookAt.z,
00633 a_up.x, a_up.y, a_up.z);
00634 }
00635
00636
00637
00641
00642 inline void glMatrixPush()
00643 {
00644 glPushMatrix();
00645 }
00646
00647
00648
00652
00653 inline void glMatrixLoad()
00654 {
00655 glLoadMatrixd( (const double *)pMatrix() );
00656 }
00657
00658
00659
00663
00664 inline void glMatrixMultiply()
00665 {
00666 glMultMatrixd( (const double *)pMatrix() );
00667 }
00668
00669
00670
00675
00676 inline void glMatrixPushMultiply()
00677 {
00678 glPushMatrix();
00679 glMultMatrixd( (const double *)pMatrix() );
00680 }
00681
00682
00683
00687
00688 inline void glMatrixPop()
00689 {
00690 glPopMatrix();
00691 }
00692
00693
00694
00701
00702 inline void str(std::string& a_string, int a_precision)
00703 {
00704 a_string.append("[ ");
00705 for (int i=0; i<4; i++)
00706 {
00707 a_string.append("( ");
00708 for (int j=0; j<4; j++)
00709 {
00710 cStr(a_string, m[j][i], a_precision);
00711 if (j<3)
00712 {
00713 a_string.append(", ");
00714 }
00715 }
00716 a_string.append(" ) ");
00717 }
00718 a_string.append("]");
00719 }
00720
00721
00722 private:
00723
00724
00725
00726
00727
00729 double m[4][4];
00730 };
00731
00732
00733 #endif
00734