00001 /* Written by Steven Kilthau */ 00002 00003 #ifndef _MATRIX_H_ 00004 #define _MATRIX_H_ 00005 00006 #include <iostream> 00007 #include "vuSimpleTypes.h" 00008 00009 class vuVector; 00010 00012 00023 class vuMatrix 00024 { 00025 friend class vuVector; 00026 public: 00028 vuMatrix(); 00030 vuMatrix(const vuMatrix& m); 00032 vuMatrix(double v); 00034 00036 vuMatrix(const double* v); 00038 ~vuMatrix(); 00039 00041 vuMatrix& operator=(const vuMatrix& m); 00043 vuMatrix& operator=(double v); 00045 vuMatrix& operator=(const double* v); 00046 00047 // 00048 // Generate various special matrices by 00049 // changing values in the current instance. 00050 // All transformation matrices are pre- 00051 // transforms, meaning they should be left 00052 // multiplied against a vuVector. 00053 // 00055 vuMatrix& makeIdentity(void); 00057 00060 vuMatrix& makeRotate(const vuVector& axis, double a); 00062 vuMatrix& makeRotateX(double a); 00064 vuMatrix& makeRotateY(double a); 00066 vuMatrix& makeRotateZ(double a); 00068 vuMatrix& makeTranslate(double x, double y, double z); 00070 vuMatrix& makeScale(double x, double y, double z); 00072 vuMatrix& makeShearXY(double s); 00074 vuMatrix& makeShearXZ(double s); 00076 vuMatrix& makeShearYX(double s); 00078 vuMatrix& makeShearYZ(double s); 00080 vuMatrix& makeShearZX(double s); 00082 vuMatrix& makeShearZY(double s); 00084 vuMatrix& makeReflectX(void); 00086 vuMatrix& makeReflectY(void); 00088 vuMatrix& makeReflectZ(void); 00090 vuMatrix& makePerspective(double d); 00092 vuMatrix& makePerspectiveKeepZ(double d); 00093 00095 double* operator[](unsigned int index); 00097 const double* operator[](unsigned int index) const; 00099 00100 double* getData(void); 00102 double const* getData(void) const; 00103 00105 vuMatrix invOrtho() const; 00107 vuMatrix operator+(const vuMatrix& m) const; 00109 vuMatrix operator-(const vuMatrix& m) const; 00111 vuMatrix operator*(const vuMatrix& m) const; 00113 vuVector operator*(const vuVector& v) const; 00115 vuMatrix operator*(double s) const; 00117 friend vuMatrix operator*(double s,const vuMatrix& m); 00119 vuMatrix& operator+=(const vuMatrix& m); 00121 vuMatrix& operator-=(const vuMatrix& m); 00123 vuMatrix& operator*=(const vuMatrix& m); 00125 vuMatrix& operator*=(double s); 00126 00128 bool operator==(const vuMatrix& m) const; 00130 bool operator!=(const vuMatrix& m) const; 00131 00133 vuMatrix inverse(void) ; 00134 00136 00139 void invertRotationMatrix(); 00140 00142 friend std::ostream& operator<<(std::ostream& out,const vuMatrix& m); 00144 friend std::istream& operator>>(std::istream& in, vuMatrix& m); 00145 00146 private: 00147 double val[16]; 00148 }; 00149 00150 #endif