Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound 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 © 2000-2002 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 namespace Ogre
00035 {
00068     class _OgreExport Matrix4
00069     {
00070     protected:
00072         union {
00073             Real m[4][4];
00074             Real _m[16];
00075         };
00076     public:
00081         inline Matrix4()
00082         {
00083         }
00084 
00085         inline Matrix4(
00086             Real m00, Real m01, Real m02, Real m03,
00087             Real m10, Real m11, Real m12, Real m13,
00088             Real m20, Real m21, Real m22, Real m23,
00089             Real m30, Real m31, Real m32, Real m33 )
00090         {
00091             m[0][0] = m00;
00092             m[0][1] = m01;
00093             m[0][2] = m02;
00094             m[0][3] = m03;
00095             m[1][0] = m10;
00096             m[1][1] = m11;
00097             m[1][2] = m12;
00098             m[1][3] = m13;
00099             m[2][0] = m20;
00100             m[2][1] = m21;
00101             m[2][2] = m22;
00102             m[2][3] = m23;
00103             m[3][0] = m30;
00104             m[3][1] = m31;
00105             m[3][2] = m32;
00106             m[3][3] = m33;
00107         }
00108 
00109         inline Real* operator [] ( size_t iRow )
00110         {
00111             assert( iRow < 4 );
00112             return m[iRow];
00113         }
00114 
00115         inline const Real *const operator [] ( size_t iRow ) const
00116         {
00117             assert( iRow < 4 );
00118             return m[iRow];
00119         }
00120 
00121         inline Matrix4 concatenate(const Matrix4 &m2) const
00122         {
00123             Matrix4 r;
00124             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];
00125             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];
00126             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];
00127             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];
00128 
00129             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];
00130             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];
00131             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];
00132             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];
00133 
00134             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];
00135             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];
00136             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];
00137             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];
00138 
00139             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];
00140             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];
00141             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];
00142             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];
00143 
00144             return r;
00145         }
00146 
00149         inline Matrix4 operator * ( const Matrix4 &m2 ) const
00150         {
00151             return concatenate( m2 );
00152         }
00153 
00163         inline Vector3 operator * ( const Vector3 &v ) const
00164         {
00165             Vector3 r;
00166 
00167             Real fInvW = 1.0 / ( m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] );
00168 
00169             r.x = ( m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] ) * fInvW;
00170             r.y = ( m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] ) * fInvW;
00171             r.z = ( m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] ) * fInvW;
00172 
00173             return r;
00174         }
00175         inline Vector4 operator * (const Vector4& v) const
00176         {
00177             return Vector4(
00178                 m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w, 
00179                 m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w,
00180                 m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w,
00181                 m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w
00182                 );
00183         }
00184 
00185 
00188         inline Matrix4 operator + ( const Matrix4 &m2 ) const
00189         {
00190             Matrix4 r;
00191 
00192             r.m[0][0] = m[0][0] + m2.m[0][0];
00193             r.m[0][1] = m[0][1] + m2.m[0][1];
00194             r.m[0][2] = m[0][2] + m2.m[0][2];
00195             r.m[0][3] = m[0][3] + m2.m[0][3];
00196 
00197             r.m[1][0] = m[1][0] + m2.m[1][0];
00198             r.m[1][1] = m[1][1] + m2.m[1][1];
00199             r.m[1][2] = m[1][2] + m2.m[1][2];
00200             r.m[1][3] = m[1][3] + m2.m[1][3];
00201 
00202             r.m[2][0] = m[2][0] + m2.m[2][0];
00203             r.m[2][1] = m[2][1] + m2.m[2][1];
00204             r.m[2][2] = m[2][2] + m2.m[2][2];
00205             r.m[2][3] = m[2][3] + m2.m[2][3];
00206 
00207             r.m[3][0] = m[3][0] + m2.m[3][0];
00208             r.m[3][1] = m[3][1] + m2.m[3][1];
00209             r.m[3][2] = m[3][2] + m2.m[3][2];
00210             r.m[3][3] = m[3][3] + m2.m[3][3];
00211 
00212             return r;
00213         }
00214 
00217         inline Matrix4 operator - ( const Matrix4 &m2 ) const
00218         {
00219             Matrix4 r;
00220             r.m[0][0] = m[0][0] - m2.m[0][0];
00221             r.m[0][1] = m[0][1] - m2.m[0][1];
00222             r.m[0][2] = m[0][2] - m2.m[0][2];
00223             r.m[0][3] = m[0][3] - m2.m[0][3];
00224 
00225             r.m[1][0] = m[1][0] - m2.m[1][0];
00226             r.m[1][1] = m[1][1] - m2.m[1][1];
00227             r.m[1][2] = m[1][2] - m2.m[1][2];
00228             r.m[1][3] = m[1][3] - m2.m[1][3];
00229 
00230             r.m[2][0] = m[2][0] - m2.m[2][0];
00231             r.m[2][1] = m[2][1] - m2.m[2][1];
00232             r.m[2][2] = m[2][2] - m2.m[2][2];
00233             r.m[2][3] = m[2][3] - m2.m[2][3];
00234 
00235             r.m[3][0] = m[3][0] - m2.m[3][0];
00236             r.m[3][1] = m[3][1] - m2.m[3][1];
00237             r.m[3][2] = m[3][2] - m2.m[3][2];
00238             r.m[3][3] = m[3][3] - m2.m[3][3];
00239 
00240             return r;
00241         }
00242 
00245         inline bool operator == ( const Matrix4& m2 ) const
00246         {
00247             if( 
00248                 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] ||
00249                 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] ||
00250                 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] ||
00251                 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] )
00252                 return false;
00253             return true;
00254         }
00255 
00258         inline bool operator != ( Matrix4& m2 ) const
00259         {
00260             if( 
00261                 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] ||
00262                 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] ||
00263                 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] ||
00264                 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] )
00265                 return true;
00266             return false;
00267         }
00268 
00271         inline void operator = ( const Matrix3& mat3 )
00272         {
00273             m[0][0] = mat3.m[0][0]; m[0][1] = mat3.m[0][1]; m[0][2] = mat3.m[0][2];
00274             m[1][0] = mat3.m[1][0]; m[1][1] = mat3.m[1][1]; m[1][2] = mat3.m[1][2];
00275             m[2][0] = mat3.m[2][0]; m[2][1] = mat3.m[2][1]; m[2][2] = mat3.m[2][2];
00276         }
00277 
00278         inline Matrix4 transpose(void) const
00279         {
00280             return Matrix4(m[0][0], m[1][0], m[2][0], m[3][0],
00281                            m[0][1], m[1][1], m[2][1], m[3][1],
00282                            m[0][2], m[1][2], m[2][2], m[3][2],
00283                            m[0][3], m[1][3], m[2][3], m[3][3]);
00284         }
00285 
00286         /*
00287         -----------------------------------------------------------------------
00288         Translation Transformation
00289         -----------------------------------------------------------------------
00290         */
00293         inline void setTrans( const Vector3& v )
00294         {
00295             m[0][3] = v.x;
00296             m[1][3] = v.y;
00297             m[2][3] = v.z;
00298         }
00299 
00302         inline void makeTrans( const Vector3& v )
00303         {
00304             m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = v.x;
00305             m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = v.y;
00306             m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = v.z;
00307             m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
00308         }
00309 
00310         inline void makeTrans( Real tx, Real ty, Real tz )
00311         {
00312             m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = tx;
00313             m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = ty;
00314             m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = tz;
00315             m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
00316         }
00317 
00320         inline static Matrix4 getTrans( const Vector3& v )
00321         {
00322             Matrix4 r;
00323 
00324             r.m[0][0] = 1.0; r.m[0][1] = 0.0; r.m[0][2] = 0.0; r.m[0][3] = v.x;
00325             r.m[1][0] = 0.0; r.m[1][1] = 1.0; r.m[1][2] = 0.0; r.m[1][3] = v.y;
00326             r.m[2][0] = 0.0; r.m[2][1] = 0.0; r.m[2][2] = 1.0; r.m[2][3] = v.z;
00327             r.m[3][0] = 0.0; r.m[3][1] = 0.0; r.m[3][2] = 0.0; r.m[3][3] = 1.0;
00328 
00329             return r;
00330         }
00331 
00334         inline static Matrix4 getTrans( Real t_x, Real t_y, Real t_z )
00335         {
00336             Matrix4 r;
00337 
00338             r.m[0][0] = 1.0; r.m[0][1] = 0.0; r.m[0][2] = 0.0; r.m[0][3] = t_x;
00339             r.m[1][0] = 0.0; r.m[1][1] = 1.0; r.m[1][2] = 0.0; r.m[1][3] = t_y;
00340             r.m[2][0] = 0.0; r.m[2][1] = 0.0; r.m[2][2] = 1.0; r.m[2][3] = t_z;
00341             r.m[3][0] = 0.0; r.m[3][1] = 0.0; r.m[3][2] = 0.0; r.m[3][3] = 1.0;
00342 
00343             return r;
00344         }
00345 
00346         /*
00347         -----------------------------------------------------------------------
00348         Scale Transformation
00349         -----------------------------------------------------------------------
00350         */
00353         inline void setScale( const Vector3& v )
00354         {
00355             m[0][0] = v.x;
00356             m[1][1] = v.y;
00357             m[2][2] = v.z;
00358         }
00359 
00362         inline static Matrix4 getScale( const Vector3& v )
00363         {
00364             Matrix4 r;
00365             r.m[0][0] = v.x; r.m[0][1] = 0.0; r.m[0][2] = 0.0; r.m[0][3] = 0.0;
00366             r.m[1][0] = 0.0; r.m[1][1] = v.y; r.m[1][2] = 0.0; r.m[1][3] = 0.0;
00367             r.m[2][0] = 0.0; r.m[2][1] = 0.0; r.m[2][2] = v.z; r.m[2][3] = 0.0;
00368             r.m[3][0] = 0.0; r.m[3][1] = 0.0; r.m[3][2] = 0.0; r.m[3][3] = 1.0;
00369 
00370             return r;
00371         }
00372 
00375         inline static Matrix4 getScale( Real s_x, Real s_y, Real s_z )
00376         {
00377             Matrix4 r;
00378             r.m[0][0] = s_x; r.m[0][1] = 0.0; r.m[0][2] = 0.0; r.m[0][3] = 0.0;
00379             r.m[1][0] = 0.0; r.m[1][1] = s_y; r.m[1][2] = 0.0; r.m[1][3] = 0.0;
00380             r.m[2][0] = 0.0; r.m[2][1] = 0.0; r.m[2][2] = s_z; r.m[2][3] = 0.0;
00381             r.m[3][0] = 0.0; r.m[3][1] = 0.0; r.m[3][2] = 0.0; r.m[3][3] = 1.0;
00382 
00383             return r;
00384         }
00385 
00389         inline void extract3x3Matrix(Matrix3& m3x3) const
00390         {
00391             m3x3.m[0][0] = m[0][0];
00392             m3x3.m[0][1] = m[0][1];
00393             m3x3.m[0][2] = m[0][2];
00394             m3x3.m[1][0] = m[1][0];
00395             m3x3.m[1][1] = m[1][1];
00396             m3x3.m[1][2] = m[1][2];
00397             m3x3.m[2][0] = m[2][0];
00398             m3x3.m[2][1] = m[2][1];
00399             m3x3.m[2][2] = m[2][2];
00400 
00401         }
00402 
00403         static const Matrix4 ZERO;
00404         static const Matrix4 IDENTITY;
00407         static const Matrix4 CLIPSPACE2DTOIMAGESPACE;
00408 
00409         inline Matrix4 operator*(Real scalar)
00410         {
00411             return Matrix4(
00412                 scalar*m[0][0], scalar*m[0][1], scalar*m[0][2], scalar*m[0][3],
00413                 scalar*m[1][0], scalar*m[1][1], scalar*m[1][2], scalar*m[1][3],
00414                 scalar*m[2][0], scalar*m[2][1], scalar*m[2][2], scalar*m[2][3],
00415                 scalar*m[3][0], scalar*m[3][1], scalar*m[3][2], scalar*m[3][3]);
00416         }
00417 
00420         inline _OgreExport friend std::ostream& operator <<
00421             ( std::ostream& o, const Matrix4& m )
00422         {
00423             o << "Matrix4(";
00424             for (size_t i = 0; i < 4; ++i)
00425             {
00426                 o << " row" << (unsigned)i << "{";
00427                 for(size_t j = 0; j < 4; ++j)
00428                 {
00429                     o << m[i][j] << " ";
00430                 }
00431                 o << "}";
00432             }
00433             o << ")";
00434             return o;
00435         }
00436         
00437         Matrix4 adjoint() const;
00438         Real determinant() const;
00439         Matrix4 inverse() const;
00440 
00441     };
00442 
00443     /* Removed from Vector4 and made a non-member here because otherwise
00444        OgreMatrix4.h and OgreVector4.h have to try to include and inline each 
00445        other, which frankly doesn't work ;)
00446    */
00447     inline Vector4 operator * (const Vector4& v, const Matrix4& mat)
00448     {
00449         return Vector4(
00450             v.x*mat[0][0] + v.y*mat[1][0] + v.z*mat[2][0] + v.w*mat[3][0],
00451             v.x*mat[0][1] + v.y*mat[1][1] + v.z*mat[2][1] + v.w*mat[3][1],
00452             v.x*mat[0][2] + v.y*mat[1][2] + v.z*mat[2][2] + v.w*mat[3][2],
00453             v.x*mat[0][3] + v.y*mat[1][3] + v.z*mat[2][3] + v.w*mat[3][3]
00454             );
00455     }
00456 
00457 }
00458 #endif

Copyright © 2002-2003 by The OGRE Team
Last modified Fri May 14 23:22:24 2004