00001 #pragma once
00002
00003 #define NO_MIN_MAX
00004
00005 #include <math.h>
00006 #include "VCommon.h"
00007 #include "VVector.h"
00008 #include "VQuaternion.h"
00009
00010
00011 class VMatrix
00012 {
00013 public:
00014
00015 VMatrix()
00016 {
00017 m_vfElements.m_vfElements16[0]=m_vfElements.m_vfElements16[5]=m_vfElements.m_vfElements16[10]=m_vfElements.m_vfElements16[15]=1.0f;
00018 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;
00019 };
00020
00021 VMatrix( const float & fElement0, const float & fElement4, const float & fElement8, const float & fElement12,
00022 const float & fElement1, const float & fElement5, const float & fElement9, const float & fElement13,
00023 const float & fElement2, const float & fElement6, const float & fElement10, const float & fElement14,
00024 const float & fElement3, const float & fElement7, const float & fElement11, const float & fElement15)
00025 {
00026 m_vfElements.m_vfElements16[0]=fElement0; m_vfElements.m_vfElements16[4]=fElement4; m_vfElements.m_vfElements16[8]=fElement8; m_vfElements.m_vfElements16[12]=fElement12;
00027 m_vfElements.m_vfElements16[1]=fElement1; m_vfElements.m_vfElements16[5]=fElement5; m_vfElements.m_vfElements16[9]=fElement9; m_vfElements.m_vfElements16[13]=fElement13;
00028 m_vfElements.m_vfElements16[2]=fElement2; m_vfElements.m_vfElements16[6]=fElement6; m_vfElements.m_vfElements16[10]=fElement10; m_vfElements.m_vfElements16[14]=fElement14;
00029 m_vfElements.m_vfElements16[3]=fElement3; m_vfElements.m_vfElements16[7]=fElement7; m_vfElements.m_vfElements16[11]=fElement11; m_vfElements.m_vfElements16[15]=fElement15;
00030 };
00031
00032 VMatrix(const VVector & vecOne, const VVector & vecTwo, const VVector & vecThree, const VVector & vecFour = VVector(0.0f,0.0f,0.0f))
00033 {
00034
00035 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;
00036 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;
00037 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;
00038 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;
00039 };
00040
00041 VMatrix(const float *pElements)
00042 {
00043 memcpy((void*)m_vfElements.m_vfElements16, (void *)pElements, 16*sizeof(float));
00044 };
00045
00046 VMatrix(const float vfElements[4][4])
00047 {
00048 memcpy((void*)m_vfElements.m_vfElements16, (void *)vfElements, 16*sizeof(float));
00049 };
00050
00051 VMatrix(const VQuaternion & quaRotation)
00052 {
00053 m_vfElements.m_vfElements16[0]=m_vfElements.m_vfElements16[5]=m_vfElements.m_vfElements16[10]=m_vfElements.m_vfElements16[15]=1.0f;
00054 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;
00055 rotate(quaRotation);
00056 };
00057
00058 VMatrix(const VVector axis, float angle)
00059 {
00060 float radangle = (angle) * 3.1415926535f / 180.0f;
00061 float rcos = cos(radangle);
00062 float rsin = sin(radangle);
00063 m_vfElements.m_vfElements44[0][0] = rcos + axis.getX() * axis.getX() * (1.0f - rcos);
00064 m_vfElements.m_vfElements44[1][0] = axis.getZ() * rsin + axis.getY() * axis.getX() * (1.0f - rcos);
00065 m_vfElements.m_vfElements44[2][0] = -axis.getY() * rsin + axis.getZ() * axis.getX() * (1.0f - rcos);
00066 m_vfElements.m_vfElements44[3][0] = 0.0f;
00067 m_vfElements.m_vfElements44[0][1] = -axis.getZ() * rsin + axis.getX() * axis.getY() * (1.0f - rcos);
00068 m_vfElements.m_vfElements44[1][1] = rcos + axis.getY() * axis.getY() * (1.0f - rcos);
00069 m_vfElements.m_vfElements44[2][1] = axis.getX() * rsin + axis.getZ() * axis.getY() * (1.0f - rcos);
00070 m_vfElements.m_vfElements44[3][1] = 0.0f;
00071 m_vfElements.m_vfElements44[0][2] = axis.getY() * rsin + axis.getX() * axis.getZ() * (1.0f - rcos);
00072 m_vfElements.m_vfElements44[1][2] = -axis.getX() * rsin + axis.getY() * axis.getZ() * (1.0f - rcos);
00073 m_vfElements.m_vfElements44[2][2] = rcos + axis.getZ() * axis.getZ() * (1.0f - rcos);
00074 m_vfElements.m_vfElements44[3][2] = 0.0f;
00075 m_vfElements.m_vfElements44[0][3] = 0.0f;
00076 m_vfElements.m_vfElements44[1][3] = 0.0f;
00077 m_vfElements.m_vfElements44[2][3] = 0.0f;
00078 m_vfElements.m_vfElements44[3][3] = 1.0f;
00079 }
00080
00081 ~VMatrix()
00082 {
00083 };
00084
00085 void set(const float *pElements)
00086 {
00087 memcpy((void*)m_vfElements.m_vfElements16, (void *)pElements, 16*sizeof(float));
00088 };
00089
00090 void clearMatrix()
00091 {
00092 m_vfElements.m_vfElements16[0]=m_vfElements.m_vfElements16[5]=m_vfElements.m_vfElements16[10]=m_vfElements.m_vfElements16[15]=1.0f;
00093 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;
00094 };
00095
00096 const float * get() const
00097 {
00098 return (float *) m_vfElements.m_vfElements16;
00099 };
00100
00101 void set(const unsigned int i, const unsigned int j, const float & fValue)
00102 {
00103 m_vfElements.m_vfElements44[i][j] = fValue;
00104 };
00105
00106 const float & get(const unsigned int i, const unsigned int j) const
00107 {
00108 return m_vfElements.m_vfElements44[i][j];
00109 };
00110
00111 const float & get(const unsigned int i) const
00112 {
00113 return m_vfElements.m_vfElements16[i];
00114 };
00115
00116 void setRow(const unsigned int i, const float vfValues[4])
00117 {
00118 m_vfElements.m_vfElements16[ i+0] = vfValues[0];
00119 m_vfElements.m_vfElements16[ i+4] = vfValues[1];
00120 m_vfElements.m_vfElements16[ i+8] = vfValues[2];
00121 m_vfElements.m_vfElements16[i+12] = vfValues[3];
00122 };
00123
00124 void setColumn(const unsigned int i, const float vfValues[4])
00125 {
00126 m_vfElements.m_vfElements16[i*4+0] = vfValues[0];
00127 m_vfElements.m_vfElements16[i*4+1] = vfValues[1];
00128 m_vfElements.m_vfElements16[i*4+2] = vfValues[2];
00129 m_vfElements.m_vfElements16[i*4+3] = vfValues[3];
00130 };
00131
00132 void setRow(const unsigned int i, const VVector & vecVector)
00133 {
00134 m_vfElements.m_vfElements16[ i+0] = vecVector.getX();
00135 m_vfElements.m_vfElements16[ i+4] = vecVector.getY();
00136 m_vfElements.m_vfElements16[ i+8] = vecVector.getZ();
00137 };
00138
00139 void setColumn(const unsigned int i, const VVector & vecVector)
00140 {
00141 m_vfElements.m_vfElements16[i*4+0] = vecVector.getX();
00142 m_vfElements.m_vfElements16[i*4+1] = vecVector.getY();
00143 m_vfElements.m_vfElements16[i*4+2] = vecVector.getZ();
00144 };
00145
00146 float & operator()(const unsigned int i, const unsigned int j)
00147 {
00148 return m_vfElements.m_vfElements44[i][j];
00149 };
00150
00151 const float & operator()(const unsigned int i, const unsigned int j) const
00152 {
00153 return m_vfElements.m_vfElements44[i][j];
00154 };
00155
00156 void setTranslation(const VVector & vecTranslation)
00157 {
00158 m_vfElements.m_vfElements16[12] = vecTranslation.getX();
00159 m_vfElements.m_vfElements16[13] = vecTranslation.getY();
00160 m_vfElements.m_vfElements16[14] = vecTranslation.getZ();
00161 m_vfElements.m_vfElements16[15] = 1.0f;
00162 };
00163
00164 const VVector getTranslation() const
00165 {
00166 return VVector(m_vfElements.m_vfElements16[12],m_vfElements.m_vfElements16[13],m_vfElements.m_vfElements16[14]);
00167 };
00168
00169 const VQuaternion getRotation() const
00170 {
00171 const float fTrace = m_vfElements.m_vfElements16[0] + m_vfElements.m_vfElements16[5] + m_vfElements.m_vfElements16[10] + 1.0f;
00172
00173 if (fTrace > 0.0f)
00174 {
00175 const float fS = 0.5f / sqrt(fTrace);
00176 const float fW = 0.25f / fS;
00177 const float fX = ( m_vfElements.m_vfElements16[6] - m_vfElements.m_vfElements16[9] ) * fS;
00178 const float fY = ( m_vfElements.m_vfElements16[8] - m_vfElements.m_vfElements16[2] ) * fS;
00179 const float fZ = ( m_vfElements.m_vfElements16[1] - m_vfElements.m_vfElements16[4] ) * fS;
00180 return VQuaternion(VVector(fX,fY,fZ).getNormalized(),fW);
00181 }
00182 else
00183 {
00184 float m1 = m_vfElements.m_vfElements44[0][0];
00185 float m2 = m_vfElements.m_vfElements44[1][1];
00186 float m3 = m_vfElements.m_vfElements44[2][2];
00187 float m4 = (m2 > m3)?m2:m3;
00188 const float fMaximum = (m1 > m4)?m1:m4;
00189
00190 if (fMaximum == m_vfElements.m_vfElements44[0][0])
00191 {
00192 const float fS = sqrtf( 1.0f + m_vfElements.m_vfElements16[0] - m_vfElements.m_vfElements16[5] - m_vfElements.m_vfElements16[10] ) * 2.0f;
00193 const float fX = 0.5f / fS;
00194 const float fY = (m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[1] ) / fS;
00195 const float fZ = (m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[2] ) / fS;
00196 const float fW = (m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[6] ) / fS;
00197 return VQuaternion(VVector(fX,fY,fZ).getNormalized(),fW);
00198 }
00199 else if (fMaximum == m_vfElements.m_vfElements44[1][1])
00200 {
00201 const float fS = sqrtf( 1.0f + m_vfElements.m_vfElements16[5] - m_vfElements.m_vfElements16[0] - m_vfElements.m_vfElements16[10] ) * 2.0f;
00202 const float fX = (m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[1] ) / fS;
00203 const float fY = 0.5f / fS;
00204 const float fZ = (m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[6] ) / fS;
00205 const float fW = (m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[2] ) / fS;
00206 return VQuaternion(VVector(fX,fY,fZ).getNormalized(),fW);
00207 }
00208 else
00209 {
00210 const float fS = sqrtf( 1.0f + m_vfElements.m_vfElements16[10] - m_vfElements.m_vfElements16[0] - m_vfElements.m_vfElements16[5] ) * 2.0f;
00211 const float fX = (m_vfElements.m_vfElements16[8] + m_vfElements.m_vfElements16[2] ) / fS;
00212 const float fY = (m_vfElements.m_vfElements16[9] + m_vfElements.m_vfElements16[6] ) / fS;
00213 const float fZ = 0.5f / fS;
00214 const float fW = (m_vfElements.m_vfElements16[4] + m_vfElements.m_vfElements16[1] ) / fS;
00215 return VQuaternion(VVector(fX,fY,fZ).getNormalized(),fW);
00216 }
00217 }
00218 };
00219
00220 const VMatrix getTranslated(const VVector & vecTranslation) const
00221 {
00222 return (*this) * VMatrix(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);
00223 };
00224
00225 void translate(const VVector &vecTranslation)
00226 {
00227 *this = getTranslated(vecTranslation);
00228 };
00229
00230 const VMatrix getScaled(const VVector &vecScale) const
00231 {
00232 return (*this) * VMatrix( 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);
00233 };
00234
00235 void scale(const VVector &vecScale)
00236 {
00237 *this = getScaled(vecScale);
00238 };
00239
00240 VMatrix getRotated(const VQuaternion & quaRotation)
00241 {
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 const float fXX = quaRotation.getVector().getX() * quaRotation.getVector().getX();
00265 const float fXY = quaRotation.getVector().getX() * quaRotation.getVector().getY();
00266 const float fXZ = quaRotation.getVector().getX() * quaRotation.getVector().getZ();
00267 const float fXW = quaRotation.getVector().getX() * quaRotation.getScalar();
00268 const float fYY = quaRotation.getVector().getY() * quaRotation.getVector().getY();
00269 const float fYZ = quaRotation.getVector().getY() * quaRotation.getVector().getZ();
00270 const float fYW = quaRotation.getVector().getY() * quaRotation.getScalar();
00271 const float fZZ = quaRotation.getVector().getZ() * quaRotation.getVector().getZ();
00272 const float fZW = quaRotation.getVector().getZ() * quaRotation.getScalar();
00273
00274 return (*this) * VMatrix(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);
00275
00276
00277 };
00278
00279 void rotate(const VQuaternion & quaRotation)
00280 {
00281 *this = getRotated(quaRotation);
00282 };
00283
00284 const VMatrix getInverse() const
00285 {
00286 const float fTmp1 = m_vfElements.m_vfElements44[2][2]*m_vfElements.m_vfElements44[3][3];
00287 const float fTmp2 = m_vfElements.m_vfElements44[0][1]*fTmp1;
00288 const float fTmp4 = m_vfElements.m_vfElements44[2][3]*m_vfElements.m_vfElements44[3][2];
00289 const float fTmp5 = m_vfElements.m_vfElements44[0][1]*fTmp4;
00290 const float fTmp6 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[3][3];
00291 const float fTmp7 = m_vfElements.m_vfElements44[2][1]*fTmp6;
00292 const float fTmp8 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[3][2];
00293 const float fTmp9 = m_vfElements.m_vfElements44[2][1]*fTmp8;
00294 const float fTmp11 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[2][3];
00295 const float fTmp12 = m_vfElements.m_vfElements44[3][1]*fTmp11;
00296 const float fTmp14 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[2][2];
00297 const float fTmp15 = m_vfElements.m_vfElements44[3][1]*fTmp14;
00298 const float fTmp17 = m_vfElements.m_vfElements44[1][1]*fTmp1;
00299 const float fTmp19 = m_vfElements.m_vfElements44[1][1]*fTmp4;
00300 const float fTmp22 = m_vfElements.m_vfElements44[1][2]*m_vfElements.m_vfElements44[3][3];
00301 const float fTmp23 = m_vfElements.m_vfElements44[2][1]*fTmp22;
00302 const float fTmp26 = m_vfElements.m_vfElements44[1][3]*m_vfElements.m_vfElements44[3][2];
00303 const float fTmp27 = m_vfElements.m_vfElements44[2][1]*fTmp26;
00304 const float fTmp29 = m_vfElements.m_vfElements44[1][2]*m_vfElements.m_vfElements44[2][3];
00305 const float fTmp30 = m_vfElements.m_vfElements44[3][1]*fTmp29;
00306 const float fTmp32 = m_vfElements.m_vfElements44[1][3]*m_vfElements.m_vfElements44[2][2];
00307 const float fTmp33 = m_vfElements.m_vfElements44[3][1]*fTmp32;
00308 const float fTmp48 = m_vfElements.m_vfElements44[0][1]*fTmp22;
00309 const float fTmp50 = m_vfElements.m_vfElements44[0][1]*fTmp26;
00310 const float fTmp53 = m_vfElements.m_vfElements44[1][1]*fTmp6;
00311 const float fTmp56 = m_vfElements.m_vfElements44[1][1]*fTmp8;
00312 const float fTmp58 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[1][3];
00313 const float fTmp59 = m_vfElements.m_vfElements44[3][1]*fTmp58;
00314 const float fTmp61 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[1][2];
00315 const float fTmp62 = m_vfElements.m_vfElements44[3][1]*fTmp61;
00316 const float fTmp66 = m_vfElements.m_vfElements44[0][1]*fTmp29;
00317 const float fTmp69 = m_vfElements.m_vfElements44[0][1]*fTmp32;
00318 const float fTmp71 = m_vfElements.m_vfElements44[1][1]*fTmp11;
00319 const float fTmp73 = m_vfElements.m_vfElements44[1][1]*fTmp14;
00320 const float fTmp76 = m_vfElements.m_vfElements44[2][1]*fTmp58;
00321 const float fTmp79 = m_vfElements.m_vfElements44[2][1]*fTmp61;
00322 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);
00323 const float fTmp116 = m_vfElements.m_vfElements44[2][1]*m_vfElements.m_vfElements44[3][2];
00324 const float fTmp118 = m_vfElements.m_vfElements44[2][2]*m_vfElements.m_vfElements44[3][1];
00325 const float fTmp121 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[3][2];
00326 const float fTmp124 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[3][1];
00327 const float fTmp126 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[2][2];
00328 const float fTmp128 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[2][1];
00329 const float fTmp133 = m_vfElements.m_vfElements44[2][1]*m_vfElements.m_vfElements44[3][3];
00330 const float fTmp135 = m_vfElements.m_vfElements44[2][3]*m_vfElements.m_vfElements44[3][1];
00331 const float fTmp138 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[3][3];
00332 const float fTmp141 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[3][1];
00333 const float fTmp143 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[2][3];
00334 const float fTmp145 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[2][1];
00335 const float fTmp151 = m_vfElements.m_vfElements44[1][1]*m_vfElements.m_vfElements44[2][2];
00336 const float fTmp153 = m_vfElements.m_vfElements44[1][2]*m_vfElements.m_vfElements44[2][1];
00337 const float fTmp159 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[1][2];
00338 const float fTmp161 = m_vfElements.m_vfElements44[0][2]*m_vfElements.m_vfElements44[1][1];
00339 const float fTmp166 = m_vfElements.m_vfElements44[1][1]*m_vfElements.m_vfElements44[3][3];
00340 const float fTmp168 = m_vfElements.m_vfElements44[1][3]*m_vfElements.m_vfElements44[3][1];
00341 const float fTmp174 = m_vfElements.m_vfElements44[0][1]*m_vfElements.m_vfElements44[1][3];
00342 const float fTmp176 = m_vfElements.m_vfElements44[0][3]*m_vfElements.m_vfElements44[1][1];
00343 const float fTmp187 = m_vfElements.m_vfElements44[1][1]*m_vfElements.m_vfElements44[2][3];
00344 const float fTmp189 = m_vfElements.m_vfElements44[1][3]*m_vfElements.m_vfElements44[2][1];
00345 const float fTmp212 = m_vfElements.m_vfElements44[1][1]*m_vfElements.m_vfElements44[3][2];
00346 const float fTmp214 = m_vfElements.m_vfElements44[1][2]*m_vfElements.m_vfElements44[3][1];
00347
00348 VMatrix matNew;
00349 matNew.m_vfElements.m_vfElements44[0][1] = (-fTmp2+fTmp5+fTmp7-fTmp9-fTmp12+fTmp15)*fTmp84;
00350 matNew.m_vfElements.m_vfElements44[0][2] = -(-fTmp48+fTmp50+fTmp53-fTmp56-fTmp59+fTmp62)*fTmp84;
00351 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;
00352 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;
00353 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;
00354 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;
00355 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;
00356 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;
00357 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;
00358 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;
00359 matNew.m_vfElements.m_vfElements44[0][3] = -(fTmp66-fTmp69-fTmp71+fTmp73+fTmp76-fTmp79)*fTmp84;
00360 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;
00361 matNew.m_vfElements.m_vfElements44[0][0] = (fTmp17-fTmp19-fTmp23+fTmp27+fTmp30-fTmp33)*fTmp84;
00362 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;
00363 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;
00364 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;
00365
00366 return matNew;
00367 };
00368
00369 void invert()
00370 {
00371 (*this) = getInverse();
00372 }
00373
00374 const VMatrix getTransposed() const
00375 {
00376 return VMatrix(
00377 m_vfElements.m_vfElements16[0],m_vfElements.m_vfElements16[1],m_vfElements.m_vfElements16[2],m_vfElements.m_vfElements16[3],
00378 m_vfElements.m_vfElements16[4],m_vfElements.m_vfElements16[5],m_vfElements.m_vfElements16[6],m_vfElements.m_vfElements16[7],
00379 m_vfElements.m_vfElements16[8],m_vfElements.m_vfElements16[9],m_vfElements.m_vfElements16[10],m_vfElements.m_vfElements16[11],
00380 m_vfElements.m_vfElements16[12],m_vfElements.m_vfElements16[13],m_vfElements.m_vfElements16[14],m_vfElements.m_vfElements16[15]);
00381 };
00382
00383 void transpose()
00384 {
00385 (*this) = getTransposed();
00386 };
00387
00388 VVector homogenTransform(const VVector& v)
00389 {
00390 float vector[4];
00391 vector[0] = v.getX();
00392 vector[1] = v.getY();
00393 vector[2] = v.getZ();
00394 vector[3] = 1.0f;
00395
00396 float result[4];
00397
00398 transform(vector, result);
00399
00400 for(int i = 0; i < 3;++i)
00401 {
00402 result[i] /= result[3];
00403 }
00404
00405 VVector res(result[0], result[1], result[2]);
00406 return res;
00407 }
00408
00409 void transform(float * v, float * o)
00410 {
00411 o[0]=m_vfElements.m_vfElements16[0]*v[0]+m_vfElements.m_vfElements16[4]*v[1]+m_vfElements.m_vfElements16[8 ]*v[2]+m_vfElements.m_vfElements16[12]*v[3];
00412 o[1]=m_vfElements.m_vfElements16[1]*v[0]+m_vfElements.m_vfElements16[5]*v[1]+m_vfElements.m_vfElements16[9 ]*v[2]+m_vfElements.m_vfElements16[13]*v[3];
00413 o[2]=m_vfElements.m_vfElements16[2]*v[0]+m_vfElements.m_vfElements16[6]*v[1]+m_vfElements.m_vfElements16[10]*v[2]+m_vfElements.m_vfElements16[14]*v[3];
00414 o[3]=m_vfElements.m_vfElements16[3]*v[0]+m_vfElements.m_vfElements16[7]*v[1]+m_vfElements.m_vfElements16[11]*v[2]+m_vfElements.m_vfElements16[15]*v[3];
00415 }
00416
00417 const VVector getRotated(const VVector & vecOther) const
00418 {
00419 return VVector(
00420 (m_vfElements.m_vfElements16[0]*vecOther.getX() + m_vfElements.m_vfElements16[4]*vecOther.getY() + m_vfElements.m_vfElements16[8]*vecOther.getZ()),
00421 (m_vfElements.m_vfElements16[1]*vecOther.getX() + m_vfElements.m_vfElements16[5]*vecOther.getY() + m_vfElements.m_vfElements16[9]*vecOther.getZ()),
00422 (m_vfElements.m_vfElements16[2]*vecOther.getX() + m_vfElements.m_vfElements16[6]*vecOther.getY() + m_vfElements.m_vfElements16[10]*vecOther.getZ()));
00423 };
00424
00425 const bool operator==(const VMatrix & matOther) const
00426 {
00427 for (unsigned int i=0;i < 16; i++)
00428 {
00429 if (m_vfElements.m_vfElements16[i] != matOther.m_vfElements.m_vfElements16[i])
00430 return false;
00431 }
00432
00433 return true;
00434 };
00435
00436 const bool operator!=(const VMatrix & matOther) const
00437 {
00438 return !(*this == matOther);
00439 };
00440
00441 const VMatrix operator*(const VMatrix & matOther) const
00442 {
00443 return VMatrix(
00444 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],
00445 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],
00446 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],
00447 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],
00448
00449 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],
00450 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],
00451 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],
00452 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],
00453
00454 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],
00455 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],
00456 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],
00457 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],
00458
00459 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],
00460 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],
00461 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],
00462 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] );
00463 };
00464
00465 const VMatrix & operator*=(const VMatrix & matOther)
00466 {
00467 *this = (*this) * matOther;
00468 return *this;
00469 };
00470
00471 const VVector operator* (const VVector &vecOther) const
00472 {
00473 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];
00474 return VVector(
00475 (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,
00476 (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,
00477 (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 );
00478 };
00479
00480 float& operator [] (unsigned int n)
00481 {
00482 return m_vfElements.m_vfElements16[n];
00483 }
00484
00486 static VMatrix RotationX(const float angleRad)
00487 {
00488 VMatrix m;
00489
00490 float cosine = cos(angleRad);
00491 float sinus = sin(angleRad);
00492
00493
00494
00495
00496
00497 m[0]=1; m[4]=0; m[8]=0; m[12]=0;
00498 m[1]=0; m[5]=cosine; m[9]=-sinus; m[13]=0;
00499 m[2]=0; m[6]=sinus; m[10]=cosine; m[14]=0;
00500 m[3]=0; m[7]=0; m[11]=0; m[15]=1;
00501 return m;
00502 }
00503
00505 static VMatrix RotationY(const float angleRad)
00506 {
00507 VMatrix m;
00508
00509 float cosine = cos(angleRad);
00510 float sinus = sin(angleRad);
00511
00512
00513
00514
00515
00516 m[0]=cosine; m[4]=0; m[8]=sinus; m[12]=0;
00517 m[1]=0; m[5]=1; m[9]=0; m[13]=0;
00518 m[2]=-sinus; m[6]=0; m[10]=cosine; m[14]=0;
00519 m[3]=0; m[7]=0; m[11]=0; m[15]=1;
00520 return m;
00521 }
00522
00524 static VMatrix RotationZ(const float angleRad)
00525 {
00526 VMatrix m;
00527
00528 float cosine = cos(angleRad);
00529 float sinus = sin(angleRad);
00530
00531
00532
00533
00534
00535 m[0]=cosine; m[4]=-sinus; m[8]=0; m[12]=0;
00536 m[1]=sinus; m[5]=cosine; m[9]=0; m[13]=0;
00537 m[2]=0; m[6]=0; m[10]=1; m[14]=0;
00538 m[3]=0; m[7]=0; m[11]=0; m[15]=1;
00539 return m;
00540 }
00541
00542 private:
00543
00544 union
00545 {
00546 float m_vfElements16[16];
00547 float m_vfElements44[4][4];
00548 } m_vfElements;
00549 };
00550
00551 inline std::ostream & operator << (std::ostream & os, const VMatrix & matMatrix)
00552 {
00553 os << "((" << matMatrix.get(0,0) << ";" << matMatrix.get(0,1) << ";" << matMatrix.get(0,2) << ";" << matMatrix.get(0,3) << ")" << ";"
00554 << "(" << matMatrix.get(1,0) << ";" << matMatrix.get(1,1) << ";" << matMatrix.get(1,2) << ";" << matMatrix.get(1,3) << ")" << ";"
00555 << "(" << matMatrix.get(2,0) << ";" << matMatrix.get(2,1) << ";" << matMatrix.get(2,2) << ";" << matMatrix.get(2,3) << ")" << ";"
00556 << "(" << matMatrix.get(3,0) << ";" << matMatrix.get(3,1) << ";" << matMatrix.get(3,2) << ";" << matMatrix.get(3,3) << "))";
00557 return os;
00558 }
00559
00560 inline std::istream & operator>> (std::istream & is, VMatrix & matMatrix)
00561 {
00562 float f00, f01, f02, f03;
00563 float f10, f11, f12, f13;
00564 float f20, f21, f22, f23;
00565 float f30, f31, f32, f33;
00566
00567 if (is
00568 >> eat ("(")
00569 >> eat("(") >> f00 >> eat(";") >> f01 >> eat(";") >> f02 >> eat(";") >> f03 >> eat(")") >> eat(";")
00570 >> eat("(") >> f10 >> eat(";") >> f11 >> eat(";") >> f12 >> eat(";") >> f13 >> eat(")") >> eat(";")
00571 >> eat("(") >> f20 >> eat(";") >> f21 >> eat(";") >> f22 >> eat(";") >> f23 >> eat(")") >> eat(";")
00572 >> eat("(") >> f30 >> eat(";") >> f31 >> eat(";") >> f32 >> eat(";") >> f33 >> eat(")")
00573 >> eat(")"))
00574 {
00575 matMatrix.set(0,0,f00); matMatrix.set(0,1,f01); matMatrix.set(0,2,f02); matMatrix.set(0,3,f03);
00576 matMatrix.set(1,0,f10); matMatrix.set(1,1,f11); matMatrix.set(1,2,f12); matMatrix.set(1,3,f13);
00577 matMatrix.set(2,0,f20); matMatrix.set(2,1,f21); matMatrix.set(2,2,f22); matMatrix.set(2,3,f23);
00578 matMatrix.set(3,0,f30); matMatrix.set(3,1,f31); matMatrix.set(3,2,f32); matMatrix.set(3,3,f33);
00579
00580 }
00581
00582 return is;
00583 }