Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

Matrix.h

Go to the documentation of this file.
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                 // -- used with MilkShape --
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

Generated on Sun Jun 5 15:47:04 2005 for Defacto by  doxygen 1.4.3