csgeom/matrix4.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 1998,1999,2000 by Jorrit Tyberghein 00003 Largely rewritten by Ivan Avramovic <ivan@avramovic.com> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 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 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public 00016 License along with this library; if not, write to the Free 00017 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 */ 00019 00020 #ifndef __CS_MATRIX4_H__ 00021 #define __CS_MATRIX4_H__ 00022 00030 #include "csextern.h" 00031 #include "csgeom/transfrm.h" 00032 #include "csgeom/vector4.h" 00033 #include "csutil/csstring.h" 00034 00035 namespace CS 00036 { 00037 namespace Math 00038 { 00042 class CS_CRYSTALSPACE_EXPORT Matrix4 00043 { 00044 public: 00045 float m11, m12, m13, m14; 00046 float m21, m22, m23, m24; 00047 float m31, m32, m33, m34; 00048 float m41, m42, m43, m44; 00049 00050 public: 00052 Matrix4 () 00053 : m11(1), m12(0), m13(0), m14(0), 00054 m21(0), m22(1), m23(0), m24(0), 00055 m31(0), m32(0), m33(1), m34(0), 00056 m41(0), m42(0), m43(0), m44(1) 00057 {} 00058 00060 Matrix4 (float am11, float am12, float am13, float am14, 00061 float am21, float am22, float am23, float am24, 00062 float am31, float am32, float am33, float am34, 00063 float am41, float am42, float am43, float am44) 00064 : m11(am11), m12(am12), m13(am13), m14(am14), 00065 m21(am21), m22(am22), m23(am23), m24(am24), 00066 m31(am31), m32(am32), m33(am33), m34(am34), 00067 m41(am41), m42(am42), m43(am43), m44(am44) 00068 {} 00069 00071 Matrix4 (Matrix4 const& o) 00072 : m11(o.m11), m12(o.m12), m13(o.m13), m14(o.m14), 00073 m21(o.m21), m22(o.m22), m23(o.m23), m24(o.m24), 00074 m31(o.m31), m32(o.m32), m33(o.m33), m34(o.m34), 00075 m41(o.m41), m42(o.m42), m43(o.m43), m44(o.m44) 00076 { 00077 } 00078 00080 Matrix4 (csTransform const& o) 00081 : m11(o.GetO2T().m11), m12(o.GetO2T().m12), m13(o.GetO2T().m13), 00082 m21(o.GetO2T().m21), m22(o.GetO2T().m22), m23(o.GetO2T().m23), 00083 m31(o.GetO2T().m31), m32(o.GetO2T().m32), m33(o.GetO2T().m33), 00084 m41(0), m42(0), m43(0), m44(1) 00085 { 00086 csVector3 o_t2o = -o.GetO2T()*o.GetO2TTranslation(); 00087 m14 = o_t2o.x; 00088 m24 = o_t2o.y; 00089 m34 = o_t2o.z; 00090 } 00091 00093 Matrix4 (csMatrix3 const& m) 00094 : m11(m.m11), m12(m.m12), m13(m.m13), m14 (0), 00095 m21(m.m21), m22(m.m22), m23(m.m23), m24 (0), 00096 m31(m.m31), m32(m.m32), m33(m.m33), m34 (0), 00097 m41(0), m42(0), m43(0), m44(1) 00098 { 00099 } 00100 00102 csString Description() const; 00103 00105 inline csVector4 Row1() const { return csVector4 (m11,m12,m13,m14); } 00106 00108 inline csVector4 Row2() const { return csVector4 (m21,m22,m23,m24); } 00109 00111 inline csVector4 Row3() const { return csVector4 (m31,m32,m33,m34); } 00112 00114 inline csVector4 Row4() const { return csVector4 (m41,m42,m43,m44); } 00115 00117 inline csVector4 Row(size_t n) const 00118 { 00119 switch (n) 00120 { 00121 case 0: return Row1(); 00122 case 1: return Row2(); 00123 case 2: return Row3(); 00124 default: 00125 case 3: return Row4(); 00126 } 00127 } 00128 00130 inline csVector4 Col1() const { return csVector4 (m11,m21,m31,m41); } 00131 00133 inline csVector4 Col2() const { return csVector4 (m12,m22,m32,m42); } 00134 00136 inline csVector4 Col3() const { return csVector4 (m13,m23,m33,m43); } 00137 00139 inline csVector4 Col4() const { return csVector4 (m14,m24,m34,m44); } 00140 00142 inline csVector4 Col(size_t n) const 00143 { 00144 switch (n) 00145 { 00146 case 0: return Col1(); 00147 case 1: return Col2(); 00148 case 2: return Col3(); 00149 default: 00150 case 3: return Col4(); 00151 } 00152 } 00153 00154 inline void Set (Matrix4 const &o) 00155 { 00156 m11 = o.m11; m12 = o.m12; m13 = o.m13; m14 = o.m14; 00157 m21 = o.m21; m22 = o.m22; m23 = o.m23; m24 = o.m24; 00158 m31 = o.m31; m32 = o.m32; m33 = o.m33; m34 = o.m34; 00159 m41 = o.m41; m42 = o.m42; m43 = o.m43; m44 = o.m44; 00160 } 00161 00163 Matrix4& operator= (const Matrix4& o) { Set(o); return *this; } 00164 00166 Matrix4& operator*= (float f) 00167 { 00168 m11 *= f; m12 *= f; m13 *= f; m14 *= f; 00169 m21 *= f; m22 *= f; m23 *= f; m24 *= f; 00170 m31 *= f; m32 *= f; m33 *= f; m34 *= f; 00171 m41 *= f; m42 *= f; m43 *= f; m44 *= f; 00172 return *this; 00173 } 00174 00176 Matrix4& operator/= (float f) 00177 { 00178 *this *= 1.0f/f; 00179 return *this; 00180 } 00181 00183 friend CS_CRYSTALSPACE_EXPORT Matrix4 operator* (const Matrix4& m1, 00184 const Matrix4& m2); 00185 00187 csVector4 operator* (const csVector4& v) const 00188 { 00189 return csVector4 ( 00190 m11*v.x + m12*v.y + m13*v.z + m14*v.w, 00191 m21*v.x + m22*v.y + m23*v.z + m24*v.w, 00192 m31*v.x + m32*v.y + m33*v.z + m34*v.w, 00193 m41*v.x + m42*v.y + m43*v.z + m44*v.w); 00194 } 00195 00197 float Determinant() const 00198 { 00199 return m14 * m23 * m32 * m41-m13 * m24 * m32 * m41-m14 * m22 * m33 * m41+m12 * m24 * m33 * m41 00200 + m13 * m22 * m34 * m41-m12 * m23 * m34 * m41-m14 * m23 * m31 * m42+m13 * m24 * m31 * m42 00201 + m14 * m21 * m33 * m42-m11 * m24 * m33 * m42-m13 * m21 * m34 * m42+m11 * m23 * m34 * m42 00202 + m14 * m22 * m31 * m43-m12 * m24 * m31 * m43-m14 * m21 * m32 * m43+m11 * m24 * m32 * m43 00203 + m12 * m21 * m34 * m43-m11 * m22 * m34 * m43-m13 * m22 * m31 * m44+m12 * m23 * m31 * m44 00204 + m13 * m21 * m32 * m44-m11 * m23 * m32 * m44-m12 * m21 * m33 * m44+m11 * m22 * m33 * m44; 00205 } 00206 00208 Matrix4 GetInverse() const 00209 { 00210 Matrix4 m ( 00211 m23*m34*m42 - m24*m33*m42 + m24*m32*m43 - m22*m34*m43 - m23*m32*m44 + m22*m33*m44, 00212 m14*m33*m42 - m13*m34*m42 - m14*m32*m43 + m12*m34*m43 + m13*m32*m44 - m12*m33*m44, 00213 m13*m24*m42 - m14*m23*m42 + m14*m22*m43 - m12*m24*m43 - m13*m22*m44 + m12*m23*m44, 00214 m14*m23*m32 - m13*m24*m32 - m14*m22*m33 + m12*m24*m33 + m13*m22*m34 - m12*m23*m34, 00215 00216 m24*m33*m41 - m23*m34*m41 - m24*m31*m43 + m21*m34*m43 + m23*m31*m44 - m21*m33*m44, 00217 m13*m34*m41 - m14*m33*m41 + m14*m31*m43 - m11*m34*m43 - m13*m31*m44 + m11*m33*m44, 00218 m14*m23*m41 - m13*m24*m41 - m14*m21*m43 + m11*m24*m43 + m13*m21*m44 - m11*m23*m44, 00219 m13*m24*m31 - m14*m23*m31 + m14*m21*m33 - m11*m24*m33 - m13*m21*m34 + m11*m23*m34, 00220 00221 m22*m34*m41 - m24*m32*m41 + m24*m31*m42 - m21*m34*m42 - m22*m31*m44 + m21*m32*m44, 00222 m14*m32*m41 - m12*m34*m41 - m14*m31*m42 + m11*m34*m42 + m12*m31*m44 - m11*m32*m44, 00223 m12*m24*m41 - m14*m22*m41 + m14*m21*m42 - m11*m24*m42 - m12*m21*m44 + m11*m22*m44, 00224 m14*m22*m31 - m12*m24*m31 - m14*m21*m32 + m11*m24*m32 + m12*m21*m34 - m11*m22*m34, 00225 00226 m23*m32*m41 - m22*m33*m41 - m23*m31*m42 + m21*m33*m42 + m22*m31*m43 - m21*m32*m43, 00227 m12*m33*m41 - m13*m32*m41 + m13*m31*m42 - m11*m33*m42 - m12*m31*m43 + m11*m32*m43, 00228 m13*m22*m41 - m12*m23*m41 - m13*m21*m42 + m11*m23*m42 + m12*m21*m43 - m11*m22*m43, 00229 m12*m23*m31 - m13*m22*m31 + m13*m21*m32 - m11*m23*m32 - m12*m21*m33 + m11*m22*m33); 00230 m /= Determinant(); 00231 return m; 00232 } 00233 00235 void Invert() { *this = GetInverse(); } 00236 }; 00237 00238 } // namespace Math 00239 } // namespace CS 00240 00243 #endif // __CS_MATRIX4_H__
Generated for Crystal Space 1.4.0 by doxygen 1.5.8