Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

OgreMatrix4.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004     (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2005 The OGRE Team
00008 Also see acknowledgements in Readme.html
00009 
00010 This program is free software; you can redistribute it and/or modify it under
00011 the terms of the GNU Lesser General Public License as published by the Free Software
00012 Foundation; either version 2 of the License, or (at your option) any later
00013 version.
00014 
00015 This program is distributed in the hope that it will be useful, but WITHOUT
00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00018 
00019 You should have received a copy of the GNU Lesser General Public License along with
00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
00022 http://www.gnu.org/copyleft/lesser.txt.
00023 -----------------------------------------------------------------------------
00024 */
00025 #ifndef __Matrix4__
00026 #define __Matrix4__
00027 
00028 // Precompiler options
00029 #include "OgrePrerequisites.h"
00030 
00031 #include "OgreVector3.h"
00032 #include "OgreMatrix3.h"
00033 #include "OgreVector4.h"
00034 #include "OgrePlane.h"
00035 namespace Ogre
00036 {
00069     class _OgreExport Matrix4
00070     {
00071     protected:
00073         union {
00074             Real m[4][4];
00075             Real _m[16];
00076         };
00077     public:
00082         inline Matrix4()
00083         {
00084         }
00085 
00086         inline Matrix4(
00087             Real m00, Real m01, Real m02, Real m03,
00088             Real m10, Real m11, Real m12, Real m13,
00089             Real m20, Real m21, Real m22, Real m23,
00090             Real m30, Real m31, Real m32, Real m33 )
00091         {
00092             m[0][0] = m00;
00093             m[0][1] = m01;
00094             m[0][2] = m02;
00095             m[0][3] = m03;
00096             m[1][0] = m10;
00097             m[1][1] = m11;
00098             m[1][2] = m12;
00099             m[1][3] = m13;
00100             m[2][0] = m20;
00101             m[2][1] = m21;
00102             m[2][2] = m22;
00103             m[2][3] = m23;
00104             m[3][0] = m30;
00105             m[3][1] = m31;
00106             m[3][2] = m32;
00107             m[3][3] = m33;
00108         }
00109 
00110         inline Real* operator [] ( size_t iRow )
00111         {
00112             assert( iRow < 4 );
00113             return m[iRow];
00114         }
00115 
00116         inline const Real *const operator [] ( size_t iRow ) const
00117         {
00118             assert( iRow < 4 );
00119             return m[iRow];
00120         }
00121 
00122         inline Matrix4 concatenate(const Matrix4 &m2) const
00123         {
00124             Matrix4 r;
00125             r.m[0][0] = m[0][0] * m2.m[0][0] + m[0][1] * m2.m[1][0] + m[0][2] * m2.m[2][0] + m[0][3] * m2.m[3][0];
00126             r.m[0][1] = m[0][0] * m2.m[0][1] + m[0][1] * m2.m[1][1] + m[0][2] * m2.m[2][1] + m[0][3] * m2.m[3][1];
00127             r.m[0][2] = m[0][0] * m2.m[0][2] + m[0][1] * m2.m[1][2] + m[0][2] * m2.m[2][2] + m[0][3] * m2.m[3][2];
00128             r.m[0][3] = m[0][0] * m2.m[0][3] + m[0][1] * m2.m[1][3] + m[0][2] * m2.m[2][3] + m[0][3] * m2.m[3][3];
00129 
00130             r.m[1][0] = m[1][0] * m2.m[0][0] + m[1][1] * m2.m[1][0] + m[1][2] * m2.m[2][0] + m[1][3] * m2.m[3][0];
00131             r.m[1][1] = m[1][0] * m2.m[0][1] + m[1][1] * m2.m[1][1] + m[1][2] * m2.m[2][1] + m[1][3] * m2.m[3][1];
00132             r.m[1][2] = m[1][0] * m2.m[0][2] + m[1][1] * m2.m[1][2] + m[1][2] * m2.m[2][2] + m[1][3] * m2.m[3][2];
00133             r.m[1][3] = m[1][0] * m2.m[0][3] + m[1][1] * m2.m[1][3] + m[1][2] * m2.m[2][3] + m[1][3] * m2.m[3][3];
00134 
00135             r.m[2][0] = m[2][0] * m2.m[0][0] + m[2][1] * m2.m[1][0] + m[2][2] * m2.m[2][0] + m[2][3] * m2.m[3][0];
00136             r.m[2][1] = m[2][0] * m2.m[0][1] + m[2][1] * m2.m[1][1] + m[2][2] * m2.m[2][1] + m[2][3] * m2.m[3][1];
00137             r.m[2][2] = m[2][0] * m2.m[0][2] + m[2][1] * m2.m[1][2] + m[2][2] * m2.m[2][2] + m[2][3] * m2.m[3][2];
00138             r.m[2][3] = m[2][0] * m2.m[0][3] + m[2][1] * m2.m[1][3] + m[2][2] * m2.m[2][3] + m[2][3] * m2.m[3][3];
00139 
00140             r.m[3][0] = m[3][0] * m2.m[0][0] + m[3][1] * m2.m[1][0] + m[3][2] * m2.m[2][0] + m[3][3] * m2.m[3][0];
00141             r.m[3][1] = m[3][0] * m2.m[0][1] + m[3][1] * m2.m[1][1] + m[3][2] * m2.m[2][1] + m[3][3] * m2.m[3][1];
00142             r.m[3][2] = m[3][0] * m2.m[0][2] + m[3][1] * m2.m[1][2] + m[3][2] * m2.m[2][2] + m[3][3] * m2.m[3][2];
00143             r.m[3][3] = m[3][0] * m2.m[0][3] + m[3][1] * m2.m[1][3] + m[3][2] * m2.m[2][3] + m[3][3] * m2.m[3][3];
00144 
00145             return r;
00146         }
00147 
00150         inline Matrix4 operator * ( const Matrix4 &m2 ) const
00151         {
00152             return concatenate( m2 );
00153         }
00154 
00164         inline Vector3 operator * ( const Vector3 &v ) const
00165         {
00166             Vector3 r;
00167 
00168             Real fInvW = 1.0 / ( m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] );
00169 
00170             r.x = ( m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] ) * fInvW;
00171             r.y = ( m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] ) * fInvW;
00172             r.z = ( m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] ) * fInvW;
00173 
00174             return r;
00175         }
00176         inline Vector4 operator * (const Vector4& v) const
00177         {
00178             return Vector4(
00179                 m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w, 
00180                 m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w,
00181                 m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w,
00182                 m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w
00183                 );
00184         }
00185         inline Plane operator * (const Plane& p) const
00186         {
00187             Plane ret;
00188             ret.normal.x =
00189                 m[0][0] * p.normal.x + m[0][1] * p.normal.y + m[0][2] * p.normal.z;
00190             ret.normal.y = 
00191                 m[1][0] * p.normal.x + m[1][1] * p.normal.y + m[1][2] * p.normal.z;
00192             ret.normal.z = 
00193                 m[2][0] * p.normal.x + m[2][1] * p.normal.y + m[2][2] * p.normal.z;
00194             Vector3 pt = p.normal * -p.d;
00195             pt = *this * pt;
00196             ret.d = - pt.dotProduct(ret.normal);
00197             return ret;
00198         }
00199 
00200 
00203         inline Matrix4 operator + ( const Matrix4 &m2 ) const
00204         {
00205             Matrix4 r;
00206 
00207             r.m[0][0] = m[0][0] + m2.m[0][0];
00208             r.m[0][1] = m[0][1] + m2.m[0][1];
00209             r.m[0][2] = m[0][2] + m2.m[0][2];
00210             r.m[0][3] = m[0][3] + m2.m[0][3];
00211 
00212             r.m[1][0] = m[1][0] + m2.m[1][0];
00213             r.m[1][1] = m[1][1] + m2.m[1][1];
00214             r.m[1][2] = m[1][2] + m2.m[1][2];
00215             r.m[1][3] = m[1][3] + m2.m[1][3];
00216 
00217             r.m[2][0] = m[2][0] + m2.m[2][0];
00218             r.m[2][1] = m[2][1] + m2.m[2][1];
00219             r.m[2][2] = m[2][2] + m2.m[2][2];
00220             r.m[2][3] = m[2][3] + m2.m[2][3];
00221 
00222             r.m[3][0] = m[3][0] + m2.m[3][0];
00223             r.m[3][1] = m[3][1] + m2.m[3][1];
00224             r.m[3][2] = m[3][2] + m2.m[3][2];
00225             r.m[3][3] = m[3][3] + m2.m[3][3];
00226 
00227             return r;
00228         }
00229 
00232         inline Matrix4 operator - ( const Matrix4 &m2 ) const
00233         {
00234             Matrix4 r;
00235             r.m[0][0] = m[0][0] - m2.m[0][0];
00236             r.m[0][1] = m[0][1] - m2.m[0][1];
00237             r.m[0][2] = m[0][2] - m2.m[0][2];
00238             r.m[0][3] = m[0][3] - m2.m[0][3];
00239 
00240             r.m[1][0] = m[1][0] - m2.m[1][0];
00241             r.m[1][1] = m[1][1] - m2.m[1][1];
00242             r.m[1][2] = m[1][2] - m2.m[1][2];
00243             r.m[1][3] = m[1][3] - m2.m[1][3];
00244 
00245             r.m[2][0] = m[2][0] - m2.m[2][0];
00246             r.m[2][1] = m[2][1] - m2.m[2][1];
00247             r.m[2][2] = m[2][2] - m2.m[2][2];
00248             r.m[2][3] = m[2][3] - m2.m[2][3];
00249 
00250             r.m[3][0] = m[3][0] - m2.m[3][0];
00251             r.m[3][1] = m[3][1] - m2.m[3][1];
00252             r.m[3][2] = m[3][2] - m2.m[3][2];
00253             r.m[3][3] = m[3][3] - m2.m[3][3];
00254 
00255             return r;
00256         }
00257 
00260         inline bool operator == ( const Matrix4& m2 ) const
00261         {
00262             if( 
00263                 m[0][0] != m2.m[0][0] || m[0][1] != m2.m[0][1] || m[0][2] != m2.m[0][2] || m[0][3] != m2.m[0][3] ||
00264                 m[1][0] != m2.m[1][0] || m[1][1] != m2.m[1][1] || m[1][2] != m2.m[1][2] || m[1][3] != m2.m[1][3] ||
00265                 m[2][0] != m2.m[2][0] || m[2][1] != m2.m[2][1] || m[2][2] != m2.m[2][2] || m[2][3] != m2.m[2][3] ||
00266                 m[3][0] != m2.m[3][0] || m[3][1] != m2.m[3][1] || m[3][2] != m2.m[3][2] || m[3][3] != m2.m[3][3] )
00267                 return false;
00268             return true;
00269         }
00270 
00273         inline bool operator != ( Matrix4& m2 ) const
00274         {
00275             if( 
00276                 m[0][0] != m2.m[0][0] || m[0][1] != m2.m[0][1] || m[0][2] != m2.m[0][2] || m[0][3] != m2.m[0][3] ||
00277                 m[1][0] != m2.m[1][0] || m[1][1] != m2.m[1][1] || m[1][2] != m2.m[1][2] || m[1][3] != m2.m[1][3] ||
00278                 m[2][0] != m2.m[2][0] || m[2][1] != m2.m[2][1] || m[2][2] != m2.m[2][2] || m[2][3] != m2.m[2][3] ||
00279                 m[3][0] != m2.m[3][0] || m[3][1] != m2.m[3][1] || m[3][2] != m2.m[3][2] || m[3][3] != m2.m[3][3] )
00280                 return true;
00281             return false;
00282         }
00283 
00286         inline void operator = ( const Matrix3& mat3 )
00287         {
00288             m[0][0] = mat3.m[0][0]; m[0][1] = mat3.m[0][1]; m[0][2] = mat3.m[0][2];
00289             m[1][0] = mat3.m[1][0]; m[1][1] = mat3.m[1][1]; m[1][2] = mat3.m[1][2];
00290             m[2][0] = mat3.m[2][0]; m[2][1] = mat3.m[2][1]; m[2][2] = mat3.m[2][2];
00291         }
00292 
00293         inline Matrix4 transpose(void) const
00294         {
00295             return Matrix4(m[0][0], m[1][0], m[2][0], m[3][0],
00296                            m[0][1], m[1][1], m[2][1], m[3][1],
00297                            m[0][2], m[1][2], m[2][2], m[3][2],
00298                            m[0][3], m[1][3], m[2][3], m[3][3]);
00299         }
00300 
00301         /*
00302         -----------------------------------------------------------------------
00303         Translation Transformation
00304         -----------------------------------------------------------------------
00305         */
00308         inline void setTrans( const Vector3& v )
00309         {
00310             m[0][3] = v.x;
00311             m[1][3] = v.y;
00312             m[2][3] = v.z;
00313         }
00314 
00317         inline void makeTrans( const Vector3& v )
00318         {
00319             m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = v.x;
00320             m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = v.y;
00321             m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = v.z;
00322             m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
00323         }
00324 
00325         inline void makeTrans( Real tx, Real ty, Real tz )
00326         {
00327             m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = tx;
00328             m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = ty;
00329             m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = tz;
00330             m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
00331         }
00332 
00335         inline static Matrix4 getTrans( const Vector3& v )
00336         {
00337             Matrix4 r;
00338 
00339             r.m[0][0] = 1.0; r.m[0][1] = 0.0; r.m[0][2] = 0.0; r.m[0][3] = v.x;
00340             r.m[1][0] = 0.0; r.m[1][1] = 1.0; r.m[1][2] = 0.0; r.m[1][3] = v.y;
00341             r.m[2][0] = 0.0; r.m[2][1] = 0.0; r.m[2][2] = 1.0; r.m[2][3] = v.z;
00342             r.m[3][0] = 0.0; r.m[3][1] = 0.0; r.m[3][2] = 0.0; r.m[3][3] = 1.0;
00343 
00344             return r;
00345         }
00346 
00349         inline static Matrix4 getTrans( Real t_x, Real t_y, Real t_z )
00350         {
00351             Matrix4 r;
00352 
00353             r.m[0][0] = 1.0; r.m[0][1] = 0.0; r.m[0][2] = 0.0; r.m[0][3] = t_x;
00354             r.m[1][0] = 0.0; r.m[1][1] = 1.0; r.m[1][2] = 0.0; r.m[1][3] = t_y;
00355             r.m[2][0] = 0.0; r.m[2][1] = 0.0; r.m[2][2] = 1.0; r.m[2][3] = t_z;
00356             r.m[3][0] = 0.0; r.m[3][1] = 0.0; r.m[3][2] = 0.0; r.m[3][3] = 1.0;
00357 
00358             return r;
00359         }
00360 
00361         /*
00362         -----------------------------------------------------------------------
00363         Scale Transformation
00364         -----------------------------------------------------------------------
00365         */
00368         inline void setScale( const Vector3& v )
00369         {
00370             m[0][0] = v.x;
00371             m[1][1] = v.y;
00372             m[2][2] = v.z;
00373         }
00374 
00377         inline static Matrix4 getScale( const Vector3& v )
00378         {
00379             Matrix4 r;
00380             r.m[0][0] = v.x; r.m[0][1] = 0.0; r.m[0][2] = 0.0; r.m[0][3] = 0.0;
00381             r.m[1][0] = 0.0; r.m[1][1] = v.y; r.m[1][2] = 0.0; r.m[1][3] = 0.0;
00382             r.m[2][0] = 0.0; r.m[2][1] = 0.0; r.m[2][2] = v.z; r.m[2][3] = 0.0;
00383             r.m[3][0] = 0.0; r.m[3][1] = 0.0; r.m[3][2] = 0.0; r.m[3][3] = 1.0;
00384 
00385             return r;
00386         }
00387 
00390         inline static Matrix4 getScale( Real s_x, Real s_y, Real s_z )
00391         {
00392             Matrix4 r;
00393             r.m[0][0] = s_x; r.m[0][1] = 0.0; r.m[0][2] = 0.0; r.m[0][3] = 0.0;
00394             r.m[1][0] = 0.0; r.m[1][1] = s_y; r.m[1][2] = 0.0; r.m[1][3] = 0.0;
00395             r.m[2][0] = 0.0; r.m[2][1] = 0.0; r.m[2][2] = s_z; r.m[2][3] = 0.0;
00396             r.m[3][0] = 0.0; r.m[3][1] = 0.0; r.m[3][2] = 0.0; r.m[3][3] = 1.0;
00397 
00398             return r;
00399         }
00400 
00404         inline void extract3x3Matrix(Matrix3& m3x3) const
00405         {
00406             m3x3.m[0][0] = m[0][0];
00407             m3x3.m[0][1] = m[0][1];
00408             m3x3.m[0][2] = m[0][2];
00409             m3x3.m[1][0] = m[1][0];
00410             m3x3.m[1][1] = m[1][1];
00411             m3x3.m[1][2] = m[1][2];
00412             m3x3.m[2][0] = m[2][0];
00413             m3x3.m[2][1] = m[2][1];
00414             m3x3.m[2][2] = m[2][2];
00415 
00416         }
00417 
00418         static const Matrix4 ZERO;
00419         static const Matrix4 IDENTITY;
00422         static const Matrix4 CLIPSPACE2DTOIMAGESPACE;
00423 
00424         inline Matrix4 operator*(Real scalar)
00425         {
00426             return Matrix4(
00427                 scalar*m[0][0], scalar*m[0][1], scalar*m[0][2], scalar*m[0][3],
00428                 scalar*m[1][0], scalar*m[1][1], scalar*m[1][2], scalar*m[1][3],
00429                 scalar*m[2][0], scalar*m[2][1], scalar*m[2][2], scalar*m[2][3],
00430                 scalar*m[3][0], scalar*m[3][1], scalar*m[3][2], scalar*m[3][3]);
00431         }
00432 
00435         inline _OgreExport friend std::ostream& operator <<
00436             ( std::ostream& o, const Matrix4& m )
00437         {
00438             o << "Matrix4(";
00439             for (size_t i = 0; i < 4; ++i)
00440             {
00441                 o << " row" << (unsigned)i << "{";
00442                 for(size_t j = 0; j < 4; ++j)
00443                 {
00444                     o << m[i][j] << " ";
00445                 }
00446                 o << "}";
00447             }
00448             o << ")";
00449             return o;
00450         }
00451         
00452         Matrix4 adjoint() const;
00453         Real determinant() const;
00454         Matrix4 inverse() const;
00455 
00456     };
00457 
00458     /* Removed from Vector4 and made a non-member here because otherwise
00459        OgreMatrix4.h and OgreVector4.h have to try to include and inline each 
00460        other, which frankly doesn't work ;)
00461    */
00462     inline Vector4 operator * (const Vector4& v, const Matrix4& mat)
00463     {
00464         return Vector4(
00465             v.x*mat[0][0] + v.y*mat[1][0] + v.z*mat[2][0] + v.w*mat[3][0],
00466             v.x*mat[0][1] + v.y*mat[1][1] + v.z*mat[2][1] + v.w*mat[3][1],
00467             v.x*mat[0][2] + v.y*mat[1][2] + v.z*mat[2][2] + v.w*mat[3][2],
00468             v.x*mat[0][3] + v.y*mat[1][3] + v.z*mat[2][3] + v.w*mat[3][3]
00469             );
00470     }
00471 
00472 }
00473 #endif

Copyright © 2000-2005 by The OGRE Team
Last modified Wed Feb 23 00:19:08 2005