![]() |
TAPs 0.7.7.3
|
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