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 #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 © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:33 2004