00001 #pragma once
00002
00003 #include "common.h"
00004 #include <math.h>
00005 #include "Vector.h"
00006 #include "Quaternion.h"
00007
00008
00009
00010
00011
00012 class Matrix
00013 {
00014 public:
00015
00019 Matrix()
00020 {
00021 m_vfElements.m_vfElements16[0]=m_vfElements.m_vfElements16[5]=m_vfElements.m_vfElements16[10]=m_vfElements.m_vfElements16[15]=1.0f;
00022 m_vfElements.m_vfElements16[1]=m_vfElements.m_vfElements16[2]=m_vfElements.m_vfElements16[3]=m_vfElements.m_vfElements16[4]=m_vfElements.m_vfElements16[6]=m_vfElements.m_vfElements16[7]=m_vfElements.m_vfElements16[8]=m_vfElements.m_vfElements16[9]=m_vfElements.m_vfElements16[11]=m_vfElements.m_vfElements16[12]=m_vfElements.m_vfElements16[13]=m_vfElements.m_vfElements16[14]=0.0f;
00023 };
00024
00044 Matrix( const float & fElement0, const float & fElement4, const float & fElement8, const float & fElement12,
00045 const float & fElement1, const float & fElement5, const float & fElement9, const float & fElement13,
00046 const float & fElement2, const float & fElement6, const float & fElement10, const float & fElement14,
00047 const float & fElement3, const float & fElement7, const float & fElement11, const float & fElement15)
00048 {
00049 m_vfElements.m_vfElements16[0]=fElement0; m_vfElements.m_vfElements16[4]=fElement4; m_vfElements.m_vfElements16[8]=fElement8; m_vfElements.m_vfElements16[12]=fElement12;
00050 m_vfElements.m_vfElements16[1]=fElement1; m_vfElements.m_vfElements16[5]=fElement5; m_vfElements.m_vfElements16[9]=fElement9; m_vfElements.m_vfElements16[13]=fElement13;
00051 m_vfElements.m_vfElements16[2]=fElement2; m_vfElements.m_vfElements16[6]=fElement6; m_vfElements.m_vfElements16[10]=fElement10; m_vfElements.m_vfElements16[14]=fElement14;
00052 m_vfElements.m_vfElements16[3]=fElement3; m_vfElements.m_vfElements16[7]=fElement7; m_vfElements.m_vfElements16[11]=fElement11; m_vfElements.m_vfElements16[15]=fElement15;
00053 };
00054
00055
00063 Matrix(const Vector & vecOne, const Vector & vecTwo, const Vector & vecThree, const Vector & vecFour = Vector(0.0f,0.0f,0.0f))
00064 {
00065
00066 m_vfElements.m_vfElements16[0]=vecOne.GetX(); m_vfElements.m_vfElements16[4]=vecOne.GetY(); m_vfElements.m_vfElements16[8]=vecOne.GetZ(); m_vfElements.m_vfElements16[12]=0.0f;
00067 m_vfElements.m_vfElements16[1]=vecTwo.GetX(); m_vfElements.m_vfElements16[5]=vecTwo.GetY(); m_vfElements.m_vfElements16[9]=vecTwo.GetZ(); m_vfElements.m_vfElements16[13]=0.0f;
00068 m_vfElements.m_vfElements16[2]=vecThree.GetX(); m_vfElements.m_vfElements16[6]=vecThree.GetY(); m_vfElements.m_vfElements16[10]=vecThree.GetZ(); m_vfElements.m_vfElements16[14]=0.0f;
00069 m_vfElements.m_vfElements16[3]=0.0f; m_vfElements.m_vfElements16[7]=0.0f; m_vfElements.m_vfElements16[11]=0.0f; m_vfElements.m_vfElements16[15]=1.0f;
00070 };
00071
00072
00077 Matrix(const float *pElements)
00078 {
00079 memcpy((void*)m_vfElements.m_vfElements16, (void *)pElements, 16*sizeof(float));
00080 };
00081
00082
00087 Matrix(const float vfElements[4][4])
00088 {
00089 memcpy((void*)m_vfElements.m_vfElements16, (void *)vfElements, 16*sizeof(float));
00090 };
00091
00092
00097 Matrix(const Quaternion & quaRotation)
00098 {
00099 m_vfElements.m_vfElements16[0]=m_vfElements.m_vfElements16[5]=m_vfElements.m_vfElements16[10]=m_vfElements.m_vfElements16[15]=1.0f;
00100 m_vfElements.m_vfElements16[1]=m_vfElements.m_vfElements16[2]=m_vfElements.m_vfElements16[3]=m_vfElements.m_vfElements16[4]=m_vfElements.m_vfElements16[6]=m_vfElements.m_vfElements16[7]=m_vfElements.m_vfElements16[8]=m_vfElements.m_vfElements16[9]=m_vfElements.m_vfElements16[11]=m_vfElements.m_vfElements16[12]=m_vfElements.m_vfElements16[13]=m_vfElements.m_vfElements16[14]=0.0f;
00101 rotate(quaRotation);
00102 };
00103
00107 ~Matrix()
00108 {
00109 };
00110
00111
00116 void Set(const float *pElements)
00117 {
00118 memcpy((void*)m_vfElements.m_vfElements16, (void *)pElements, 16*sizeof(float));
00119 };
00120
00124 void clearMatrix()
00125 {
00126 m_vfElements.m_vfElements16[0]=m_vfElements.m_vfElements16[5]=m_vfElements.m_vfElements16[10]=m_vfElements.m_vfElements16[15]=1.0f;
00127 m_vfElements.m_vfElements16[1]=m_vfElements.m_vfElements16[2]=m_vfElements.m_vfElements16[3]=m_vfElements.m_vfElements16[4]=m_vfElements.m_vfElements16[6]=m_vfElements.m_vfElements16[7]=m_vfElements.m_vfElements16[8]=m_vfElements.m_vfElements16[9]=m_vfElements.m_vfElements16[11]=m_vfElements.m_vfElements16[12]=m_vfElements.m_vfElements16[13]=m_vfElements.m_vfElements16[14]=0.0f;
00128 };
00129
00134 const float * Get() const
00135 {
00136 return (float *) m_vfElements.m_vfElements16;
00137 };
00138
00139
00145 void Set(const unsigned int i, const unsigned int j, const float & fValue)
00146 {
00147 m_vfElements.m_vfElements44[i][j] = fValue;
00148 };
00149
00150
00157 const float & Get(const unsigned int i, const unsigned int j) const
00158 {
00159 return m_vfElements.m_vfElements44[i][j];
00160 };
00161
00162
00168 const float & Get(const unsigned int i) const
00169 {
00170 return m_vfElements.m_vfElements16[i];
00171 };
00172
00173
00179 void SetRow(const unsigned int i, const float vfValues[4])
00180 {
00181 m_vfElements.m_vfElements16[ i+0] = vfValues[0];
00182 m_vfElements.m_vfElements16[ i+4] = vfValues[1];
00183 m_vfElements.m_vfElements16[ i+8] = vfValues[2];
00184 m_vfElements.m_vfElements16[i+12] = vfValues[3];
00185 };
00186
00192 void SetColumn(const unsigned int i, const float vfValues[4])
00193 {
00194 m_vfElements.m_vfElements16[i*4+0] = vfValues[0];
00195 m_vfElements.m_vfElements16[i*4+1] = vfValues[1];
00196 m_vfElements.m_vfElements16[i*4+2] = vfValues[2];
00197 m_vfElements.m_vfElements16[i*4+3] = vfValues[3];
00198 };
00199
00200
00206 void SetRow(const unsigned int i, const Vector & vecVector)
00207 {
00208 m_vfElements.m_vfElements16[ i+0] = vecVector.GetX();
00209 m_vfElements.m_vfElements16[ i+4] = vecVector.GetY();
00210 m_vfElements.m_vfElements16[ i+8] = vecVector.GetZ();
00211 };
00212
00213
00219 void SetColumn(const unsigned int i, const Vector & vecVector)
00220 {
00221 m_vfElements.m_vfElements16[i*4+0] = vecVector.GetX();
00222 m_vfElements.m_vfElements16[i*4+1] = vecVector.GetY();
00223 m_vfElements.m_vfElements16[i*4+2] = vecVector.GetZ();
00224 };
00225
00226 float & operator()(const unsigned int i, const unsigned int j)
00227 {
00228 return m_vfElements.m_vfElements44[i][j];
00229 };
00230
00231 const float & operator()(const unsigned int i, const unsigned int j) const
00232 {
00233 return m_vfElements.m_vfElements44[i][j];
00234 };
00235
00236
00241 void SetTranslation(const Vector & vecTranslation)
00242 {
00243 m_vfElements.m_vfElements16[12] = vecTranslation.GetX();
00244 m_vfElements.m_vfElements16[13] = vecTranslation.GetY();
00245 m_vfElements.m_vfElements16[14] = vecTranslation.GetZ();
00246 m_vfElements.m_vfElements16[15] = 1.0f;
00247 };
00248
00249
00254 const Vector GetTranslation() const
00255 {
00256 return Vector(m_vfElements.m_vfElements16[12],m_vfElements.m_vfElements16[13],m_vfElements.m_vfElements16[14]);
00257 };
00258
00259
00264 const Quaternion GetRotation() const
00265 {
00266 const float fTrace = m_vfElements.m_vfElements16[0] + m_vfElements.m_vfElements16[5] + m_vfElements.m_vfElements16[10] + 1.0f;
00267
00268 if (fTrace > 0.0f)
00269 {
00270 const float fS = 0.5f / sqrt(fTrace);
00271 const float fW = 0.25f / fS;
00272 const float fX = ( m_vfElements.m_vfElements16[6] - m_vfElements.m_vfElements16[9] ) * fS;
00273 const float fY = ( m_vfElements.m_vfElements16[8] - m_vfElements.m_vfElements16[2] ) * fS;
00274 const float fZ = ( m_vfElements.m_vfElements16[1] - m_vfElements.m_vfElements16[4] ) * fS;
00275 return Quaternion(Vector(fX,fY,fZ).GetNormalized(),fW);
00276 }
00277 else
00278 {
00279 const float fMaximum = max(m_vfElements.m_vfElements44[0][0],max(m_vfElements.m_vfElements44[1][1],m_vfElements.m_vfElements44[2][2]));
00280
00281
00282 if (fMaximum == m_vfElements.m_vfElements44[0][0])
00283 {
00284 const float fS = sqrtf( 1.0f + m_vfElements.m_vfElements16[0] - m_vfElements.m_vfElements16[5] - m_vfElements.m_vfElements16[10] ) * 2.0f;
00285 const float fX = 0.5f / fS;
00286 const float fY = (m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[1] ) / fS;
00287 const float fZ = (m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[2] ) / fS;
00288 const float fW = (m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[6] ) / fS;
00289 return Quaternion(Vector(fX,fY,fZ).GetNormalized(),fW);
00290 }
00291 else if (fMaximum == m_vfElements.m_vfElements44[1][1])
00292 {
00293 const float fS = sqrtf( 1.0f + m_vfElements.m_vfElements16[5] - m_vfElements.m_vfElements16[0] - m_vfElements.m_vfElements16[10] ) * 2.0f;
00294 const float fX = (m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[1] ) / fS;
00295 const float fY = 0.5f / fS;
00296 const float fZ = (m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[6] ) / fS;
00297 const float fW = (m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[2] ) / fS;
00298 return Quaternion(Vector(fX,fY,fZ).GetNormalized(),fW);
00299 }
00300 else
00301 {
00302 const float fS = sqrtf( 1.0f + m_vfElements.m_vfElements16[10] - m_vfElements.m_vfElements16[0] - m_vfElements.m_vfElements16[5] ) * 2.0f;
00303 const float fX = (m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[2] ) / fS;
00304 const float fY = (m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[6] ) / fS;
00305 const float fZ = 0.5f / fS;
00306 const float fW = (m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[1] ) / fS;
00307 return Quaternion(Vector(fX,fY,fZ).GetNormalized(),fW);
00308 }
00309 }
00310 };
00311
00312
00318 const Matrix GetTranslated(const Vector & vecTranslation) const
00319 {
00320 return (*this) * Matrix(1.0f,0.0f,0.0f,vecTranslation.GetX(), 0.0f,1.0f,0.0f,vecTranslation.GetY(), 0.0f,0.0f,1.0f,vecTranslation.GetZ(), 0.0f, 0.0f,0.0f,1.0f);
00321 };
00322
00327 void translate(const Vector &vecTranslation)
00328 {
00329 *this = GetTranslated(vecTranslation);
00330 };
00331
00332
00338 const Matrix GetScaled(const Vector &vecScale) const
00339 {
00340 return (*this) * Matrix( vecScale.GetX(),0.0f,0.0f,0.0f, 0.0f,vecScale.GetY(),0.0f,0.0f, 0.0f,0.0f,vecScale.GetZ(),0.0f, 0.0f,0.0f,0.0f,1.0f);
00341 };
00342
00343
00348 void scale(const Vector &vecScale)
00349 {
00350 *this = GetScaled(vecScale);
00351 };
00352
00353
00359 const Matrix GetRotated(const Quaternion & quaRotation) const
00360 {
00361 const float fXX = quaRotation.GetVector().GetX() * quaRotation.GetVector().GetX();
00362 const float fXY = quaRotation.GetVector().GetX() * quaRotation.GetVector().GetY();
00363 const float fXZ = quaRotation.GetVector().GetX() * quaRotation.GetVector().GetZ();
00364 const float fXW = quaRotation.GetVector().GetX() * quaRotation.GetScalar();
00365 const float fYY = quaRotation.GetVector().GetY() * quaRotation.GetVector().GetY();
00366 const float fYZ = quaRotation.GetVector().GetY() * quaRotation.GetVector().GetZ();
00367 const float fYW = quaRotation.GetVector().GetY() * quaRotation.GetScalar();
00368 const float fZZ = quaRotation.GetVector().GetZ() * quaRotation.GetVector().GetZ();
00369 const float fZW = quaRotation.GetVector().GetZ() * quaRotation.GetScalar();
00370
00371 return (*this) * Matrix(1.0f - 2.0f * (fYY + fZZ), 2.0f * (fXY - fZW), 2.0f * (fXZ + fYW), 0.0f, 2.0f * (fXY + fZW), 1.0f - 2.0f * (fXX + fZZ), 2.0f * (fYZ - fXW), 0.0f, 2.0f * (fXZ - fYW), 2.0f * (fYZ + fXW), 1.0f - 2.0f * (fXX + fYY), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
00372 };
00373
00374
00379 void rotate(const Quaternion & quaRotation)
00380 {
00381 *this = GetRotated(quaRotation);
00382 };
00383
00384
00389 const Matrix GetInverse() const
00390 {
00391 const float fTmp1 = m_vfElements.m_vfElements44[2][2]*m_vfElements.m_vfElements44[3][3];
00392 const float fTmp2 = m_vfElements.m_vfElements44[0][1]*fTmp1;
00393 const float fTmp4 = m_vfElements.m_vfElements44[2][3]*m_vfElements.m_vfElements44[3][2];
00394 const float fTmp5 = m_vfElements.m_vfElements44[0][1]*fTmp4;
00395 const float fTmp6 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[3][3];
00396 const float fTmp7 = m_vfElements.m_vfElements44[2][1]*fTmp6;
00397 const float fTmp8 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[3][2];
00398 const float fTmp9 = m_vfElements.m_vfElements44[2][1]*fTmp8;
00399 const float fTmp11 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[2][3];
00400 const float fTmp12 = m_vfElements.m_vfElements44[3][1]*fTmp11;
00401 const float fTmp14 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[2][2];
00402 const float fTmp15 = m_vfElements.m_vfElements44[3][1]*fTmp14;
00403 const float fTmp17 = m_vfElements.m_vfElements44[1][1]*fTmp1;
00404 const float fTmp19 = m_vfElements.m_vfElements44[1][1]*fTmp4;
00405 const float fTmp22 = m_vfElements.m_vfElements44[1][2]*m_vfElements.m_vfElements44[3][3];
00406 const float fTmp23 = m_vfElements.m_vfElements44[2][1]*fTmp22;
00407 const float fTmp26 = m_vfElements.m_vfElements44[1][3]*m_vfElements.m_vfElements44[3][2];
00408 const float fTmp27 = m_vfElements.m_vfElements44[2][1]*fTmp26;
00409 const float fTmp29 = m_vfElements.m_vfElements44[1][2]*m_vfElements.m_vfElements44[2][3];
00410 const float fTmp30 = m_vfElements.m_vfElements44[3][1]*fTmp29;
00411 const float fTmp32 = m_vfElements.m_vfElements44[1][3]*m_vfElements.m_vfElements44[2][2];
00412 const float fTmp33 = m_vfElements.m_vfElements44[3][1]*fTmp32;
00413 const float fTmp48 = m_vfElements.m_vfElements44[0][1]*fTmp22;
00414 const float fTmp50 = m_vfElements.m_vfElements44[0][1]*fTmp26;
00415 const float fTmp53 = m_vfElements.m_vfElements44[1][1]*fTmp6;
00416 const float fTmp56 = m_vfElements.m_vfElements44[1][1]*fTmp8;
00417 const float fTmp58 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[1][3];
00418 const float fTmp59 = m_vfElements.m_vfElements44[3][1]*fTmp58;
00419 const float fTmp61 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[1][2];
00420 const float fTmp62 = m_vfElements.m_vfElements44[3][1]*fTmp61;
00421 const float fTmp66 = m_vfElements.m_vfElements44[0][1]*fTmp29;
00422 const float fTmp69 = m_vfElements.m_vfElements44[0][1]*fTmp32;
00423 const float fTmp71 = m_vfElements.m_vfElements44[1][1]*fTmp11;
00424 const float fTmp73 = m_vfElements.m_vfElements44[1][1]*fTmp14;
00425 const float fTmp76 = m_vfElements.m_vfElements44[2][1]*fTmp58;
00426 const float fTmp79 = m_vfElements.m_vfElements44[2][1]*fTmp61;
00427 const float fTmp84 = 1.0f/(m_vfElements.m_vfElements44[0][0]*fTmp17-m_vfElements.m_vfElements44[0][0]*fTmp19-m_vfElements.m_vfElements44[0][0]*fTmp23+m_vfElements.m_vfElements44[0][0]*fTmp27+m_vfElements.m_vfElements44[0][0]*fTmp30-m_vfElements.m_vfElements44[0][0]*fTmp33-m_vfElements.m_vfElements44[1][0]*fTmp2+m_vfElements.m_vfElements44[1][0]*fTmp5+m_vfElements.m_vfElements44[1][0]*fTmp7-m_vfElements.m_vfElements44[1][0]*fTmp9-m_vfElements.m_vfElements44[1][0]*fTmp12+m_vfElements.m_vfElements44[1][0]*fTmp15+m_vfElements.m_vfElements44[2][0]*fTmp48-m_vfElements.m_vfElements44[2][0]*fTmp50-m_vfElements.m_vfElements44[2][0]*fTmp53+m_vfElements.m_vfElements44[2][0]*fTmp56+m_vfElements.m_vfElements44[2][0]*fTmp59-m_vfElements.m_vfElements44[2][0]*fTmp62-m_vfElements.m_vfElements44[3][0]*fTmp66+m_vfElements.m_vfElements44[3][0]*fTmp69+m_vfElements.m_vfElements44[3][0]*fTmp71-m_vfElements.m_vfElements44[3][0]*fTmp73-m_vfElements.m_vfElements44[3][0]*fTmp76+m_vfElements.m_vfElements44[3][0]*fTmp79);
00428 const float fTmp116 = m_vfElements.m_vfElements44[2][1]*m_vfElements.m_vfElements44[3][2];
00429 const float fTmp118 = m_vfElements.m_vfElements44[2][2]*m_vfElements.m_vfElements44[3][1];
00430 const float fTmp121 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[3][2];
00431 const float fTmp124 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[3][1];
00432 const float fTmp126 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[2][2];
00433 const float fTmp128 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[2][1];
00434 const float fTmp133 = m_vfElements.m_vfElements44[2][1]*m_vfElements.m_vfElements44[3][3];
00435 const float fTmp135 = m_vfElements.m_vfElements44[2][3]*m_vfElements.m_vfElements44[3][1];
00436 const float fTmp138 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[3][3];
00437 const float fTmp141 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[3][1];
00438 const float fTmp143 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[2][3];
00439 const float fTmp145 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[2][1];
00440 const float fTmp151 = m_vfElements.m_vfElements44[1][1]*m_vfElements.m_vfElements44[2][2];
00441 const float fTmp153 = m_vfElements.m_vfElements44[1][2]*m_vfElements.m_vfElements44[2][1];
00442 const float fTmp159 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[1][2];
00443 const float fTmp161 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[1][1];
00444 const float fTmp166 = m_vfElements.m_vfElements44[1][1]*m_vfElements.m_vfElements44[3][3];
00445 const float fTmp168 = m_vfElements.m_vfElements44[1][3]*m_vfElements.m_vfElements44[3][1];
00446 const float fTmp174 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[1][3];
00447 const float fTmp176 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[1][1];
00448 const float fTmp187 = m_vfElements.m_vfElements44[1][1]*m_vfElements.m_vfElements44[2][3];
00449 const float fTmp189 = m_vfElements.m_vfElements44[1][3]*m_vfElements.m_vfElements44[2][1];
00450 const float fTmp212 = m_vfElements.m_vfElements44[1][1]*m_vfElements.m_vfElements44[3][2];
00451 const float fTmp214 = m_vfElements.m_vfElements44[1][2]*m_vfElements.m_vfElements44[3][1];
00452
00453 Matrix matNew;
00454 matNew.m_vfElements.m_vfElements44[0][1] = (-fTmp2+fTmp5+fTmp7-fTmp9-fTmp12+fTmp15)*fTmp84;
00455 matNew.m_vfElements.m_vfElements44[0][2] = -(-fTmp48+fTmp50+fTmp53-fTmp56-fTmp59+fTmp62)*fTmp84;
00456 matNew.m_vfElements.m_vfElements44[1][2] = -(m_vfElements.m_vfElements44[0][0]*fTmp22-m_vfElements.m_vfElements44[0][0]*fTmp26-m_vfElements.m_vfElements44[1][0]*fTmp6+m_vfElements.m_vfElements44[1][0]*fTmp8+m_vfElements.m_vfElements44[3][0]*fTmp58-m_vfElements.m_vfElements44[3][0]*fTmp61)*fTmp84;
00457 matNew.m_vfElements.m_vfElements44[1][3] = -(-m_vfElements.m_vfElements44[0][0]*fTmp29+m_vfElements.m_vfElements44[0][0]*fTmp32+m_vfElements.m_vfElements44[1][0]*fTmp11-m_vfElements.m_vfElements44[1][0]*fTmp14-m_vfElements.m_vfElements44[2][0]*fTmp58+m_vfElements.m_vfElements44[2][0]*fTmp61)*fTmp84;
00458 matNew.m_vfElements.m_vfElements44[3][1] = (m_vfElements.m_vfElements44[0][0]*fTmp116-m_vfElements.m_vfElements44[0][0]*fTmp118-m_vfElements.m_vfElements44[2][0]*fTmp121+m_vfElements.m_vfElements44[2][0]*fTmp124+m_vfElements.m_vfElements44[3][0]*fTmp126-m_vfElements.m_vfElements44[3][0]*fTmp128)*fTmp84;
00459 matNew.m_vfElements.m_vfElements44[2][1] = -(m_vfElements.m_vfElements44[0][0]*fTmp133-m_vfElements.m_vfElements44[0][0]*fTmp135-m_vfElements.m_vfElements44[2][0]*fTmp138+m_vfElements.m_vfElements44[2][0]*fTmp141+m_vfElements.m_vfElements44[3][0]*fTmp143-m_vfElements.m_vfElements44[3][0]*fTmp145)*fTmp84;
00460 matNew.m_vfElements.m_vfElements44[3][3] = (m_vfElements.m_vfElements44[0][0]*fTmp151-m_vfElements.m_vfElements44[0][0]*fTmp153-m_vfElements.m_vfElements44[1][0]*fTmp126+m_vfElements.m_vfElements44[1][0]*fTmp128+m_vfElements.m_vfElements44[2][0]*fTmp159-m_vfElements.m_vfElements44[2][0]*fTmp161)*fTmp84;
00461 matNew.m_vfElements.m_vfElements44[2][2] = (m_vfElements.m_vfElements44[0][0]*fTmp166-m_vfElements.m_vfElements44[0][0]*fTmp168-m_vfElements.m_vfElements44[1][0]*fTmp138+m_vfElements.m_vfElements44[1][0]*fTmp141+m_vfElements.m_vfElements44[3][0]*fTmp174-m_vfElements.m_vfElements44[3][0]*fTmp176)*fTmp84;
00462 matNew.m_vfElements.m_vfElements44[2][0] = (m_vfElements.m_vfElements44[1][0]*fTmp133-m_vfElements.m_vfElements44[1][0]*fTmp135-m_vfElements.m_vfElements44[2][0]*fTmp166+m_vfElements.m_vfElements44[2][0]*fTmp168+m_vfElements.m_vfElements44[3][0]*fTmp187-m_vfElements.m_vfElements44[3][0]*fTmp189)*fTmp84;
00463 matNew.m_vfElements.m_vfElements44[1][0] = -(m_vfElements.m_vfElements44[1][0]*fTmp1-m_vfElements.m_vfElements44[1][0]*fTmp4-m_vfElements.m_vfElements44[2][0]*fTmp22+m_vfElements.m_vfElements44[2][0]*fTmp26+m_vfElements.m_vfElements44[3][0]*fTmp29-m_vfElements.m_vfElements44[3][0]*fTmp32)*fTmp84;
00464 matNew.m_vfElements.m_vfElements44[0][3] = -(fTmp66-fTmp69-fTmp71+fTmp73+fTmp76-fTmp79)*fTmp84;
00465 matNew.m_vfElements.m_vfElements44[3][2] = -(m_vfElements.m_vfElements44[0][0]*fTmp212-m_vfElements.m_vfElements44[0][0]*fTmp214-m_vfElements.m_vfElements44[1][0]*fTmp121+m_vfElements.m_vfElements44[1][0]*fTmp124+m_vfElements.m_vfElements44[3][0]*fTmp159-m_vfElements.m_vfElements44[3][0]*fTmp161)*fTmp84;
00466 matNew.m_vfElements.m_vfElements44[0][0] = (fTmp17-fTmp19-fTmp23+fTmp27+fTmp30-fTmp33)*fTmp84;
00467 matNew.m_vfElements.m_vfElements44[2][3] = -(m_vfElements.m_vfElements44[0][0]*fTmp187-m_vfElements.m_vfElements44[0][0]*fTmp189-m_vfElements.m_vfElements44[1][0]*fTmp143+m_vfElements.m_vfElements44[1][0]*fTmp145+m_vfElements.m_vfElements44[2][0]*fTmp174-m_vfElements.m_vfElements44[2][0]*fTmp176)*fTmp84;
00468 matNew.m_vfElements.m_vfElements44[3][0] = -(m_vfElements.m_vfElements44[1][0]*fTmp116-m_vfElements.m_vfElements44[1][0]*fTmp118-m_vfElements.m_vfElements44[2][0]*fTmp212+m_vfElements.m_vfElements44[2][0]*fTmp214+m_vfElements.m_vfElements44[3][0]*fTmp151-m_vfElements.m_vfElements44[3][0]*fTmp153)*fTmp84;
00469 matNew.m_vfElements.m_vfElements44[1][1] = (m_vfElements.m_vfElements44[0][0]*fTmp1-m_vfElements.m_vfElements44[0][0]*fTmp4-m_vfElements.m_vfElements44[2][0]*fTmp6+m_vfElements.m_vfElements44[2][0]*fTmp8+m_vfElements.m_vfElements44[3][0]*fTmp11-m_vfElements.m_vfElements44[3][0]*fTmp14)*fTmp84;
00470
00471 return matNew;
00472 };
00473
00474
00478 void invert()
00479 {
00480 (*this) = GetInverse();
00481 }
00482
00487 const Matrix GetTransposed() const
00488 {
00489 return Matrix(
00490 m_vfElements.m_vfElements16[0],m_vfElements.m_vfElements16[1],m_vfElements.m_vfElements16[2],m_vfElements.m_vfElements16[3],
00491 m_vfElements.m_vfElements16[4],m_vfElements.m_vfElements16[5],m_vfElements.m_vfElements16[6],m_vfElements.m_vfElements16[7],
00492 m_vfElements.m_vfElements16[8],m_vfElements.m_vfElements16[9],m_vfElements.m_vfElements16[10],m_vfElements.m_vfElements16[11],
00493 m_vfElements.m_vfElements16[12],m_vfElements.m_vfElements16[13],m_vfElements.m_vfElements16[14],m_vfElements.m_vfElements16[15]);
00494 };
00495
00496
00500 void transpose()
00501 {
00502 (*this) = GetTransposed();
00503 };
00504
00505
00511 const Vector GetRotated(const Vector & vecOther) const
00512 {
00513 return Vector(
00514 (m_vfElements.m_vfElements16[0]*vecOther.GetX() + m_vfElements.m_vfElements16[4]*vecOther.GetY() + m_vfElements.m_vfElements16[8]*vecOther.GetZ()),
00515 (m_vfElements.m_vfElements16[1]*vecOther.GetX() + m_vfElements.m_vfElements16[5]*vecOther.GetY() + m_vfElements.m_vfElements16[9]*vecOther.GetZ()),
00516 (m_vfElements.m_vfElements16[2]*vecOther.GetX() + m_vfElements.m_vfElements16[6]*vecOther.GetY() + m_vfElements.m_vfElements16[10]*vecOther.GetZ()));
00517 };
00518
00519 const bool operator==(const Matrix & matOther) const
00520 {
00521 for (unsigned int i=0;i < 16; i++)
00522 {
00523 if (m_vfElements.m_vfElements16[i] != matOther.m_vfElements.m_vfElements16[i])
00524 return false;
00525 }
00526
00527 return true;
00528 };
00529
00530 const bool operator!=(const Matrix & matOther) const
00531 {
00532 return !(*this == matOther);
00533 };
00534
00535 const Matrix operator*(const Matrix & matOther) const
00536 {
00537 return Matrix(
00538 m_vfElements.m_vfElements16[0]*matOther.m_vfElements.m_vfElements16[0] + m_vfElements.m_vfElements16[4]*matOther.m_vfElements.m_vfElements16[1] + m_vfElements.m_vfElements16[8]*matOther.m_vfElements.m_vfElements16[2] + m_vfElements.m_vfElements16[12]*matOther.m_vfElements.m_vfElements16[3],
00539 m_vfElements.m_vfElements16[0]*matOther.m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[4]*matOther.m_vfElements.m_vfElements16[5] + m_vfElements.m_vfElements16[8]*matOther.m_vfElements.m_vfElements16[6] + m_vfElements.m_vfElements16[12]*matOther.m_vfElements.m_vfElements16[7],
00540 m_vfElements.m_vfElements16[0]*matOther.m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[4]*matOther.m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[8]*matOther.m_vfElements.m_vfElements16[10] + m_vfElements.m_vfElements16[12]*matOther.m_vfElements.m_vfElements16[11],
00541 m_vfElements.m_vfElements16[0]*matOther.m_vfElements.m_vfElements16[12] + m_vfElements.m_vfElements16[4]*matOther.m_vfElements.m_vfElements16[13] + m_vfElements.m_vfElements16[8]*matOther.m_vfElements.m_vfElements16[14] + m_vfElements.m_vfElements16[12]*matOther.m_vfElements.m_vfElements16[15],
00542
00543 m_vfElements.m_vfElements16[1]*matOther.m_vfElements.m_vfElements16[0] + m_vfElements.m_vfElements16[5]*matOther.m_vfElements.m_vfElements16[1] + m_vfElements.m_vfElements16[9]*matOther.m_vfElements.m_vfElements16[2] + m_vfElements.m_vfElements16[13]*matOther.m_vfElements.m_vfElements16[3],
00544 m_vfElements.m_vfElements16[1]*matOther.m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[5]*matOther.m_vfElements.m_vfElements16[5] + m_vfElements.m_vfElements16[9]*matOther.m_vfElements.m_vfElements16[6] + m_vfElements.m_vfElements16[13]*matOther.m_vfElements.m_vfElements16[7],
00545 m_vfElements.m_vfElements16[1]*matOther.m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[5]*matOther.m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[9]*matOther.m_vfElements.m_vfElements16[10] + m_vfElements.m_vfElements16[13]*matOther.m_vfElements.m_vfElements16[11],
00546 m_vfElements.m_vfElements16[1]*matOther.m_vfElements.m_vfElements16[12] + m_vfElements.m_vfElements16[5]*matOther.m_vfElements.m_vfElements16[13] + m_vfElements.m_vfElements16[9]*matOther.m_vfElements.m_vfElements16[14] + m_vfElements.m_vfElements16[13]*matOther.m_vfElements.m_vfElements16[15],
00547
00548 m_vfElements.m_vfElements16[2]*matOther.m_vfElements.m_vfElements16[0] + m_vfElements.m_vfElements16[6]*matOther.m_vfElements.m_vfElements16[1] + m_vfElements.m_vfElements16[10]*matOther.m_vfElements.m_vfElements16[2] + m_vfElements.m_vfElements16[14]*matOther.m_vfElements.m_vfElements16[3],
00549 m_vfElements.m_vfElements16[2]*matOther.m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[6]*matOther.m_vfElements.m_vfElements16[5] + m_vfElements.m_vfElements16[10]*matOther.m_vfElements.m_vfElements16[6] + m_vfElements.m_vfElements16[14]*matOther.m_vfElements.m_vfElements16[7],
00550 m_vfElements.m_vfElements16[2]*matOther.m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[6]*matOther.m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[10]*matOther.m_vfElements.m_vfElements16[10] + m_vfElements.m_vfElements16[14]*matOther.m_vfElements.m_vfElements16[11],
00551 m_vfElements.m_vfElements16[2]*matOther.m_vfElements.m_vfElements16[12] + m_vfElements.m_vfElements16[6]*matOther.m_vfElements.m_vfElements16[13] + m_vfElements.m_vfElements16[10]*matOther.m_vfElements.m_vfElements16[14] + m_vfElements.m_vfElements16[14]*matOther.m_vfElements.m_vfElements16[15],
00552
00553 m_vfElements.m_vfElements16[3]*matOther.m_vfElements.m_vfElements16[0] + m_vfElements.m_vfElements16[7]*matOther.m_vfElements.m_vfElements16[1] + m_vfElements.m_vfElements16[11]*matOther.m_vfElements.m_vfElements16[2] + m_vfElements.m_vfElements16[15]*matOther.m_vfElements.m_vfElements16[3],
00554 m_vfElements.m_vfElements16[3]*matOther.m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[7]*matOther.m_vfElements.m_vfElements16[5] + m_vfElements.m_vfElements16[11]*matOther.m_vfElements.m_vfElements16[6] + m_vfElements.m_vfElements16[15]*matOther.m_vfElements.m_vfElements16[7],
00555 m_vfElements.m_vfElements16[3]*matOther.m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[7]*matOther.m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[11]*matOther.m_vfElements.m_vfElements16[10] + m_vfElements.m_vfElements16[15]*matOther.m_vfElements.m_vfElements16[11],
00556 m_vfElements.m_vfElements16[3]*matOther.m_vfElements.m_vfElements16[12] + m_vfElements.m_vfElements16[7]*matOther.m_vfElements.m_vfElements16[13] + m_vfElements.m_vfElements16[11]*matOther.m_vfElements.m_vfElements16[14] + m_vfElements.m_vfElements16[15]*matOther.m_vfElements.m_vfElements16[15] );
00557 };
00558
00559 const Matrix & operator*=(const Matrix & matOther)
00560 {
00561 *this = (*this) * matOther;
00562 return *this;
00563 };
00564
00565 const Vector operator* (const Vector &vecOther) const
00566 {
00567 const float fW = m_vfElements.m_vfElements16[3]*vecOther.GetX() + m_vfElements.m_vfElements16[7]*vecOther.GetY() + m_vfElements.m_vfElements16[11]*vecOther.GetZ() + m_vfElements.m_vfElements16[15];
00568 return Vector(
00569 (m_vfElements.m_vfElements16[0]*vecOther.GetX() + m_vfElements.m_vfElements16[4]*vecOther.GetY() + m_vfElements.m_vfElements16[8]*vecOther.GetZ() + m_vfElements.m_vfElements16[12]) / fW,
00570 (m_vfElements.m_vfElements16[1]*vecOther.GetX() + m_vfElements.m_vfElements16[5]*vecOther.GetY() + m_vfElements.m_vfElements16[9]*vecOther.GetZ() + m_vfElements.m_vfElements16[13]) / fW,
00571 (m_vfElements.m_vfElements16[2]*vecOther.GetX() + m_vfElements.m_vfElements16[6]*vecOther.GetY() + m_vfElements.m_vfElements16[10]*vecOther.GetZ() + m_vfElements.m_vfElements16[14]) / fW );
00572 };
00573
00574 private:
00575
00576 union
00577 {
00578 float m_vfElements16[16];
00579 float m_vfElements44[4][4];
00580 } m_vfElements;
00581 };
00582
00583 inline std::ostream & operator << (std::ostream & os, const Matrix & matMatrix)
00584 {
00585 os << "((" << matMatrix.Get(0,0) << ";" << matMatrix.Get(0,1) << ";" << matMatrix.Get(0,2) << ";" << matMatrix.Get(0,3) << ")" << ";"
00586 << "(" << matMatrix.Get(1,0) << ";" << matMatrix.Get(1,1) << ";" << matMatrix.Get(1,2) << ";" << matMatrix.Get(1,3) << ")" << ";"
00587 << "(" << matMatrix.Get(2,0) << ";" << matMatrix.Get(2,1) << ";" << matMatrix.Get(2,2) << ";" << matMatrix.Get(2,3) << ")" << ";"
00588 << "(" << matMatrix.Get(3,0) << ";" << matMatrix.Get(3,1) << ";" << matMatrix.Get(3,2) << ";" << matMatrix.Get(3,3) << "))";
00589 return os;
00590 }
00591
00592 inline std::istream & operator>> (std::istream & is, Matrix & matMatrix)
00593 {
00594 float f00, f01, f02, f03;
00595 float f10, f11, f12, f13;
00596 float f20, f21, f22, f23;
00597 float f30, f31, f32, f33;
00598
00599 if (is
00600 >> eat ("(")
00601 >> eat("(") >> f00 >> eat(";") >> f01 >> eat(";") >> f02 >> eat(";") >> f03 >> eat(")") >> eat(";")
00602 >> eat("(") >> f10 >> eat(";") >> f11 >> eat(";") >> f12 >> eat(";") >> f13 >> eat(")") >> eat(";")
00603 >> eat("(") >> f20 >> eat(";") >> f21 >> eat(";") >> f22 >> eat(";") >> f23 >> eat(")") >> eat(";")
00604 >> eat("(") >> f30 >> eat(";") >> f31 >> eat(";") >> f32 >> eat(";") >> f33 >> eat(")")
00605 >> eat(")"))
00606 {
00607 matMatrix.Set(0,0,f00); matMatrix.Set(0,1,f01); matMatrix.Set(0,2,f02); matMatrix.Set(0,3,f03);
00608 matMatrix.Set(1,0,f10); matMatrix.Set(1,1,f11); matMatrix.Set(1,2,f12); matMatrix.Set(1,3,f13);
00609 matMatrix.Set(2,0,f20); matMatrix.Set(2,1,f21); matMatrix.Set(2,2,f22); matMatrix.Set(2,3,f23);
00610 matMatrix.Set(3,0,f30); matMatrix.Set(3,1,f31); matMatrix.Set(3,2,f32); matMatrix.Set(3,3,f33);
00611
00612 }
00613
00614 return is;
00615 }