00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_MATRIX4_H__
00021 #define __CS_MATRIX4_H__
00022
00030 #include "csextern.h"
00031 #include "csgeom/math.h"
00032 #include "csgeom/transfrm.h"
00033 #include "csgeom/vector4.h"
00034 #include "csutil/csstring.h"
00035
00036 namespace CS
00037 {
00038 namespace Math
00039 {
00043 class CS_CRYSTALSPACE_EXPORT Matrix4
00044 {
00045 public:
00046 float m11, m12, m13, m14;
00047 float m21, m22, m23, m24;
00048 float m31, m32, m33, m34;
00049 float m41, m42, m43, m44;
00050
00051 public:
00053 Matrix4 ()
00054 : m11(1), m12(0), m13(0), m14(0),
00055 m21(0), m22(1), m23(0), m24(0),
00056 m31(0), m32(0), m33(1), m34(0),
00057 m41(0), m42(0), m43(0), m44(1)
00058 {}
00059
00061 Matrix4 (float am11, float am12, float am13, float am14,
00062 float am21, float am22, float am23, float am24,
00063 float am31, float am32, float am33, float am34,
00064 float am41, float am42, float am43, float am44)
00065 : m11(am11), m12(am12), m13(am13), m14(am14),
00066 m21(am21), m22(am22), m23(am23), m24(am24),
00067 m31(am31), m32(am32), m33(am33), m34(am34),
00068 m41(am41), m42(am42), m43(am43), m44(am44)
00069 {}
00070
00072 Matrix4 (Matrix4 const& o)
00073 : m11(o.m11), m12(o.m12), m13(o.m13), m14(o.m14),
00074 m21(o.m21), m22(o.m22), m23(o.m23), m24(o.m24),
00075 m31(o.m31), m32(o.m32), m33(o.m33), m34(o.m34),
00076 m41(o.m41), m42(o.m42), m43(o.m43), m44(o.m44)
00077 {
00078 }
00079
00081 Matrix4 (csTransform const& o)
00082 : m11(o.GetO2T().m11), m12(o.GetO2T().m12), m13(o.GetO2T().m13),
00083 m21(o.GetO2T().m21), m22(o.GetO2T().m22), m23(o.GetO2T().m23),
00084 m31(o.GetO2T().m31), m32(o.GetO2T().m32), m33(o.GetO2T().m33),
00085 m41(0), m42(0), m43(0), m44(1)
00086 {
00087 csVector3 o_t2o = -o.GetO2T()*o.GetO2TTranslation();
00088 m14 = o_t2o.x;
00089 m24 = o_t2o.y;
00090 m34 = o_t2o.z;
00091 }
00092
00094 Matrix4 (csMatrix3 const& m)
00095 : m11(m.m11), m12(m.m12), m13(m.m13), m14 (0),
00096 m21(m.m21), m22(m.m22), m23(m.m23), m24 (0),
00097 m31(m.m31), m32(m.m32), m33(m.m33), m34 (0),
00098 m41(0), m42(0), m43(0), m44(1)
00099 {
00100 }
00101
00103 csString Description() const;
00104
00106 csTransform GetTransform() const;
00107
00109 inline csVector4 Row1() const { return csVector4 (m11,m12,m13,m14); }
00110
00112 inline csVector4 Row2() const { return csVector4 (m21,m22,m23,m24); }
00113
00115 inline csVector4 Row3() const { return csVector4 (m31,m32,m33,m34); }
00116
00118 inline csVector4 Row4() const { return csVector4 (m41,m42,m43,m44); }
00119
00121 inline csVector4 Row(size_t n) const
00122 {
00123 switch (n)
00124 {
00125 case 0: return Row1();
00126 case 1: return Row2();
00127 case 2: return Row3();
00128 default:
00129 case 3: return Row4();
00130 }
00131 }
00132
00134 inline csVector4 Col1() const { return csVector4 (m11,m21,m31,m41); }
00135
00137 inline csVector4 Col2() const { return csVector4 (m12,m22,m32,m42); }
00138
00140 inline csVector4 Col3() const { return csVector4 (m13,m23,m33,m43); }
00141
00143 inline csVector4 Col4() const { return csVector4 (m14,m24,m34,m44); }
00144
00146 inline csVector4 Col(size_t n) const
00147 {
00148 switch (n)
00149 {
00150 case 0: return Col1();
00151 case 1: return Col2();
00152 case 2: return Col3();
00153 default:
00154 case 3: return Col4();
00155 }
00156 }
00157
00158 inline void Set (Matrix4 const &o)
00159 {
00160 m11 = o.m11; m12 = o.m12; m13 = o.m13; m14 = o.m14;
00161 m21 = o.m21; m22 = o.m22; m23 = o.m23; m24 = o.m24;
00162 m31 = o.m31; m32 = o.m32; m33 = o.m33; m34 = o.m34;
00163 m41 = o.m41; m42 = o.m42; m43 = o.m43; m44 = o.m44;
00164 }
00165
00167 Matrix4& operator= (const Matrix4& o) { Set(o); return *this; }
00168
00170 Matrix4& operator*= (float f)
00171 {
00172 m11 *= f; m12 *= f; m13 *= f; m14 *= f;
00173 m21 *= f; m22 *= f; m23 *= f; m24 *= f;
00174 m31 *= f; m32 *= f; m33 *= f; m34 *= f;
00175 m41 *= f; m42 *= f; m43 *= f; m44 *= f;
00176 return *this;
00177 }
00178
00180 Matrix4& operator/= (float f)
00181 {
00182 *this *= 1.0f/f;
00183 return *this;
00184 }
00185
00187 friend CS_CRYSTALSPACE_EXPORT Matrix4 operator* (const Matrix4& m1,
00188 const Matrix4& m2);
00189
00191 csVector4 operator* (const csVector4& v) const
00192 {
00193 return csVector4 (
00194 m11*v.x + m12*v.y + m13*v.z + m14*v.w,
00195 m21*v.x + m22*v.y + m23*v.z + m24*v.w,
00196 m31*v.x + m32*v.y + m33*v.z + m34*v.w,
00197 m41*v.x + m42*v.y + m43*v.z + m44*v.w);
00198 }
00199
00201 float Determinant() const
00202 {
00203 return m14 * m23 * m32 * m41-m13 * m24 * m32 * m41-m14 * m22 * m33 * m41+m12 * m24 * m33 * m41
00204 + m13 * m22 * m34 * m41-m12 * m23 * m34 * m41-m14 * m23 * m31 * m42+m13 * m24 * m31 * m42
00205 + m14 * m21 * m33 * m42-m11 * m24 * m33 * m42-m13 * m21 * m34 * m42+m11 * m23 * m34 * m42
00206 + m14 * m22 * m31 * m43-m12 * m24 * m31 * m43-m14 * m21 * m32 * m43+m11 * m24 * m32 * m43
00207 + m12 * m21 * m34 * m43-m11 * m22 * m34 * m43-m13 * m22 * m31 * m44+m12 * m23 * m31 * m44
00208 + m13 * m21 * m32 * m44-m11 * m23 * m32 * m44-m12 * m21 * m33 * m44+m11 * m22 * m33 * m44;
00209 }
00210
00212 Matrix4 GetInverse() const
00213 {
00214 Matrix4 m (
00215 m23*m34*m42 - m24*m33*m42 + m24*m32*m43 - m22*m34*m43 - m23*m32*m44 + m22*m33*m44,
00216 m14*m33*m42 - m13*m34*m42 - m14*m32*m43 + m12*m34*m43 + m13*m32*m44 - m12*m33*m44,
00217 m13*m24*m42 - m14*m23*m42 + m14*m22*m43 - m12*m24*m43 - m13*m22*m44 + m12*m23*m44,
00218 m14*m23*m32 - m13*m24*m32 - m14*m22*m33 + m12*m24*m33 + m13*m22*m34 - m12*m23*m34,
00219
00220 m24*m33*m41 - m23*m34*m41 - m24*m31*m43 + m21*m34*m43 + m23*m31*m44 - m21*m33*m44,
00221 m13*m34*m41 - m14*m33*m41 + m14*m31*m43 - m11*m34*m43 - m13*m31*m44 + m11*m33*m44,
00222 m14*m23*m41 - m13*m24*m41 - m14*m21*m43 + m11*m24*m43 + m13*m21*m44 - m11*m23*m44,
00223 m13*m24*m31 - m14*m23*m31 + m14*m21*m33 - m11*m24*m33 - m13*m21*m34 + m11*m23*m34,
00224
00225 m22*m34*m41 - m24*m32*m41 + m24*m31*m42 - m21*m34*m42 - m22*m31*m44 + m21*m32*m44,
00226 m14*m32*m41 - m12*m34*m41 - m14*m31*m42 + m11*m34*m42 + m12*m31*m44 - m11*m32*m44,
00227 m12*m24*m41 - m14*m22*m41 + m14*m21*m42 - m11*m24*m42 - m12*m21*m44 + m11*m22*m44,
00228 m14*m22*m31 - m12*m24*m31 - m14*m21*m32 + m11*m24*m32 + m12*m21*m34 - m11*m22*m34,
00229
00230 m23*m32*m41 - m22*m33*m41 - m23*m31*m42 + m21*m33*m42 + m22*m31*m43 - m21*m32*m43,
00231 m12*m33*m41 - m13*m32*m41 + m13*m31*m42 - m11*m33*m42 - m12*m31*m43 + m11*m32*m43,
00232 m13*m22*m41 - m12*m23*m41 - m13*m21*m42 + m11*m23*m42 + m12*m21*m43 - m11*m22*m43,
00233 m12*m23*m31 - m13*m22*m31 + m13*m21*m32 - m11*m23*m32 - m12*m21*m33 + m11*m22*m33);
00234 m /= Determinant();
00235 return m;
00236 }
00237
00239 void Invert() { *this = GetInverse(); }
00240
00242 inline void Transpose ()
00243 {
00244 CS::Swap (m12, m21); CS::Swap (m13, m31); CS::Swap (m14, m41);
00245 CS::Swap (m23, m32); CS::Swap (m24, m42);
00246 CS::Swap (m34, m43);
00247 }
00248
00250 Matrix4 GetTranspose () const
00251 {
00252 return Matrix4 (
00253 m11, m21, m31, m41,
00254 m12, m22, m32, m42,
00255 m13, m23, m33, m43,
00256 m14, m24, m34, m44);
00257 }
00258 };
00259
00260 }
00261 }
00262
00265 #endif // __CS_MATRIX4_H__