![[]](/images/special/trans.gif)
LibN2L-4 Library Code ReferenceClassesCompounds Files Members Method Index Full Reference cMatrix44.hGo to the documentation of this file.00001 /************************************************************************ 00002 Nova-2 Library (libN2L, or simply n2l) Game development C++ Library 00003 Copyright (C) 2002 Aaron Cameron 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Lesser General Public 00007 License as published by the Free Software Foundation; either 00008 version 2.1 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Lesser General Public License for more details. 00014 00015 You should have received a copy of the GNU Lesser General Public 00016 License along with this library; if not, write to the Free Software 00017 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 00019 A copy of the GNU Lesser General Public License has been provided with 00020 this library in the file 'COPYING'. 00021 00022 Contact information for the author of this library has been provided 00023 with this library in the file 'AUTHOR'. 00024 ************************************************************************/ 00025 00026 #ifndef _n2l4_cMatrix44_h 00027 #define _n2l4_cMatrix44_h 00028 00029 #include "n2l/n2l.h" 00030 #include "geometry/cVector3.h" 00031 #include "geometry/misc.h" 00032 #ifdef WIN32 00033 /**********************************************************************/ 00034 // Cross platform hacky thingy. 00035 // There are better ways to do this, one of those better ways should 00036 // eventually be A) learned, and B) done. 00037 00038 using n2l::tFloat; 00039 using n2l::tDouble; 00040 using n2l::tLDouble; 00041 using n2l::cNoResultException; 00042 00043 template <typename T> 00044 struct numeric_limits 00045 { 00046 inline static const T epsilon() { 00047 throw cNoResultException("epsilon does not exist for this type"); 00048 } 00049 }; 00050 00051 template <> 00052 struct numeric_limits<tFloat> 00053 { 00054 inline static const tFloat epsilon() { return 1.19209290e-07F; } 00055 }; 00056 00057 template <> 00058 struct numeric_limits<tDouble> 00059 { 00060 inline static const tDouble epsilon() { 00061 return 2.2204460492503131e-16; } 00062 }; 00063 00064 template <> 00065 struct numeric_limits<tLDouble> 00066 { 00067 inline static const tLDouble epsilon() { 00068 return 1.08420217248550443401e-19L; } 00069 }; 00070 #else 00071 # include <limits> 00072 using std::numeric_limits; 00073 #endif 00074 00075 namespace n2l 00076 { 00077 /**************************************************************************/ 00083 template <class TComponent> 00084 class cMatrix44 00085 { 00086 public: 00087 typedef cMatrix44<TComponent> tThisMatrix; 00088 typedef TComponent tComponent; 00089 typedef cVector3<TComponent,TComponent,TComponent> tVector3; 00090 00095 enum { 00096 _00 = 0, _01 = 4, _02 = 8, _03 = 12, 00097 _10 = 1, _11 = 5, _12 = 9, _13 = 13, 00098 _20 = 2, _21 = 6, _22 = 10, _23 = 14, 00099 _30 = 3, _31 = 7, _32 = 11, _33 = 15 00100 }; 00101 00102 // Constructors 00103 /**********************************************************************/ 00104 cMatrix44() {} 00105 00106 /**********************************************************************/ 00107 cMatrix44( const tThisMatrix &iM ) { set(iM.mM); } 00108 cMatrix44( const tComponent *iM ) { set(iM); } 00109 cMatrix44( 00110 const tComponent &i00, const tComponent &i01, 00111 const tComponent &i02, const tComponent &i03, 00112 const tComponent &i10, const tComponent &i11, 00113 const tComponent &i12, const tComponent &i13, 00114 const tComponent &i20, const tComponent &i21, 00115 const tComponent &i22, const tComponent &i23, 00116 const tComponent &i30, const tComponent &i31, 00117 const tComponent &i32, const tComponent &i33 ) 00118 { 00119 set(i00,i01,i02,i03, i10,i11,i12,i13, 00120 i20,i21,i22,i23, i30,i31,i32,i33 ); 00121 } 00122 00123 /**********************************************************************/ 00124 void eulerRotD( const tVector3 &iRot ) 00125 { 00126 eulerRotD( iRot.x(), iRot.y(), iRot.z() ); 00127 } 00128 00129 /**********************************************************************/ 00130 void eulerRotD( const tComponent &iX, const tComponent &iY, 00131 const tComponent &iZ ) 00132 { 00133 eulerRotR( n2lDegToRad(iX), n2lDegToRad(iY), n2lDegToRad(iZ) ); 00134 } 00135 00136 /**********************************************************************/ 00137 void eulerRotR( const tComponent &iX, const tComponent &iY, 00138 const tComponent &iZ ) 00139 { 00140 const tComponent A = cos( iX ); 00141 const tComponent B = sin( iX ); 00142 const tComponent C = cos( iY ); 00143 const tComponent D = sin( iY ); 00144 const tComponent E = cos( iZ ); 00145 const tComponent F = sin( iZ ); 00146 00147 mM[_00] = C*E; 00148 mM[_01] = -C*F; 00149 mM[_02] = -D; 00150 mM[_03] = 0; 00151 00152 mM[_10] = -B*D*E+A*F; 00153 mM[_11] = B*D*F+A*E; 00154 mM[_12] = -B*C; 00155 mM[_13] = 0; 00156 00157 mM[_20] = A*D*E+B*F; 00158 mM[_21] = -A*D*F+B*E; 00159 mM[_22] = A*C; 00160 mM[_23] = 0; 00161 00162 mM[_30] = 0; 00163 mM[_31] = 0; 00164 mM[_32] = 0; 00165 mM[_33] = 1; 00166 } 00167 00168 /**********************************************************************/ 00169 const tBool containsSpecialNumber() const 00170 { 00171 for (tUint i=0; i<16; ++i) 00172 if (mM[i]-mM[i] != 0) return true; 00173 return false; 00174 } 00175 00176 /**********************************************************************/ 00177 const tBool containsNaN() const 00178 { 00179 for (tUint i=0; i<16; ++i) 00180 if (mM[i] != mM[i]) return true; 00181 return false; 00182 } 00183 00184 /**********************************************************************/ 00185 void fixSpecialNumbers() 00186 { 00187 fixNaN(); 00188 for (tUint i=0; i<16; ++i) 00189 if (mM[i]-mM[i]!=0) mM[i] = 1.0e+35f; 00190 } 00191 00192 /**********************************************************************/ 00193 void fixNaN() 00194 { 00195 for (tUint i=0; i<16; ++i) 00196 if (mM[i] != mM[i]) mM[i] = 0; 00197 } 00198 00199 /**********************************************************************/ 00200 inline void set( 00201 const tComponent &i00, const tComponent &i01, 00202 const tComponent &i02, const tComponent &i03, 00203 const tComponent &i10, const tComponent &i11, 00204 const tComponent &i12, const tComponent &i13, 00205 const tComponent &i20, const tComponent &i21, 00206 const tComponent &i22, const tComponent &i23, 00207 const tComponent &i30, const tComponent &i31, 00208 const tComponent &i32, const tComponent &i33 ) 00209 { 00210 mM[ 0] = i00; mM[ 1] = i10; mM[ 2] = i20; mM[ 3] = i30; 00211 mM[ 4] = i01; mM[ 5] = i11; mM[ 6] = i21; mM[ 7] = i31; 00212 mM[ 8] = i02; mM[ 9] = i12; mM[10] = i22; mM[11] = i32; 00213 mM[12] = i03; mM[13] = i13; mM[14] = i23; mM[15] = i33; 00214 } 00215 00216 /**********************************************************************/ 00217 inline void set( const tComponent *iM ) 00218 { 00219 memmove( (void*)(mM), (void*)(iM), sizeof(tComponent)*16 ); 00220 } 00221 00222 /**********************************************************************/ 00223 inline void set( const tThisMatrix &iM ) { set( iM.mM ); } 00224 00225 /**********************************************************************/ 00226 inline tThisMatrix &operator =( const tComponent *iM ) 00227 { 00228 set(iM); return *this; 00229 } 00230 00231 /**********************************************************************/ 00232 inline tThisMatrix &operator =( const tThisMatrix &iM ) 00233 { 00234 set(iM.mM); return *this; 00235 } 00236 00237 /**********************************************************************/ 00240 void multiply( tThisMatrix &oM, const tThisMatrix &iM ) const 00241 { 00242 oM.mM[ 0] = iM.mM[ 0] * mM[ 0] + iM.mM[ 1] * mM[ 4] + iM.mM[ 2] * 00243 mM[ 8] + iM.mM[ 3] * mM[12]; 00244 00245 oM.mM[ 1] = iM.mM[ 0] * mM[ 1] + iM.mM[ 1] * mM[ 5] + iM.mM[ 2] * 00246 mM[ 9] + iM.mM[ 3] * mM[13]; 00247 00248 oM.mM[ 2] = iM.mM[ 0] * mM[ 2] + iM.mM[ 1] * mM[ 6] + iM.mM[ 2] * 00249 mM[10] + iM.mM[ 3] * mM[14]; 00250 00251 oM.mM[ 3] = iM.mM[ 0] * mM[ 3] + iM.mM[ 1] * mM[ 7] + iM.mM[ 2] * 00252 mM[11] + iM.mM[ 3] * mM[15]; 00253 00254 oM.mM[ 4] = iM.mM[ 4] * mM[ 0] + iM.mM[ 5] * mM[ 4] + iM.mM[ 6] * 00255 mM[ 8] + iM.mM[ 7] * mM[12]; 00256 00257 oM.mM[ 5] = iM.mM[ 4] * mM[ 1] + iM.mM[ 5] * mM[ 5] + iM.mM[ 6] * 00258 mM[ 9] + iM.mM[ 7] * mM[13]; 00259 00260 oM.mM[ 6] = iM.mM[ 4] * mM[ 2] + iM.mM[ 5] * mM[ 6] + iM.mM[ 6] * 00261 mM[10] + iM.mM[ 7] * mM[14]; 00262 00263 oM.mM[ 7] = iM.mM[ 4] * mM[ 3] + iM.mM[ 5] * mM[ 7] + iM.mM[ 6] * 00264 mM[11] + iM.mM[ 7] * mM[15]; 00265 00266 oM.mM[ 8] = iM.mM[ 8] * mM[ 0] + iM.mM[ 9] * mM[ 4] + iM.mM[10] * 00267 mM[ 8] + iM.mM[11] * mM[12]; 00268 00269 oM.mM[ 9] = iM.mM[ 8] * mM[ 1] + iM.mM[ 9] * mM[ 5] + iM.mM[10] * 00270 mM[ 9] + iM.mM[11] * mM[13]; 00271 00272 oM.mM[10] = iM.mM[ 8] * mM[ 2] + iM.mM[ 9] * mM[ 6] + iM.mM[10] * 00273 mM[10] + iM.mM[11] * mM[14]; 00274 00275 oM.mM[11] = iM.mM[ 8] * mM[ 3] + iM.mM[ 9] * mM[ 7] + iM.mM[10] * 00276 mM[11] + iM.mM[11] * mM[15]; 00277 00278 oM.mM[12] = iM.mM[12] * mM[ 0] + iM.mM[13] * mM[ 4] + iM.mM[14] * 00279 mM[ 8] + iM.mM[15] * mM[12]; 00280 00281 oM.mM[13] = iM.mM[12] * mM[ 1] + iM.mM[13] * mM[ 5] + iM.mM[14] * 00282 mM[ 9] + iM.mM[15] * mM[13]; 00283 00284 oM.mM[14] = iM.mM[12] * mM[ 2] + iM.mM[13] * mM[ 6] + iM.mM[14] * 00285 mM[10] + iM.mM[15] * mM[14]; 00286 00287 oM.mM[15] = iM.mM[12] * mM[ 3] + iM.mM[13] * mM[ 7] + iM.mM[14] * 00288 mM[11] + iM.mM[15] * mM[15]; 00289 } 00290 00291 /**********************************************************************/ 00300 tVector3 &multiply( tVector3 &oV, const tVector3 &iV ) const 00301 { 00302 oV[0] = iV[0] * mM[ 0] + iV[1] * mM[ 4] + iV[2] * mM[ 8]; 00303 oV[1] = iV[0] * mM[ 1] + iV[1] * mM[ 5] + iV[2] * mM[ 9]; 00304 oV[2] = iV[0] * mM[ 2] + iV[1] * mM[ 6] + iV[2] * mM[10]; 00305 return oV; 00306 } 00307 const tVector3 multiply( const tVector3 &iV ) const 00308 { 00309 tVector3 oV; 00310 oV[0] = iV[0] * mM[ 0] + iV[1] * mM[ 4] + iV[2] * mM[ 8]; 00311 oV[1] = iV[0] * mM[ 1] + iV[1] * mM[ 5] + iV[2] * mM[ 9]; 00312 oV[2] = iV[0] * mM[ 2] + iV[1] * mM[ 6] + iV[2] * mM[10]; 00313 return oV; 00314 } 00315 00316 /**********************************************************************/ 00317 tVector3 &multiply34( tVector3 &oV, const tVector3 &iV ) const 00318 { 00319 oV[ 0] = iV[ 0] * mM[ 0] + iV[ 1] * mM[ 4] + iV[ 2] * mM[ 8] + 00320 mM[12]; 00321 00322 oV[ 1] = iV[ 0] * mM[ 1] + iV[ 1] * mM[ 5] + iV[ 2] * mM[ 9] + 00323 mM[13]; 00324 00325 oV[ 2] = iV[ 0] * mM[ 2] + iV[ 1] * mM[ 6] + iV[ 2] * mM[10] + 00326 mM[14]; 00327 00328 return oV; 00329 } 00330 00331 /**********************************************************************/ 00332 const tVector3 multiply34( const tVector3 &iV ) const 00333 { 00334 tVector3 oV; 00335 oV[ 0] = iV[ 0] * mM[ 0] + iV[ 1] * mM[ 4] + iV[ 2] * mM[ 8] + 00336 mM[12]; 00337 00338 oV[ 1] = iV[ 0] * mM[ 1] + iV[ 1] * mM[ 5] + iV[ 2] * mM[ 9] + 00339 mM[13]; 00340 00341 oV[ 2] = iV[ 0] * mM[ 2] + iV[ 1] * mM[ 6] + iV[ 2] * mM[10] + 00342 mM[14]; 00343 00344 return oV; 00345 } 00346 00347 /**********************************************************************/ 00348 void multiply( tFloat oV[4], const tFloat iV[4] ) const 00349 { 00350 oV[ 0] = iV[ 0] * mM[ 0] + iV[ 1] * mM[ 4] + iV[ 2] * mM[ 8] + 00351 iV[ 3] * mM[12]; 00352 00353 oV[ 1] = iV[ 0] * mM[ 1] + iV[ 1] * mM[ 5] + iV[ 2] * mM[ 9] + 00354 iV[ 3] * mM[13]; 00355 00356 oV[ 2] = iV[ 0] * mM[ 2] + iV[ 1] * mM[ 6] + iV[ 2] * mM[10] + 00357 iV[ 3] * mM[14]; 00358 00359 oV[ 3] = iV[ 0] * mM[ 3] + iV[ 1] * mM[ 7] + iV[ 2] * mM[11] + 00360 iV[ 3] * mM[15]; 00361 } 00362 00363 /**********************************************************************/ 00366 void transposed( tThisMatrix &oM ) const 00367 { 00368 oM[_00] = mM[_00]; oM[_01] = mM[_10]; oM[_02] = mM[_20]; 00369 oM[_03] = mM[_30]; 00370 00371 oM[_10] = mM[_01]; oM[_11] = mM[_11]; oM[_12] = mM[_21]; 00372 oM[_13] = mM[_31]; 00373 00374 oM[_20] = mM[_02]; oM[_21] = mM[_12]; oM[_22] = mM[_22]; 00375 oM[_23] = mM[_32]; 00376 00377 oM[_30] = mM[_03]; oM[_31] = mM[_13]; oM[_32] = mM[_23]; 00378 oM[_33] = mM[_33]; 00379 } 00380 00381 /**********************************************************************/ 00384 void operator *= ( const tThisMatrix &iM ) 00385 { 00386 static tThisMatrix temp; 00387 multiply(temp, iM); 00388 set(temp); 00389 } 00390 00391 /**********************************************************************/ 00392 const tThisMatrix operator *( const tThisMatrix &iM ) const 00393 { 00394 tThisMatrix temp; 00395 tComponent *rM = temp.data(); 00396 rM[ 0] = iM.mM[ 0] * mM[ 0] + iM.mM[ 1] * mM[ 4] + iM.mM[ 2] * 00397 mM[ 8] + iM.mM[ 3] * mM[12]; 00398 00399 rM[ 1] = iM.mM[ 0] * mM[ 1] + iM.mM[ 1] * mM[ 5] + iM.mM[ 2] * 00400 mM[ 9] + iM.mM[ 3] * mM[13]; 00401 00402 rM[ 2] = iM.mM[ 0] * mM[ 2] + iM.mM[ 1] * mM[ 6] + iM.mM[ 2] * 00403 mM[10] + iM.mM[ 3] * mM[14]; 00404 00405 rM[ 3] = iM.mM[ 0] * mM[ 3] + iM.mM[ 1] * mM[ 7] + iM.mM[ 2] * 00406 mM[11] + iM.mM[ 3] * mM[15]; 00407 00408 rM[ 4] = iM.mM[ 4] * mM[ 0] + iM.mM[ 5] * mM[ 4] + iM.mM[ 6] * 00409 mM[ 8] + iM.mM[ 7] * mM[12]; 00410 00411 rM[ 5] = iM.mM[ 4] * mM[ 1] + iM.mM[ 5] * mM[ 5] + iM.mM[ 6] * 00412 mM[ 9] + iM.mM[ 7] * mM[13]; 00413 rM[ 6] = iM.mM[ 4] * mM[ 2] + iM.mM[ 5] * mM[ 6] + iM.mM[ 6] * 00414 mM[10] + iM.mM[ 7] * mM[14]; 00415 00416 rM[ 7] = iM.mM[ 4] * mM[ 3] + iM.mM[ 5] * mM[ 7] + iM.mM[ 6] * 00417 mM[11] + iM.mM[ 7] * mM[15]; 00418 00419 rM[ 8] = iM.mM[ 8] * mM[ 0] + iM.mM[ 9] * mM[ 4] + iM.mM[10] * 00420 mM[ 8] + iM.mM[11] * mM[12]; 00421 00422 rM[ 9] = iM.mM[ 8] * mM[ 1] + iM.mM[ 9] * mM[ 5] + iM.mM[10] * 00423 mM[ 9] + iM.mM[11] * mM[13]; 00424 00425 rM[10] = iM.mM[ 8] * mM[ 2] + iM.mM[ 9] * mM[ 6] + iM.mM[10] * 00426 mM[10] + iM.mM[11] * mM[14]; 00427 00428 rM[11] = iM.mM[ 8] * mM[ 3] + iM.mM[ 9] * mM[ 7] + iM.mM[10] * 00429 mM[11] + iM.mM[11] * mM[15]; 00430 00431 rM[12] = iM.mM[12] * mM[ 0] + iM.mM[13] * mM[ 4] + iM.mM[14] * 00432 mM[ 8] + iM.mM[15] * mM[12]; 00433 00434 rM[13] = iM.mM[12] * mM[ 1] + iM.mM[13] * mM[ 5] + iM.mM[14] * 00435 mM[ 9] + iM.mM[15] * mM[13]; 00436 00437 rM[14] = iM.mM[12] * mM[ 2] + iM.mM[13] * mM[ 6] + iM.mM[14] * 00438 mM[10] + iM.mM[15] * mM[14]; 00439 00440 rM[15] = iM.mM[12] * mM[ 3] + iM.mM[13] * mM[ 7] + iM.mM[14] * 00441 mM[11] + iM.mM[15] * mM[15]; 00442 00443 return temp; 00444 } 00445 00446 /**********************************************************************/ 00447 const tComponent determinant() const 00448 { 00449 const tComponent Det1 = mM[_12] * mM[_23] - mM[_22] * mM[_13]; 00450 const tComponent Det2 = mM[_11] * mM[_23] - mM[_21] * mM[_13]; 00451 const tComponent Det3 = mM[_11] * mM[_22] - mM[_21] * mM[_12]; 00452 const tComponent Det4 = mM[_10] * mM[_23] - mM[_20] * mM[_13]; 00453 const tComponent Det5 = mM[_10] * mM[_22] - mM[_20] * mM[_12]; 00454 const tComponent Det6 = mM[_10] * mM[_21] - mM[_20] * mM[_11]; 00455 return 00456 -mM[_30] * (mM[_01]*Det1 - mM[_02]*Det2 + mM[_03]*Det3) + 00457 mM[_31] * (mM[_00]*Det1 - mM[_02]*Det4 + mM[_03]*Det5) - 00458 mM[_32] * (mM[_00]*Det2 - mM[_01]*Det4 + mM[_03]*Det6) + 00459 mM[_33] * (mM[_00]*Det3 - mM[_01]*Det5 + mM[_02]*Det6); 00460 } 00461 00462 /**********************************************************************/ 00470 const tThisMatrix inverse() const 00471 { 00472 tThisMatrix inv; 00473 00474 const tComponent Det01 = mM[_12] * mM[_23] - mM[_22] * mM[_13]; 00475 const tComponent Det02 = mM[_11] * mM[_23] - mM[_21] * mM[_13]; 00476 const tComponent Det03 = mM[_11] * mM[_22] - mM[_21] * mM[_12]; 00477 const tComponent Det04 = mM[_10] * mM[_23] - mM[_20] * mM[_13]; 00478 const tComponent Det05 = mM[_10] * mM[_22] - mM[_20] * mM[_12]; 00479 const tComponent Det06 = mM[_10] * mM[_21] - mM[_20] * mM[_11]; 00480 00481 tComponent det = 00482 -mM[_30] * (mM[_01]*Det01 - mM[_02]*Det02 + mM[_03]*Det03) + 00483 mM[_31] * (mM[_00]*Det01 - mM[_02]*Det04 + mM[_03]*Det05) - 00484 mM[_32] * (mM[_00]*Det02 - mM[_01]*Det04 + mM[_03]*Det06) + 00485 mM[_33] * (mM[_00]*Det03 - mM[_01]*Det05 + mM[_02]*Det06); 00486 00487 if ((det<0?-det:det) < numeric_limits<tComponent>::epsilon()) { 00488 inv.zero(); 00489 return inv; 00490 } 00491 00492 // calculate (transposed cofactor matrix / determinant of given 00493 // matrix) 00494 const tComponent Det07 = mM[_22] * mM[_33] - mM[_23] * mM[_32]; 00495 const tComponent Det08 = mM[_23] * mM[_31] - mM[_21] * mM[_33]; 00496 const tComponent Det09 = mM[_21] * mM[_32] - mM[_22] * mM[_31]; 00497 const tComponent Det10 = mM[_02] * mM[_33] - mM[_03] * mM[_32]; 00498 const tComponent Det11 = mM[_03] * mM[_31] - mM[_01] * mM[_33]; 00499 const tComponent Det12 = mM[_01] * mM[_32] - mM[_02] * mM[_31]; 00500 const tComponent Det13 = mM[_02] * mM[_13] - mM[_03] * mM[_12]; 00501 const tComponent Det14 = mM[_03] * mM[_11] - mM[_01] * mM[_13]; 00502 const tComponent Det15 = mM[_01] * mM[_12] - mM[_02] * mM[_11]; 00503 const tComponent Det16 = mM[_20] * mM[_33] - mM[_23] * mM[_30]; 00504 const tComponent Det17 = mM[_22] * mM[_30] - mM[_20] * mM[_32]; 00505 const tComponent Det18 = mM[_00] * mM[_33] - mM[_03] * mM[_30]; 00506 const tComponent Det19 = mM[_02] * mM[_30] - mM[_00] * mM[_32]; 00507 const tComponent Det20 = mM[_00] * mM[_13] - mM[_03] * mM[_10]; 00508 const tComponent Det21 = mM[_02] * mM[_10] - mM[_00] * mM[_12]; 00509 const tComponent Det22 = mM[_20] * mM[_31] - mM[_21] * mM[_30]; 00510 const tComponent Det23 = mM[_00] * mM[_31] - mM[_01] * mM[_30]; 00511 const tComponent Det24 = mM[_00] * mM[_11] - mM[_01] * mM[_10]; 00512 00513 det = 1 / det; 00514 00515 inv.mM[_00] = det * (mM[_11] * Det07 + mM[_12] * Det08 + 00516 mM[_13] * Det09); 00517 00518 inv.mM[_01] = det * (mM[_21] * Det10 + mM[_22] * Det11 + 00519 mM[_23] * Det12); 00520 00521 inv.mM[_02] = det * (mM[_31] * Det13 + mM[_32] * Det14 + 00522 mM[_33] * Det15); 00523 00524 inv.mM[_03] = det * (mM[_01] * -Det01 + mM[_02] * Det02 + 00525 mM[_03] * -Det03); 00526 00527 inv.mM[_10] = det * (mM[_12] * Det16 + mM[_13] * Det17 - 00528 mM[_10] * Det07); 00529 00530 inv.mM[_11] = det * (mM[_22] * Det18 + mM[_23] * Det19 - 00531 mM[_20] * Det10); 00532 00533 inv.mM[_12] = det * (mM[_32] * Det20 + mM[_33] * Det21 - 00534 mM[_30] * Det13); 00535 00536 inv.mM[_13] = det * (mM[_02] * -Det04 + mM[_03] * Det05 + 00537 mM[_00] * Det01); 00538 00539 inv.mM[_20] = det * (mM[_13] * Det22 - mM[_10] * Det08 - 00540 mM[_11] * Det16); 00541 00542 inv.mM[_21] = det * (mM[_23] * Det23 - mM[_20] * Det11 - 00543 mM[_21] * Det18); 00544 00545 inv.mM[_22] = det * (mM[_33] * Det24 - mM[_30] * Det14 - 00546 mM[_31] * Det20); 00547 00548 inv.mM[_23] = det * (mM[_03] * -Det06 + mM[_00] * -Det02 + 00549 mM[_01] * Det04); 00550 00551 inv.mM[_30] = det * (mM[_10] * -Det09 - mM[_11] * Det17 - 00552 mM[_12] * Det22); 00553 00554 inv.mM[_31] = det * (mM[_20] * -Det12 - mM[_21] * Det19 - 00555 mM[_22] * Det23); 00556 00557 inv.mM[_32] = det * (mM[_30] * -Det15 - mM[_31] * Det21 - 00558 mM[_32] * Det24); 00559 00560 inv.mM[_33] = det * (mM[_00] * Det03 + mM[_01] * -Det05 + 00561 mM[_02] * Det06); 00562 00563 return inv; 00564 } 00565 00566 /**********************************************************************/ 00567 inline void invert() 00568 { 00569 tThisMatrix temp; 00570 temp = inverse(); 00571 set(temp); 00572 } 00573 00574 /**********************************************************************/ 00577 inline tComponent *const data() { return mM; } 00578 inline const tComponent *const data() const { return mM; } 00579 00580 /**********************************************************************/ 00583 const tComponent &operator ()( const tUint iRow, 00584 const tUint iCol ) const 00585 { 00586 assert(iRow<4 && iCol<4); 00587 return mM[ iCol*4+iRow ]; 00588 } 00589 00590 tComponent &operator ()( const tUint iRow, const tUint iCol ) 00591 { 00592 assert(iRow<4 && iCol<4); 00593 return mM[ iCol*4+iRow ]; 00594 } 00595 00596 inline tComponent &at( const tUint iRow, const tUint iCol ) 00597 { 00598 return (*this)(iRow,iCol); 00599 } 00600 00601 inline const tComponent &at( const tUint iRow, 00602 const tUint iCol ) const 00603 { 00604 return (*this)(iRow,iCol); 00605 } 00606 00607 /**********************************************************************/ 00608 inline void row( const tUint iRow, 00609 const tComponent &i0, const tComponent &i1, 00610 const tComponent &i2, const tComponent &i3 ) 00611 { 00612 at(iRow,0) = i0; at(iRow,1) = i1; 00613 at(iRow,2) = i2; at(iRow,3) = i3; 00614 } 00615 00616 /**********************************************************************/ 00617 inline void column( const tUint iCol, 00618 const tComponent &i0, const tComponent &i1, 00619 const tComponent &i2, const tComponent &i3 ) 00620 { 00621 at(0,iCol) = i0; at(1,iCol) = i1; 00622 at(2,iCol) = i2; at(3,iCol) = i3; 00623 } 00624 00625 00626 /**********************************************************************/ 00627 inline const tComponent &operator []( const tUint iI ) const 00628 { 00629 assert(iI<16); 00630 return mM[iI]; 00631 } 00632 00633 inline tComponent &operator []( const tUint iI ) 00634 { 00635 assert(iI<16); 00636 return mM[iI]; 00637 } 00638 00639 /**********************************************************************/ 00645 tThisMatrix &identity() 00646 { 00647 mM[ 0] = 1; mM[ 4] = 0; mM[ 8] = 0; mM[12] = 0; 00648 mM[ 1] = 0; mM[ 5] = 1; mM[ 9] = 0; mM[13] = 0; 00649 mM[ 2] = 0; mM[ 6] = 0; mM[10] = 1; mM[14] = 0; 00650 mM[ 3] = 0; mM[ 7] = 0; mM[11] = 0; mM[15] = 1; 00651 return *this; 00652 } 00653 00654 /**********************************************************************/ 00655 inline void zero() 00656 { 00657 memset( (void*)(mM), 0, sizeof(tComponent)*16 ); 00658 } 00659 00660 /**********************************************************************/ 00661 inline const tBool isZero() const 00662 { 00663 for (tUint i=0; i<16; ++i) 00664 if (mM[i]!=0) return false; 00665 return true; 00666 } 00667 00668 /**********************************************************************/ 00669 const tString dump() 00670 { 00671 tString temp; 00672 for (tUint r=0; r<4; ++r) { 00673 temp += "["; 00674 for (tUint c=0; c<4; ++c) { 00675 temp += asString(at(r,c)); 00676 temp += (c+1==4?" ]\n":","); 00677 } 00678 } 00679 return temp; 00680 } 00681 00682 private: 00683 tComponent mM[16]; 00684 00685 }; // class 00686 00687 00688 } // namespace 00689 00690 #endif |