00001
00007 #ifndef _MATRIX_H_
00008 #define _MATRIX_H_
00009
00010 #include "Math.h"
00011 #include "Vector.h"
00012 #include <string.h>
00013
00014 class Mat4 {
00015 public:
00016 Mat4();
00017 Mat4(float val);
00018 Mat4(float mat[]);
00019
00020 void loadIdentity();
00021
00022
00023 inline void set(const float *matrix);
00024 void postMultiply(const Mat4 &mat);
00025 void setTranslation(const float *translation);
00026 void setInverseTranslation(const float *translation);
00027 void setRotationRadians(const float *angles);
00028 inline void translateVect(float *pVect) const;
00029 inline void rotateVect(float *pVect) const;
00030 inline void inverseTranslateVect(float *pVect) const;
00031 inline void inverseRotateVect(float *pVect) const;
00032 const float *getMatrix() const { return m; }
00033
00034
00035 void loadRotateX(const float angle);
00036 void loadRotateY(const float angle);
00037 void loadRotateZ(const float angle);
00038 void loadRotateXY(const float angleX, const float angleY);
00039 void loadRotateZXY(const float angleX, const float angleY, const float angleZ);
00040 void loadRotate(const Vec3 &v, const float angle);
00041
00042 void loadProjectionMatrix(float fov, float aspect, float zNear, float zFar);
00043
00044 void translate(const Vec3 &v);
00045 void setTranslate(const Vec3 &v);
00046 Vec3 translateVec(const Vec3 &v);
00047 void scale(const float sx, const float sy, const float sz);
00048
00049 void rotateX(const float angle);
00050 void rotateY(const float angle);
00051 void rotateZ(const float angle);
00052 void rotateXY(const float angleX, const float angleY);
00053 void rotateZXY(const float angleX, const float angleY, const float angleZ);
00054 void rotate(const Vec3 &v, const float angle);
00055 Vec3 rotateVec(const Vec3 &v);
00056
00057 void transpose();
00058
00059 operator float *() { return m; }
00060 const float &operator () (const int row, const int column) const { return m[row+(column<<2)]; }
00061 const float &operator [] (const int index) const { return m[index]; }
00062
00063 void operator += (const Mat4 &v);
00064 void operator -= (const Mat4 &v);
00065 void operator *= (const Mat4 &v);
00066
00067 void operator += (const float s);
00068 void operator -= (const float s);
00069 void operator *= (const float s);
00070 void operator /= (const float s);
00071
00072 Mat4 operator + (const Mat4 &v);
00073 Mat4 operator + (const float s);
00074 Mat4 operator - ();
00075 Mat4 operator - (const Mat4 &v);
00076 Mat4 operator - (const float s);
00077 Mat4 operator * (const Mat4 &v);
00078 Vec3 operator * (const Vec3 &v);
00079 Vec4 operator * (const Vec4 &v);
00080 Mat4 operator * (const float s);
00081 Mat4 operator / (const float s);
00082 Mat4 operator ! ();
00083
00084 protected:
00085 float m[16];
00086 };
00087
00088
00089 void Mat4::set(const float *matrix) {
00090 memcpy(m, matrix, sizeof(float)*16);
00091 }
00092
00093 void Mat4::rotateVect(float *pVect) const {
00094 float vec[3];
00095
00096 vec[0] = pVect[0]*m[0]+pVect[1]*m[4]+pVect[2]*m[8];
00097 vec[1] = pVect[0]*m[1]+pVect[1]*m[5]+pVect[2]*m[9];
00098 vec[2] = pVect[0]*m[2]+pVect[1]*m[6]+pVect[2]*m[10];
00099
00100 memcpy( pVect, vec, sizeof( float )*3 );
00101 }
00102
00103 void Mat4::inverseRotateVect(float *pVect) const {
00104 float vec[3];
00105
00106 vec[0] = pVect[0]*m[0]+pVect[1]*m[1]+pVect[2]*m[2];
00107 vec[1] = pVect[0]*m[4]+pVect[1]*m[5]+pVect[2]*m[6];
00108 vec[2] = pVect[0]*m[8]+pVect[1]*m[9]+pVect[2]*m[10];
00109
00110 memcpy( pVect, vec, sizeof( float )*3 );
00111 }
00112
00113 void Mat4::translateVect(float *pVect) const {
00114 pVect[0] = pVect[0]+m[12];
00115 pVect[1] = pVect[1]+m[13];
00116 pVect[2] = pVect[2]+m[14];
00117 }
00118
00119 void Mat4::inverseTranslateVect(float *pVect) const {
00120 pVect[0] = pVect[0]-m[12];
00121 pVect[1] = pVect[1]-m[13];
00122 pVect[2] = pVect[2]-m[14];
00123 }
00124
00125 #endif