00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_MATRIX3_H__
00021 #define __CS_MATRIX3_H__
00022
00029 #ifndef __CS_CSSYSDEFS_H__
00030 #error "cssysdef.h must be included in EVERY source file!"
00031 #endif
00032
00033 #include "csgeom/vector3.h"
00034
00035 class csQuaternion;
00036
00040 class csMatrix3
00041 {
00042 public:
00043 float m11, m12, m13;
00044 float m21, m22, m23;
00045 float m31, m32, m33;
00046
00047 public:
00049 csMatrix3 ()
00050 : m11(1), m12(0), m13(0),
00051 m21(0), m22(1), m23(0),
00052 m31(0), m32(0), m33(1)
00053 {}
00054
00056 csMatrix3 (float am11, float am12, float am13,
00057 float am21, float am22, float am23,
00058 float am31, float am32, float am33)
00059 : m11(am11), m12(am12), m13(am13),
00060 m21(am21), m22(am22), m23(am23),
00061 m31(am31), m32(am32), m33(am33)
00062 {}
00063
00065 explicit csMatrix3 (const csQuaternion &quat) { Set (quat); }
00066
00068 inline csVector3 Row1() const { return csVector3 (m11,m12,m13); }
00069
00071 inline csVector3 Row2() const { return csVector3 (m21,m22,m23); }
00072
00074 inline csVector3 Row3() const { return csVector3 (m31,m32,m33); }
00075
00077 inline csVector3 Col1() const { return csVector3 (m11,m21,m31); }
00078
00080 inline csVector3 Col2() const { return csVector3 (m12,m22,m32); }
00081
00083 inline csVector3 Col3() const { return csVector3 (m13,m23,m33); }
00084
00086 inline void Set (float m11, float m12, float m13,
00087 float m21, float m22, float m23,
00088 float m31, float m32, float m33)
00089 {
00090 csMatrix3::m11 = m11; csMatrix3::m12 = m12; csMatrix3::m13 = m13;
00091 csMatrix3::m21 = m21; csMatrix3::m22 = m22; csMatrix3::m23 = m23;
00092 csMatrix3::m31 = m31; csMatrix3::m32 = m32; csMatrix3::m33 = m33;
00093 }
00094
00096 void Set (const csQuaternion &quat);
00097
00099 csMatrix3& operator+= (const csMatrix3& m);
00100
00102 csMatrix3& operator-= (const csMatrix3& m);
00103
00105 csMatrix3& operator*= (const csMatrix3& m);
00106
00108 csMatrix3& operator*= (float s);
00109
00111 csMatrix3& operator/= (float s);
00112
00114 inline csMatrix3 operator+ () const { return *this; }
00116 inline csMatrix3 operator- () const
00117 {
00118 return csMatrix3(-m11,-m12,-m13,
00119 -m21,-m22,-m23,
00120 -m31,-m32,-m33);
00121 }
00122
00124 void Transpose ();
00125
00127 csMatrix3 GetTranspose () const;
00128
00130 inline csMatrix3 GetInverse () const
00131 {
00132 csMatrix3 C(
00133 (m22*m33 - m23*m32), -(m12*m33 - m13*m32), (m12*m23 - m13*m22),
00134 -(m21*m33 - m23*m31), (m11*m33 - m13*m31), -(m11*m23 - m13*m21),
00135 (m21*m32 - m22*m31), -(m11*m32 - m12*m31), (m11*m22 - m12*m21) );
00136 float s = (float)1./(m11*C.m11 + m12*C.m21 + m13*C.m31);
00137
00138 C *= s;
00139
00140 return C;
00141 }
00142
00144 void Invert() { *this = GetInverse (); }
00145
00147 float Determinant () const;
00148
00150 void Identity ();
00151
00153 bool IsIdentity () const;
00154
00156 friend csMatrix3 operator+ (const csMatrix3& m1, const csMatrix3& m2);
00158 friend csMatrix3 operator- (const csMatrix3& m1, const csMatrix3& m2);
00160 friend csMatrix3 operator* (const csMatrix3& m1, const csMatrix3& m2);
00161
00163 inline friend csVector3 operator* (const csMatrix3& m, const csVector3& v)
00164 {
00165 return csVector3 (m.m11*v.x + m.m12*v.y + m.m13*v.z,
00166 m.m21*v.x + m.m22*v.y + m.m23*v.z,
00167 m.m31*v.x + m.m32*v.y + m.m33*v.z);
00168 }
00169
00171 friend csMatrix3 operator* (const csMatrix3& m, float f);
00173 friend csMatrix3 operator* (float f, const csMatrix3& m);
00175 friend csMatrix3 operator/ (const csMatrix3& m, float f);
00177 friend bool operator== (const csMatrix3& m1, const csMatrix3& m2);
00179 friend bool operator!= (const csMatrix3& m1, const csMatrix3& m2);
00181 friend bool operator< (const csMatrix3& m, float f);
00183 friend bool operator> (float f, const csMatrix3& m);
00184 };
00185
00187 class csXRotMatrix3 : public csMatrix3
00188 {
00189 public:
00197 csXRotMatrix3 (float angle);
00198 };
00199
00201 class csYRotMatrix3 : public csMatrix3
00202 {
00203 public:
00211 csYRotMatrix3 (float angle);
00212 };
00213
00215 class csZRotMatrix3 : public csMatrix3
00216 {
00217 public:
00225 csZRotMatrix3 (float angle);
00226 };
00227
00229 class csXScaleMatrix3 : public csMatrix3
00230 {
00231 public:
00235 csXScaleMatrix3 (float scaler) : csMatrix3(scaler, 0, 0, 0, 1, 0, 0, 0, 1) {}
00236 };
00237
00239 class csYScaleMatrix3 : public csMatrix3
00240 {
00241 public:
00245 csYScaleMatrix3 (float scaler) : csMatrix3(1, 0, 0, 0, scaler, 0, 0, 0, 1) {}
00246 };
00247
00249 class csZScaleMatrix3 : public csMatrix3
00250 {
00251 public:
00255 csZScaleMatrix3 (float scaler) : csMatrix3(1, 0, 0, 0, 1, 0, 0, 0, scaler) {}
00256 };
00257
00260 #endif // __CS_MATRIX3_H__