00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __AELIB_AEGEOM_MATRIX3_H__
00023 #define __AELIB_AEGEOM_MATRIX3_H__
00024
00025 #include <aegeom/vector3.h>
00026
00030 class aeMatrix3 {
00031 public:
00035 inline aeMatrix3() {}
00036
00050 inline aeMatrix3(float nm11, float nm12, float nm13,
00051 float nm21, float nm22, float nm23,
00052 float nm31, float nm32, float nm33) :
00053 m11(nm11), m12(nm12), m13(nm13),
00054 m21(nm21), m22(nm22), m23(nm23),
00055 m41(nm31), m42(nm32), m43(nm33) {}
00056
00062 inline aeMatrix3(const aeMatrix3 &m) :
00063 m11(m.m11), m12(m.m12), m13(m.m13),
00064 m21(m.m21), m22(m.m22), m23(m.m23),
00065 m31(m.m31), m32(m.m32), m33(m.m33) {}
00066
00072 inline aeMatrix3(const aeMatrix4 &m) :
00073 m11(m.m11), m12(m.m12), m13(m.m13),
00074 m21(m.m21), m22(m.m22), m23(m.m23),
00075 m31(m.m31), m32(m.m32), m33(m.m33) {}
00076
00077 inline ~aeMatrix3() {}
00078
00080 float m11;
00082 float m12;
00084 float m13;
00086 float m21;
00088 float m22;
00090 float m23;
00092 float m31;
00094 float m32;
00096 float m33;
00097
00105 aeMatrix3 & operator+=(const aeMatrix3 &m);
00106
00114 aeMatrix3 & operator-=(const aeMatrix3 &m);
00115
00123 aeMatrix3 & operator*=(const aeMatrix3 &m);
00124
00132 aeMatrix3 & operator*=(float s);
00133
00141 aeMatrix3 & operator/=(float s);
00142
00148 inline aeMatrix3 operator+() const { return *this; }
00149
00155 inline aeMatrix3 operator-() const {
00156 return aeMatrix3(-m11, -m12, -m13,
00157 -m21, -m22, -m23,
00158 -m31, -m32, -m33);
00159 }
00160
00169 friend aeMatrix3 operator+(const aeMatrix3 &m1, const aeMatrix3 &m2);
00170
00179 friend aeMatrix3 operator-(const aeMatrix3 &m1, const aeMatrix3 &m2);
00180
00189 friend aeMatrix3 operator*(const aeMatrix3 &m1, const aeMatrix3 &m2);
00190
00199 inline friend aeVector3 operator*(const aeMatrix3 &m, const aeVector3 &v) {
00200 return aeVector3(m.m11 * v.x + m.m12 * v.y + m.m13 * v.z,
00201 m.m21 * v.x + m.m22 * v.y + m.m23 * v.z,
00202 m.m31 * v.x + m.m32 * v.y + m.m33 * v.z);
00203 }
00204
00213 friend aeMatrix3 operator*(const aeMatrix3 &m, float f);
00214
00223 friend aeMatrix3 operator*(float f, const aeMatrix3 &m);
00224
00233 friend aeMatrix3 operator/(const aeMatrix3 &m, float f);
00234
00243 friend bool operator==(const aeMatrix3 &m1, const aeMatrix3 &m2);
00244
00253 friend bool operator!=(const aeMatrix3 &m1, const aeMatrix3 &m2);
00254
00260 inline aeVector3 getFirstRow() const { return aeVector3(m11, m12, m13); }
00261
00267 inline aeVector3 getSecondRow() const { return aeVector3(m21, m22, m23); }
00268
00274 inline aeVector3 getThirdRow() const { return aeVector3(m31, m32, m33); }
00275
00281 inline aeVector3 getFirstColumn() const { return aeVector3(m11, m21, m31); }
00282
00288 inline aeVector3 getSecondColumn() const { return aeVector3(m12, m22, m32); }
00289
00295 inline aeVector3 getThirdColumn() const { return aeVector3(m13, m23, m33); }
00296
00317 inline void set(float nm11, float nm12, float nm13,
00318 float nm21, float nm22, float nm23,
00319 float nm31, float nm32, float nm33) {
00320 m11 = nm11; m12 = nm12; m13 = nm13;
00321 m21 = nm21; m22 = nm22; m23 = nm23;
00322 m31 = nm31; m32 = nm32; m33 = nm33;
00323 }
00324
00330 inline void set(const aeMatrix3 &m) {
00331 m11 = m.m11; m12 = m.m12; m13 = m.m13;
00332 m21 = m.m21; m22 = m.m22; m23 = m.m23;
00333 m31 = m.m31; m32 = m.m32; m33 = m.m33;
00334 }
00335
00341 inline void set(const aeMatrix4 &m) {
00342 m11 = m.m11; m12 = m.m12; m13 = m.m13;
00343 m21 = m.m21; m22 = m.m22; m23 = m.m23;
00344 m31 = m.m31; m32 = m.m32; m33 = m.m33;
00345 }
00346
00351 void setToIdentity();
00352
00358 bool isIdentity() const;
00359
00363 void transpose();
00364
00370 aeMatrix3 getTranspose() const;
00371 };
00372
00373 #endif // __AELIB_AEENGINE_MATRIX3_H__