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_MATRIX4_H__
00023 #define __AELIB_AEGEOM_MATRIX4_H__
00024
00025 #include <aegeom/matrix3.h>
00026 #include <aegeom/vector4.h>
00027
00031 class aeMatrix4 {
00032 public:
00036 inline aeMatrix4() {}
00037
00058 inline aeMatrix4(float nm11, float nm12, float nm13, float nm14,
00059 float nm21, float nm22, float nm23, float nm24,
00060 float nm31, float nm32, float nm33, float nm34,
00061 float nm41, float nm42, float nm43, float nm44) :
00062 m11(nm11), m12(nm12), m13(nm13), m14(nm14),
00063 m21(nm21), m22(nm22), m23(nm23), m24(nm24),
00064 m31(nm31), m32(nm32), m33(nm33), m34(nm34),
00065 m41(nm41), m42(nm42), m43(nm43), m44(nm44) {}
00066
00072 inline aeMatrix4(const aeMatrix4 &m) :
00073 m11(m.m11), m12(m.m12), m13(m.m13), m14(m.m14),
00074 m21(m.m21), m22(m.m22), m23(m.m23), m24(m.m24),
00075 m31(m.m31), m32(m.m32), m33(m.m33), m34(m.m34),
00076 m41(m.m41), m42(m.m42), m43(m.m43), m44(m.m44) {}
00077
00084 inline aeMatrix4(const aeMatrix3 &m) :
00085 m11(m.m11), m12(m.m12), m13(m.m13), m14(0.0),
00086 m21(m.m21), m22(m.m22), m23(m.m23), m24(0.0),
00087 m31(m.m31), m32(m.m32), m33(m.m33), m34(0.0),
00088 m41(0.0), m42(0.0), m43(0.0), m44(1.0) {}
00089
00090 inline ~aeMatrix4() {}
00091
00093 float m11;
00095 float m12;
00097 float m13;
00099 float m14;
00101 float m21;
00103 float m22;
00105 float m23;
00107 float m24;
00109 float m31;
00111 float m32;
00113 float m33;
00115 float m34;
00117 float m41;
00119 float m42;
00121 float m43;
00123 float m44;
00124
00132 aeMatrix4 & operator+=(const aeMatrix4 &m);
00133
00141 aeMatrix4 & operator-=(const aeMatrix4 &m);
00142
00150 aeMatrix4 & operator*=(const aeMatrix4 &m);
00151
00159 aeMatrix4 & operator*=(float s);
00160
00168 aeMatrix4 & operator/=(float s);
00169
00175 inline aeMatrix4 operator+() const { return *this; }
00176
00182 inline aeMatrix4 operator-() const {
00183 return aeMatrix4(-m11, -m12, -m13, -m14,
00184 -m21, -m22, -m23, -m24,
00185 -m31, -m32, -m33, -m34,
00186 -m41, -m42, -m43, -m44);
00187 }
00188
00197 friend aeMatrix4 operator+(const aeMatrix4 &m1, const aeMatrix4 &m2);
00198
00207 friend aeMatrix4 operator-(const aeMatrix4 &m1, const aeMatrix4 &m2);
00208
00217 friend aeMatrix4 operator*(const aeMatrix4 &m1, const aeMatrix4 &m2);
00218
00227 inline friend aeVector3 operator*(const aeMatrix4 &m, const aeVector3 &v) {
00228 return aeVector3(m.m11 * v.x + m.m12 * v.y + m.m13 * v.z,
00229 m.m21 * v.x + m.m22 * v.y + m.m23 * v.z,
00230 m.m31 * v.x + m.m32 * v.y + m.m33 * v.z);
00231 }
00232
00241 friend aeMatrix4 operator*(const aeMatrix4 &m, float f);
00242
00251 friend aeMatrix4 operator*(float f, const aeMatrix4 &m);
00252
00261 friend aeMatrix4 operator/(const aeMatrix4 &m, float f);
00262
00271 friend bool operator==(const aeMatrix4 &m1, const aeMatrix4 &m2);
00272
00281 friend bool operator!=(const aeMatrix4 &m1, const aeMatrix4 &m2);
00282
00288 inline aeVector4 getFirstRow() const { return aeVector4(m11, m12, m13, m14); }
00289
00295 inline aeVector4 getSecondRow() const { return aeVector4(m21, m22, m23, m24); }
00296
00302 inline aeVector4 getThirdRow() const { return aeVector4(m31, m32, m33, m34); }
00303
00309 inline aeVector4 getFourthRow() const { return aeVector4(m41, m42, m43, m44); }
00310
00316 inline aeVector4 getFirstColumn() const { return aeVector4(m11, m21, m31, m41); }
00317
00323 inline aeVector4 getSecondColumn() const { return aeVector4(m12, m22, m32, m42); }
00324
00330 inline aeVector4 getThirdColumn() const { return aeVector4(m13, m23, m33, m43); }
00331
00337 inline aeVector4 getFourthColumn() const { return aeVector4(m14, m24, m34, m44); }
00338
00359 inline void set(float nm11, float nm12, float nm13, float nm14,
00360 float nm21, float nm22, float nm23, float nm24,
00361 float nm31, float nm32, float nm33, float nm34,
00362 float nm41, float nm42, float nm43, float nm44) {
00363 m11 = nm11; m12 = nm12; m13 = nm13; m14 = nm14;
00364 m21 = nm21; m22 = nm22; m23 = nm23; m24 = nm24;
00365 m31 = nm31; m32 = nm32; m33 = nm33; m34 = nm34;
00366 m41 = nm41; m42 = nm42; m43 = nm43; m44 = nm44;
00367 }
00368
00374 inline void set(const aeMatrix4 &m) {
00375 m11 = m.m11; m12 = m.m12; m13 = m.m13; m14 = m.m14;
00376 m21 = m.m21; m22 = m.m22; m23 = m.m23; m24 = m.m24;
00377 m31 = m.m31; m32 = m.m32; m33 = m.m33; m34 = m.m34;
00378 m41 = m.m41; m42 = m.m42; m43 = m.m43; m44 = m.m44;
00379 }
00380
00386 inline void set(const aeMatrix3 &m) {
00387 m11 = m.m11; m12 = m.m12; m13 = m.m13;
00388 m21 = m.m21; m22 = m.m22; m23 = m.m23;
00389 m31 = m.m31; m32 = m.m32; m33 = m.m33;
00390 }
00391
00395 void setToIdentity();
00396
00402 bool isIdentity() const;
00403
00407 void transpose();
00408
00414 aeMatrix4 getTranspose() const;
00415
00421 inline void extract3x3(aeMatrix3 &m3x3) const {
00422 m3x3.m11 = m11; m3x3.m12 = m12; m3x3.m13 = m13;
00423 m3x3.m21 = m21; m3x3.m22 = m22; m3x3.m23 = m23;
00424 m3x3.m31 = m31; m3x3.m32 = m32; m3x3.m33 = m33;
00425 }
00426 };
00427
00428 #endif // __AELIB_AEENGINE_MATRIX4_H__