TAPs 0.7.7.3
TAPsColMatrix4x4.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsColMatrix4x4.cpp
00003 
00004 ColMatrix4x4 class is a class for a 4-by-4 matrix in column-major order.
00005 
00006 SUKITTI PUNAK   (09/14/2004)
00007 UPDATE          (09/29/2007)
00008 ******************************************************************************/
00009 #include "TAPsColMatrix4x4.hpp"
00010 // Using Inclusion Model (i.e. definitions are included in declarations)
00011 //                       (this name.cpp is included in name.hpp)
00012 // Each friend is defined directly inside its declaration.
00013 
00014 BEGIN_NAMESPACE_TAPs
00015 //=============================================================================
00016 // Constructors and Destructor
00017 //-----------------------------------------------------------------------------
00018 template <typename T>
00019 ColMatrix4x4<T>::ColMatrix4x4 ()
00020 {
00021     // Identity Matrix
00022     /*e0*/  e[ 1] = e[ 2] = e[ 3] = 
00023     e[ 4] = /*e5*/  e[ 6] = e[ 7] = 
00024     e[ 8] = e[ 9] /*e10*/ = e[11] = 
00025     e[12] = e[13] = e[14]  /*e15*/= Math<T>::ZERO;
00026     e[ 0] = e[ 5] = e[10] = e[15] = Math<T>::ONE;
00027 }
00028 //-----------------------------------------------------------------------------
00029 template <typename T>
00030 ColMatrix4x4<T>::ColMatrix4x4 ( ColMatrix4x4<T> const &M )
00031 {
00032     e[ 0] = M.e[ 0];  e[ 1] = M.e[ 1];  e[ 2] = M.e[ 2];  e[ 3] = M.e[ 3];
00033     e[ 4] = M.e[ 4];  e[ 5] = M.e[ 5];  e[ 6] = M.e[ 6];  e[ 7] = M.e[ 7];
00034     e[ 8] = M.e[ 8];  e[ 9] = M.e[ 9];  e[10] = M.e[10];  e[11] = M.e[11];
00035     e[12] = M.e[12];  e[13] = M.e[13];  e[14] = M.e[14];  e[15] = M.e[15];
00036 }
00037 //-----------------------------------------------------------------------------
00038 template <typename T>
00039 ColMatrix4x4<T>::ColMatrix4x4 ( T t )
00040 {
00041     e[ 0] = e[ 1] = e[ 2] = e[ 3] = 
00042     e[ 4] = e[ 5] = e[ 6] = e[ 7] = 
00043     e[ 8] = e[ 9] = e[10] = e[11] = 
00044     e[12] = e[13] = e[14] = e[15] = t;
00045 }
00046 //-----------------------------------------------------------------------------
00047 template <typename T>
00048 ColMatrix4x4<T>::ColMatrix4x4 ( T e00, T e01, T e02, T e03, 
00049                           T e04, T e05, T e06, T e07, 
00050                           T e08, T e09, T e10, T e11, 
00051                           T e12, T e13, T e14, T e15 )
00052 {
00053     e[ 0] = e00;  e[ 1] = e01;  e[ 2] = e02;  e[ 3] = e03;
00054     e[ 4] = e04;  e[ 5] = e05;  e[ 6] = e06;  e[ 7] = e07;
00055     e[ 8] = e08;  e[ 9] = e09;  e[10] = e10;  e[11] = e11;
00056     e[12] = e12;  e[13] = e13;  e[14] = e14;  e[15] = e15;
00057 }
00058 //-----------------------------------------------------------------------------
00059 template <typename T>
00060 ColMatrix4x4<T>::ColMatrix4x4 ( T const af[16] )
00061 {
00062     e[ 0] = af[ 0];  e[ 1] = af[ 1];  e[ 2] = af[ 2];  e[ 3] = af[ 3];
00063     e[ 4] = af[ 4];  e[ 5] = af[ 5];  e[ 6] = af[ 6];  e[ 7] = af[ 7];
00064     e[ 8] = af[ 8];  e[ 9] = af[ 9];  e[10] = af[10];  e[11] = af[11];
00065     e[12] = af[12];  e[13] = af[13];  e[14] = af[14];  e[15] = af[15];
00066 }
00067 //-----------------------------------------------------------------------------
00068 template <typename T>
00069 ColMatrix4x4<T>::~ColMatrix4x4 ()
00070 {}
00071 //-----------------------------------------------------------------------------
00072 //=============================================================================
00073 // Member Access
00074 //-----------------------------------------------------------------------------
00075 template <typename T>
00076 inline T & ColMatrix4x4<T>::operator[] ( int i )
00077 {   return e[i];    }
00078 //-----------------------------------------------------------------------------
00079 template <typename T>
00080 inline T const & ColMatrix4x4<T>::operator[] ( int i ) const
00081 {   return e[i];    }
00082 //-----------------------------------------------------------------------------
00083 template <typename T>
00084 inline T & ColMatrix4x4<T>::operator() ( int r, int c )
00085 {   return e[r + c*4];  }
00086 //-----------------------------------------------------------------------------
00087 template <typename T>
00088 inline T const & ColMatrix4x4<T>::operator() ( int r, int c ) const
00089 {   return e[r + c*4];  }
00090 //-----------------------------------------------------------------------------
00091 //=============================================================================
00092 // Convert to one dimension array
00093 //-----------------------------------------------------------------------------
00094 template <typename T>
00095 ColMatrix4x4<T>::operator const T * () const
00096 {   return e;   }
00097 //-----------------------------------------------------------------------------
00098 template <typename T>
00099 ColMatrix4x4<T>::operator T * ()
00100 {   return e;   }
00101 //-----------------------------------------------------------------------------
00102 //=============================================================================
00103 // Useful Functions
00104 //-----------------------------------------------------------------------------
00105 template <typename T>
00106 inline void ColMatrix4x4<T>::SetAllElements (   T t )
00107 {
00108     e[ 0] = e[ 1] = e[ 2] = e[ 3] = 
00109     e[ 4] = e[ 5] = e[ 6] = e[ 7] = 
00110     e[ 8] = e[ 9] = e[10] = e[11] = 
00111     e[12] = e[13] = e[14] = e[15] = t;
00112 }
00113 //-----------------------------------------------------------------------------
00114 template <typename T>
00115 inline void ColMatrix4x4<T>::SetAllElements (   T e00, T e01, T e02, T e03, 
00116                                             T e10, T e11, T e12, T e13, 
00117                                             T e20, T e21, T e22, T e23, 
00118                                             T e30, T e31, T e32, T e33 )
00119 {
00120     e[ 0] = e00;  e[ 1] = e01;  e[ 2] = e02; e[ 3] = e03;
00121     e[ 4] = e10;  e[ 5] = e11;  e[ 6] = e12; e[ 7] = e13;
00122     e[ 8] = e20;  e[ 9] = e21;  e[10] = e22; e[11] = e23;
00123     e[12] = e30;  e[13] = e31;  e[14] = e32; e[15] = e33;
00124 }
00125 //-----------------------------------------------------------------------------
00126 template <typename T>
00127 inline void ColMatrix4x4<T>::SetAllElements ( T const af[16] )
00128 {
00129     e[ 0] = af[ 0];  e[ 1] = af[ 1];  e[ 2] = af[ 2]; e[ 3] = af[ 3];
00130     e[ 4] = af[ 4];  e[ 5] = af[ 5];  e[ 6] = af[ 6]; e[ 7] = af[ 7];
00131     e[ 8] = af[ 8];  e[ 9] = af[ 9];  e[10] = af[10]; e[11] = af[11];
00132     e[12] = af[12];  e[13] = af[13];  e[14] = af[14]; e[15] = af[15];
00133 }
00134 //-----------------------------------------------------------------------------
00135 template <typename T>
00136 inline void ColMatrix4x4<T>::MakeIdentity ()
00137 {
00138     e[ 0] = e[ 5] = e[10] = e[15] = Math<T>::ONE;
00139             e[ 1] = e[ 2] = e[ 3] = 
00140     e[ 4] =         e[ 6] = e[ 7] = 
00141     e[ 8] = e[ 9] =         e[11] = 
00142     e[12] = e[13] = e[14]         = Math<T>::ZERO;
00143 }
00144 //-----------------------------------------------------------------------------
00145 template <typename T>
00146 inline void ColMatrix4x4<T>::MakeDiagonal ( T d )
00147 {
00148     e[ 0] = e[ 5] = e[10] = e[15] = static_cast<T>(d);
00149             e[ 1] = e[ 2] = e[ 3] = 
00150     e[ 4] =         e[ 6] = e[ 7] = 
00151     e[ 8] = e[ 9] =         e[11] = 
00152     e[12] = e[13] = e[14]         = Math<T>::ZERO;
00153 }
00154 //-----------------------------------------------------------------------------
00155 template <typename T>
00156 inline void ColMatrix4x4<T>::MakeDiagonal ( T const af[4] )
00157 {
00158     e[ 0] = static_cast<T>(af[0]);
00159     e[ 5] = static_cast<T>(af[1]);
00160     e[10] = static_cast<T>(af[2]);
00161     e[15] = static_cast<T>(af[3]);
00162             e[ 1] = e[ 2] = e[ 3] = 
00163     e[ 4] =         e[ 6] = e[ 7] = 
00164     e[ 8] = e[ 9] =         e[11] = 
00165     e[12] = e[13] = e[14]         = Math<T>::ZERO;
00166 }
00167 //-----------------------------------------------------------------------------
00168 template <typename T>
00169 inline void ColMatrix4x4<T>::MakeZero ()
00170 {
00171     e[ 0] = e[ 1] = e[ 2] = e[ 3] = 
00172     e[ 4] = e[ 5] = e[ 6] = e[ 7] = 
00173     e[ 8] = e[ 9] = e[10] = e[11] = 
00174     e[12] = e[13] = e[14] = e[15] = Math<T>::ZERO;
00175 }
00176 //-----------------------------------------------------------------------------
00177 //=============================================================================
00178 // Matrix Operations
00179 //-----------------------------------------------------------------------------
00180 template <typename T>
00181 inline ColMatrix4x4<T> & ColMatrix4x4<T>::Transposed ()
00182 {
00183     T temp;
00184     temp = e[ 1];  e[ 1] = e[ 4];  e[ 4] = temp;
00185     temp = e[ 2];  e[ 2] = e[ 8];  e[ 8] = temp;
00186     temp = e[ 3];  e[ 3] = e[12];  e[12] = temp;
00187     temp = e[ 6];  e[ 6] = e[ 9];  e[ 9] = temp;
00188     temp = e[ 7];  e[ 7] = e[13];  e[13] = temp;
00189     temp = e[11];  e[11] = e[14];  e[14] = temp;
00190     return *this;
00191 }
00192 //-----------------------------------------------------------------------------
00193 template <typename T>
00194 inline ColMatrix4x4<T> ColMatrix4x4<T>::GetTranspose() const
00195 {
00196     return  ColMatrix4x4<T> (   e[ 0], e[ 4], e[ 8], e[12],  
00197                             e[ 1], e[ 5], e[ 9], e[13], 
00198                             e[ 2], e[ 6], e[10], e[14], 
00199                             e[ 3], e[ 7], e[11], e[15] );
00200 }
00201 //-----------------------------------------------------------------------------
00202 // Inverse the matrix
00203 template <typename T>
00204 inline ColMatrix4x4<T> & ColMatrix4x4<T>::Inversed ()
00205 {
00206     *this = (*this).GetInverse();
00207     return *this;
00208 }
00209 //-----------------------------------------------------------------------------
00210 // Get the matrix inverse
00211 template <typename T>
00212 ColMatrix4x4<T> ColMatrix4x4<T>::GetInverse () const
00213 {
00214     T det = GetDeterminant();
00215 
00216     if ( -Math<T>::EPSILON < det && det < Math<T>::EPSILON )
00217         return ColMatrix4x4( Math<T>::INFINITY );
00218 
00219     return ColMatrix4x4<T>(
00220         ( e[ 5]*e[10]*e[15] - e[ 5]*e[11]*e[14] - e[ 9]*e[ 6]*e[15] + e[ 9]*e[ 7]*e[14] + e[13]*e[ 6]*e[11] - e[13]*e[ 7]*e[10] ) / det, 
00221         ( e[ 1]*e[11]*e[14] - e[ 1]*e[10]*e[15] + e[ 9]*e[ 2]*e[15] - e[ 9]*e[ 3]*e[14] - e[13]*e[ 2]*e[11] + e[13]*e[ 3]*e[10] ) / det, 
00222         ( e[ 1]*e[ 6]*e[15] - e[ 1]*e[ 7]*e[14] - e[ 5]*e[ 2]*e[15] + e[ 5]*e[ 3]*e[14] + e[13]*e[ 2]*e[ 7] - e[13]*e[ 3]*e[ 6] ) / det, 
00223         ( e[ 1]*e[ 7]*e[10] - e[ 1]*e[ 6]*e[11] + e[ 5]*e[ 2]*e[11] - e[ 5]*e[ 3]*e[10] - e[ 9]*e[ 2]*e[ 7] + e[ 9]*e[ 3]*e[ 6] ) / det, 
00224 
00225         ( e[ 4]*e[11]*e[14] - e[ 8]*e[ 7]*e[14] - e[12]*e[ 6]*e[11] - e[ 4]*e[10]*e[15] + e[ 8]*e[ 6]*e[15] + e[12]*e[ 7]*e[10] ) / det, 
00226         ( e[ 0]*e[10]*e[15] - e[ 0]*e[11]*e[14] - e[ 8]*e[ 2]*e[15] + e[ 8]*e[ 3]*e[14] + e[12]*e[ 2]*e[11] - e[12]*e[ 3]*e[10] ) / det, 
00227         ( e[ 0]*e[ 7]*e[14] - e[ 0]*e[ 6]*e[15] + e[ 4]*e[ 2]*e[15] - e[ 4]*e[ 3]*e[14] - e[12]*e[ 2]*e[ 7] + e[12]*e[ 3]*e[ 6] ) / det, 
00228         ( e[ 0]*e[ 6]*e[11] - e[ 0]*e[ 7]*e[10] - e[ 4]*e[ 2]*e[11] + e[ 4]*e[ 3]*e[10] + e[ 8]*e[ 2]*e[ 7] - e[ 8]*e[ 3]*e[ 6] ) / det, 
00229 
00230         ( e[ 4]*e[ 9]*e[15] - e[ 4]*e[11]*e[13] - e[ 8]*e[ 5]*e[15] + e[ 8]*e[ 7]*e[13] + e[12]*e[ 5]*e[11] - e[12]*e[ 7]*e[ 9] ) / det, 
00231         ( e[ 0]*e[11]*e[13] - e[ 0]*e[ 9]*e[15] + e[ 8]*e[ 1]*e[15] - e[ 8]*e[ 3]*e[13] - e[12]*e[ 1]*e[11] + e[12]*e[ 3]*e[ 9] ) / det, 
00232         ( e[ 0]*e[ 5]*e[15] - e[ 0]*e[ 7]*e[13] - e[ 4]*e[ 1]*e[15] + e[ 4]*e[ 3]*e[13] + e[12]*e[ 1]*e[ 7] - e[12]*e[ 3]*e[ 5] ) / det, 
00233         ( e[ 0]*e[ 7]*e[ 9] - e[ 0]*e[ 5]*e[11] + e[ 4]*e[ 1]*e[11] - e[ 4]*e[ 3]*e[ 9] - e[ 8]*e[ 1]*e[ 7] + e[ 8]*e[ 3]*e[ 5] ) / det, 
00234 
00235         ( e[12]*e[ 6]*e[ 9] + e[ 4]*e[10]*e[13] - e[12]*e[ 5]*e[10] - e[ 8]*e[ 6]*e[13] - e[ 4]*e[ 9]*e[14] + e[ 8]*e[ 5]*e[14] ) / det, 
00236         ( e[ 0]*e[ 9]*e[14] - e[ 0]*e[10]*e[13] - e[ 8]*e[ 1]*e[14] + e[ 8]*e[ 2]*e[13] + e[12]*e[ 1]*e[10] - e[12]*e[ 2]*e[ 9] ) / det, 
00237         ( e[ 0]*e[ 6]*e[13] - e[ 0]*e[ 5]*e[14] + e[ 4]*e[ 1]*e[14] - e[ 4]*e[ 2]*e[13] - e[12]*e[ 1]*e[ 6] + e[12]*e[ 2]*e[ 5] ) / det, 
00238         ( e[ 0]*e[ 5]*e[10] - e[ 0]*e[ 6]*e[ 9] - e[ 4]*e[ 1]*e[10] + e[ 4]*e[ 2]*e[ 9] + e[ 8]*e[ 1]*e[ 6] - e[ 8]*e[ 2]*e[ 5] ) / det 
00239     );
00240 }
00241 //-----------------------------------------------------------------------------
00242 template <typename T>
00243 inline T ColMatrix4x4<T>::GetDeterminant () const
00244 {
00245     return  e[ 0] * ( e[ 5]*e[10]*e[15] - e[ 5]*e[11]*e[14] - e[ 9]*e[ 6]*e[15] + e[ 9]*e[ 7]*e[14] + e[13]*e[ 6]*e[11] - e[13]*e[ 7]*e[10] ) 
00246         +   e[ 4] * ( e[ 1]*e[11]*e[14] - e[ 1]*e[10]*e[15] + e[ 9]*e[ 2]*e[15] - e[ 9]*e[ 3]*e[14] - e[13]*e[ 2]*e[11] + e[13]*e[ 3]*e[10] ) 
00247         +   e[ 8] * ( e[ 1]*e[ 6]*e[15] - e[ 1]*e[ 7]*e[14] - e[ 5]*e[ 2]*e[15] + e[ 5]*e[ 3]*e[14] + e[13]*e[ 2]*e[ 7] - e[13]*e[ 3]*e[ 6] ) 
00248         +   e[12] * ( e[ 1]*e[ 7]*e[10] - e[ 1]*e[ 6]*e[11] + e[ 5]*e[ 2]*e[11] - e[ 5]*e[ 3]*e[10] - e[ 9]*e[ 2]*e[ 7] + e[ 9]*e[ 3]*e[ 6] );
00249 }
00250 //-----------------------------------------------------------------------------
00251 //=============================================================================
00252 // Assignment Overloaded Operator
00253 //--------------------------------------------------------------------------
00254 // Assignment Operator
00255 template <typename T>
00256 inline ColMatrix4x4<T> & ColMatrix4x4<T>::operator= ( ColMatrix4x4<T> const &M )
00257 {
00258     if ( this != &M )
00259     {
00260         e[ 0] = M.e[ 0];  e[ 1] = M.e[ 1];  e[ 2] = M.e[ 2];  e[ 3] = M.e[ 3];
00261         e[ 4] = M.e[ 4];  e[ 5] = M.e[ 5];  e[ 6] = M.e[ 6];  e[ 7] = M.e[ 7];
00262         e[ 8] = M.e[ 8];  e[ 9] = M.e[ 9];  e[10] = M.e[10];  e[11] = M.e[11];
00263         e[12] = M.e[12];  e[13] = M.e[13];  e[14] = M.e[14];  e[15] = M.e[15];
00264     }
00265     return *this;
00266 }
00267 //-----------------------------------------------------------------------------
00268 //=============================================================================
00269 // Unary Overloaded Operators
00270 //-----------------------------------------------------------------------------
00271 template <typename T>
00272 ColMatrix4x4<T> ColMatrix4x4<T>::operator- ()
00273 {
00274     return ColMatrix4x4<T>( -e[ 0], -e[ 1], -e[ 2], -e[ 3], 
00275                             -e[ 4], -e[ 5], -e[ 6], -e[ 7], 
00276                             -e[ 8], -e[ 9], -e[10], -e[11], 
00277                             -e[12], -e[13], -e[14], -e[15] );
00278 }
00279 //-----------------------------------------------------------------------------
00280 //=============================================================================
00281 // Assign Overloaded Operators
00282 //-----------------------------------------------------------------------------
00283 template <typename T>
00284 ColMatrix4x4<T> & ColMatrix4x4<T>::operator+= ( ColMatrix4x4<T> const &M )
00285 {
00286     e[ 0] += M.e[ 0];  e[ 1] += M.e[ 1];  e[ 2] += M.e[ 2];  e[ 3] += M.e[ 3];
00287     e[ 4] += M.e[ 4];  e[ 5] += M.e[ 5];  e[ 6] += M.e[ 6];  e[ 7] += M.e[ 7];
00288     e[ 8] += M.e[ 8];  e[ 9] += M.e[ 9];  e[10] += M.e[10];  e[11] += M.e[11];
00289     e[12] += M.e[12];  e[13] += M.e[13];  e[14] += M.e[14];  e[15] += M.e[15];
00290     return *this;
00291 }
00292 //-----------------------------------------------------------------------------
00293 template <typename T>
00294 ColMatrix4x4<T> & ColMatrix4x4<T>::operator-= ( ColMatrix4x4<T> const &M )
00295 {
00296     e[ 0] -= M.e[ 0];  e[ 1] -= M.e[ 1];  e[ 2] -= M.e[ 2];  e[ 3] -= M.e[ 3];
00297     e[ 4] -= M.e[ 4];  e[ 5] -= M.e[ 5];  e[ 6] -= M.e[ 6];  e[ 7] -= M.e[ 7];
00298     e[ 8] -= M.e[ 8];  e[ 9] -= M.e[ 9];  e[10] -= M.e[10];  e[11] -= M.e[11];
00299     e[12] -= M.e[12];  e[13] -= M.e[13];  e[14] -= M.e[14];  e[15] -= M.e[15];
00300     return *this;
00301 }
00302 //-----------------------------------------------------------------------------
00303 template <typename T>
00304 ColMatrix4x4<T> & ColMatrix4x4<T>::operator*= ( ColMatrix4x4<T> const &M )
00305 {
00306     *this = (*this) * M;
00307     return *this;
00308 }
00309 //-----------------------------------------------------------------------------
00310 template <typename T>
00311 ColMatrix4x4<T> & ColMatrix4x4<T>::operator*= ( T s )
00312 {
00313     e[ 0] *= s;  e[ 1] *= s;  e[ 2] *= s;  e[ 3] *= s;
00314     e[ 4] *= s;  e[ 5] *= s;  e[ 6] *= s;  e[ 7] *= s;
00315     e[ 8] *= s;  e[ 9] *= s;  e[10] *= s;  e[11] *= s;
00316     e[12] *= s;  e[13] *= s;  e[14] *= s;  e[15] *= s;
00317     return *this;
00318 }
00319 //-----------------------------------------------------------------------------
00320 template <typename T>
00321 ColMatrix4x4<T> & ColMatrix4x4<T>::operator/= ( T s )
00322 {
00323     e[ 0] /= s;  e[ 1] /= s;  e[ 2] /= s;  e[ 3] /= s;
00324     e[ 4] /= s;  e[ 5] /= s;  e[ 6] /= s;  e[ 7] /= s;
00325     e[ 8] /= s;  e[ 9] /= s;  e[10] /= s;  e[11] /= s;
00326     e[12] /= s;  e[13] /= s;  e[14] /= s;  e[15] /= s;
00327     return *this;
00328 }
00329 //-----------------------------------------------------------------------------
00330 //=============================================================================
00331 // Binary Overloaded Operators
00332 //-----------------------------------------------------------------------------
00333 template <typename T>
00334 ColMatrix4x4<T> ColMatrix4x4<T>::operator+ ( ColMatrix4x4<T> const &M ) const
00335 {
00336     return ColMatrix4x4<T>( e[ 0]+M.e[ 0], e[ 1]+M.e[ 1], e[ 2]+M.e[ 2], e[ 3]+M.e[ 3], 
00337                             e[ 4]+M.e[ 4], e[ 5]+M.e[ 5], e[ 6]+M.e[ 6], e[ 7]+M.e[ 7], 
00338                             e[ 8]+M.e[ 8], e[ 9]+M.e[ 9], e[10]+M.e[10], e[11]+M.e[11], 
00339                             e[12]+M.e[12], e[13]+M.e[13], e[14]+M.e[14], e[15]+M.e[15] );
00340 }
00341 //-----------------------------------------------------------------------------
00342 template <typename T>
00343 ColMatrix4x4<T> ColMatrix4x4<T>::operator- ( ColMatrix4x4<T> const &M ) const
00344 {
00345     return ColMatrix4x4<T>( e[ 0]-M.e[ 0], e[ 1]-M.e[ 1], e[ 2]-M.e[ 2], e[ 3]-M.e[ 3], 
00346                             e[ 4]-M.e[ 4], e[ 5]-M.e[ 5], e[ 6]-M.e[ 6], e[ 7]-M.e[ 7], 
00347                             e[ 8]-M.e[ 8], e[ 9]-M.e[ 9], e[10]-M.e[10], e[11]-M.e[11], 
00348                             e[12]-M.e[12], e[13]-M.e[13], e[14]-M.e[14], e[15]-M.e[15] );
00349 }
00350 //-----------------------------------------------------------------------------
00351 template <typename T>
00352 ColMatrix4x4<T> ColMatrix4x4<T>::operator* ( ColMatrix4x4<T> const &M ) const
00353 {
00354     return ColMatrix4x4<T>( 
00355             M.e[ 0]*e[ 0] + M.e[ 1]*e[ 4] + M.e[ 2]*e[ 8] + M.e[ 3]*e[12],
00356             M.e[ 0]*e[ 1] + M.e[ 1]*e[ 5] + M.e[ 2]*e[ 9] + M.e[ 3]*e[13],
00357             M.e[ 0]*e[ 2] + M.e[ 1]*e[ 6] + M.e[ 2]*e[10] + M.e[ 3]*e[14],
00358             M.e[ 0]*e[ 3] + M.e[ 1]*e[ 7] + M.e[ 2]*e[11] + M.e[ 3]*e[15],
00359 
00360             M.e[ 4]*e[ 0] + M.e[ 5]*e[ 4] + M.e[ 6]*e[ 8] + M.e[ 7]*e[12],
00361             M.e[ 4]*e[ 1] + M.e[ 5]*e[ 5] + M.e[ 6]*e[ 9] + M.e[ 7]*e[13],
00362             M.e[ 4]*e[ 2] + M.e[ 5]*e[ 6] + M.e[ 6]*e[10] + M.e[ 7]*e[14],
00363             M.e[ 4]*e[ 3] + M.e[ 5]*e[ 7] + M.e[ 6]*e[11] + M.e[ 7]*e[15],
00364             
00365             M.e[ 8]*e[ 0] + M.e[ 9]*e[ 4] + M.e[10]*e[ 8] + M.e[11]*e[12],
00366             M.e[ 8]*e[ 1] + M.e[ 9]*e[ 5] + M.e[10]*e[ 9] + M.e[11]*e[13],
00367             M.e[ 8]*e[ 2] + M.e[ 9]*e[ 6] + M.e[10]*e[10] + M.e[11]*e[14],
00368             M.e[ 8]*e[ 3] + M.e[ 9]*e[ 7] + M.e[10]*e[11] + M.e[11]*e[15],
00369 
00370             M.e[12]*e[ 0] + M.e[13]*e[ 4] + M.e[14]*e[ 8] + M.e[15]*e[12],
00371             M.e[12]*e[ 1] + M.e[13]*e[ 5] + M.e[14]*e[ 9] + M.e[15]*e[13],
00372             M.e[12]*e[ 2] + M.e[13]*e[ 6] + M.e[14]*e[10] + M.e[15]*e[14],
00373             M.e[12]*e[ 3] + M.e[13]*e[ 7] + M.e[14]*e[11] + M.e[15]*e[15]
00374                         );
00375 }
00376 //-----------------------------------------------------------------------------
00377 template <typename T>
00378 ColMatrix4x4<T> ColMatrix4x4<T>::operator* ( T s ) const
00379 {
00380     return ColMatrix4x4<T>( e[ 0]*s, e[ 1]*s, e[ 2]*s, e[ 3]*s, 
00381                             e[ 4]*s, e[ 5]*s, e[ 6]*s, e[ 7]*s, 
00382                             e[ 8]*s, e[ 9]*s, e[10]*s, e[11]*s, 
00383                             e[12]*s, e[13]*s, e[14]*s, e[15]*s );
00384 }
00385 //-----------------------------------------------------------------------------
00386 template <typename T>
00387 ColMatrix4x4<T> ColMatrix4x4<T>::operator/ ( T s ) const
00388 {
00389     return ColMatrix4x4<T>( e[ 0]/s, e[ 1]/s, e[ 2]/s, e[ 3]/s, 
00390                             e[ 4]/s, e[ 5]/s, e[ 6]/s, e[ 7]/s, 
00391                             e[ 8]/s, e[ 9]/s, e[10]/s, e[11]/s, 
00392                             e[12]/s, e[13]/s, e[14]/s, e[15]/s );
00393 }
00394 //-----------------------------------------------------------------------------
00395 template <typename T>
00396 inline void ColMatrix4x4<T>::MultLeft ( ColMatrix4x4<T> const &M )
00397 {
00398     *this = M * (*this);
00399 }
00400 //-----------------------------------------------------------------------------
00401 template <typename T>
00402 inline void ColMatrix4x4<T>::MultRight ( ColMatrix4x4<T> const &M )
00403 {
00404     *this *= M;
00405 }
00406 //-----------------------------------------------------------------------------
00407 
00408 //=============================================================================
00409 // Static Member Functions for Data Conversions
00410 //-----------------------------------------------------------------------------
00411 template <typename T>
00412 const float * ColMatrix4x4<T>::GetDataFloat () const
00413 {
00414     for ( int i = 0; i < 16; ++i ) {
00415         g_f[i] = static_cast<float>( e[i] );
00416     }
00417     return g_f;
00418 }
00419 //-----------------------------------------------------------------------------
00420 template <typename T>
00421 const double * ColMatrix4x4<T>::GetDataDouble () const
00422 {
00423     for ( int i = 0; i < 16; ++i ) {
00424         g_d[i] = static_cast<double>( e[i] );
00425     }
00426     return g_d;
00427 }
00428 //-----------------------------------------------------------------------------
00429 template <typename T>
00430 const long double * ColMatrix4x4<T>::GetDataLongDouble () const
00431 {
00432     for ( int i = 0; i < 16; ++i ) {
00433         g_ld[i] = static_cast<long double>( e[i] );
00434     }
00435     return g_ld;
00436 }
00437 //-----------------------------------------------------------------------------
00438 template <typename T>
00439 const float * ColMatrix4x4<T>::GetTransposeDataFloat () const
00440 {
00441     g_f[ 0] = static_cast<float>( e[ 0] );
00442     g_f[ 1] = static_cast<float>( e[ 4] );
00443     g_f[ 2] = static_cast<float>( e[ 8] );
00444     g_f[ 3] = static_cast<float>( e[12] );
00445     g_f[ 4] = static_cast<float>( e[ 1] );
00446     g_f[ 5] = static_cast<float>( e[ 5] );
00447     g_f[ 6] = static_cast<float>( e[ 9] );
00448     g_f[ 7] = static_cast<float>( e[13] );
00449     g_f[ 8] = static_cast<float>( e[ 2] );
00450     g_f[ 9] = static_cast<float>( e[ 6] );
00451     g_f[10] = static_cast<float>( e[10] );
00452     g_f[11] = static_cast<float>( e[14] );
00453     g_f[12] = static_cast<float>( e[ 3] );
00454     g_f[13] = static_cast<float>( e[ 7] );
00455     g_f[14] = static_cast<float>( e[11] );
00456     g_f[15] = static_cast<float>( e[15] );
00457     return g_f;
00458 }
00459 //-----------------------------------------------------------------------------
00460 template <typename T>
00461 const double * ColMatrix4x4<T>::GetTransposeDataDouble () const
00462 {
00463     g_d[ 0] = static_cast<double>( e[ 0] );
00464     g_d[ 1] = static_cast<double>( e[ 4] );
00465     g_d[ 2] = static_cast<double>( e[ 8] );
00466     g_d[ 3] = static_cast<double>( e[12] );
00467     g_d[ 4] = static_cast<double>( e[ 1] );
00468     g_d[ 5] = static_cast<double>( e[ 5] );
00469     g_d[ 6] = static_cast<double>( e[ 9] );
00470     g_d[ 7] = static_cast<double>( e[13] );
00471     g_d[ 8] = static_cast<double>( e[ 2] );
00472     g_d[ 9] = static_cast<double>( e[ 6] );
00473     g_d[10] = static_cast<double>( e[10] );
00474     g_d[11] = static_cast<double>( e[14] );
00475     g_d[12] = static_cast<double>( e[ 3] );
00476     g_d[13] = static_cast<double>( e[ 7] );
00477     g_d[14] = static_cast<double>( e[11] );
00478     g_d[15] = static_cast<double>( e[15] );
00479     return g_d;
00480 }
00481 //-----------------------------------------------------------------------------
00482 template <typename T>
00483 const long double * ColMatrix4x4<T>::GetTransposeDataLongDouble () const
00484 {
00485     g_ld[ 0] = static_cast<long double>( e[ 0] );
00486     g_ld[ 1] = static_cast<long double>( e[ 4] );
00487     g_ld[ 2] = static_cast<long double>( e[ 8] );
00488     g_ld[ 3] = static_cast<long double>( e[12] );
00489     g_ld[ 4] = static_cast<long double>( e[ 1] );
00490     g_ld[ 5] = static_cast<long double>( e[ 5] );
00491     g_ld[ 6] = static_cast<long double>( e[ 9] );
00492     g_ld[ 7] = static_cast<long double>( e[13] );
00493     g_ld[ 8] = static_cast<long double>( e[ 2] );
00494     g_ld[ 9] = static_cast<long double>( e[ 6] );
00495     g_ld[10] = static_cast<long double>( e[10] );
00496     g_ld[11] = static_cast<long double>( e[14] );
00497     g_ld[12] = static_cast<long double>( e[ 3] );
00498     g_ld[13] = static_cast<long double>( e[ 7] );
00499     g_ld[14] = static_cast<long double>( e[11] );
00500     g_ld[15] = static_cast<long double>( e[15] );
00501     return g_ld;
00502 }
00503 //-----------------------------------------------------------------------------
00504 //=============================================================================
00505 END_NAMESPACE_TAPs
00506 //345678901234567890123456789012345678901234567890123456789012345678901234567890
00507 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines