Eigene Dateien/FlowVis/src/VMatrix.h

Go to the documentation of this file.
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 // 4x4 Matrix class
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                 /*float rotation[16];
00244                 rotation[0] = 1.0f - 2.0f * (quaRotation.getVector().getY() * quaRotation.getVector().getY() + quaRotation.getVector().getZ() * quaRotation.getVector().getZ());
00245                 rotation[1] = 2.0f * (quaRotation.getVector().getX() * quaRotation.getVector().getY() + quaRotation.getVector().getZ() * quaRotation.getScalar());
00246                 rotation[2] = 2.0f * (quaRotation.getVector().getX() * quaRotation.getVector().getZ() - quaRotation.getVector().getY() * quaRotation.getScalar());
00247                 rotation[3] = 0.0f;
00248 
00249                 rotation[4] = 2.0f * (quaRotation.getVector().getX() * quaRotation.getVector().getY() - quaRotation.getVector().getZ() * quaRotation.getScalar());
00250                 rotation[5] = 1.0f - 2.0f * (quaRotation.getVector().getX() * quaRotation.getVector().getX() + quaRotation.getVector().getZ() * quaRotation.getVector().getZ());
00251                 rotation[6] = 2.0f * (quaRotation.getVector().getZ() * quaRotation.getVector().getY() + quaRotation.getVector().getX() * quaRotation.getScalar());
00252                 rotation[7] = 0.0f;
00253 
00254                 rotation[8] = 2.0f * (quaRotation.getVector().getX() * quaRotation.getVector().getZ() + quaRotation.getVector().getY() * quaRotation.getScalar());
00255                 rotation[9] = 2.0f * (quaRotation.getVector().getY() * quaRotation.getVector().getZ() - quaRotation.getVector().getX() * quaRotation.getScalar());
00256                 rotation[10] = 1.0f - 2.0f * (quaRotation.getVector().getX() * quaRotation.getVector().getX() + quaRotation.getVector().getY() * quaRotation.getVector().getY());
00257                 rotation[11] = 0.0f;
00258 
00259                 rotation[12] = 0.0f;
00260                 rotation[13] = 0.0f;
00261                 rotation[14] = 0.0f;
00262                 rotation[15] = 1.0f;
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                 //return (*this) * VMatrix(rotation);
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                 //  |  1  0       0       0 |
00494                 //M=|  0  cos(A) -sin(A)  0 |
00495                 //  |  0  sin(A)  cos(A)  0 |
00496                 //  |  0  0       0       1 |
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                 //  |  cos(A)  0  sin(A)  0 |
00513                 //M=|  0       1  0       0 |
00514                 //  | -sin(A)  0  cos(A)  0 |
00515                 //  |  0       0  0       1 |
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                 //  |  cos(A)  -sin(A) 0  0 |
00532                 //M=|  sin(A)   cos(A) 0  0 |
00533                 //  |  0        0      1  0 |
00534                 //  |  0        0      0  1 |
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 }

Generated on Mon Jan 21 01:15:16 2008 for FlowVis by  doxygen 1.5.4