AaronCameron.net
Not Left, nor right. Just correct.
Not a Member? - Login or Create an Account
Wednesday the 23rd of May 2012 @ 04:12pm
Front Page Journal Projects Your Profile About
[]

LibN2L-4 Library Code Reference

Classes
Compounds
Files
Members
Method Index
Full Reference

cMatrix44.h

Go 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
©2012 Aaron Cameron