00001 00005 template<typename Real = RV_PRECISSION_TYPENAME> 00006 class m4x4 { 00007 public: 00008 union{ 00009 struct{ Real m[4][4]; }; 00010 struct{ Real m16[16]; }; 00011 struct{ v4<Real> v[4]; }; 00012 }; 00013 00017 m4x4(){} 00018 00023 m4x4(const m3x3<Real>& mat){ 00024 for(char i=0; i<3; i++){ 00025 for(char j=0; j<3; j++) 00026 m[i][j] = mat(i,j); 00027 m[i][3] = 0.f; 00028 } 00029 m[3][0] = m[3][1] = m[3][2] = 0.f; 00030 m[3][3] = 1.f; 00031 } 00032 00037 m4x4(const m4x4<Real>& mat){ 00038 for(int i=0; i<4; i++) 00039 for(int j=0; j<4; j++) 00040 m[i][j] = mat(i,j); 00041 } 00042 00045 m4x4(const Real* f){ 00046 m[0][0]=f[ 0]; m[0][1]=f[ 1]; m[0][2]=f[ 2]; m[0][3]=f[ 3]; 00047 m[1][0]=f[ 4]; m[1][1]=f[ 5]; m[1][2]=f[ 6]; m[1][3]=f[ 7]; 00048 m[2][0]=f[ 8]; m[2][1]=f[ 9]; m[2][2]=f[10]; m[2][3]=f[11]; 00049 m[3][0]=f[12]; m[3][1]=f[13]; m[3][2]=f[14]; m[3][3]=f[15]; 00050 } 00051 00054 m4x4(const Real a, const Real b, const Real c, const Real d, 00055 const Real e, const Real f, const Real g, const Real h, 00056 const Real i, const Real j, const Real k, const Real l, 00057 const Real m, const Real n, const Real o, const Real p) 00058 { 00059 this->m[0][0]=a; this->m[0][1]=b; this->m[0][2]=c; this->m[0][3]=d; 00060 this->m[1][0]=e; this->m[1][1]=f; this->m[1][2]=g; this->m[1][3]=h; 00061 this->m[2][0]=i; this->m[2][1]=j; this->m[2][2]=k; this->m[2][3]=l; 00062 this->m[3][0]=m; this->m[3][1]=n; this->m[3][2]=o; this->m[3][3]=p; 00063 } 00064 00065 inline m4x4<Real>& set( 00066 const Real a, const Real b, const Real c, const Real d, 00067 const Real e, const Real f, const Real g, const Real h, 00068 const Real i, const Real j, const Real k, const Real l, 00069 const Real m, const Real n, const Real o, const Real p); 00070 inline m4x4<Real>& get( 00071 Real& a, Real& b, Real& c, Real& d, 00072 Real& e, Real& f, Real& g, Real& h, 00073 Real& i, Real& j, Real& k, Real& l, 00074 Real& m, Real& n, Real& o, Real& p); 00075 00076 inline m4x4<Real>& zero(void); 00078 inline m4x4<Real>& identity(void); 00080 inline Real det(void); 00082 inline m4x4<Real>& transpose(void); 00084 inline m4x4<Real>& invert(void); 00085 00087 inline m4x4<Real>& asTranslation(const Real x, const Real y,const Real z); 00089 inline m4x4<Real>& asRotation(const Real x, const Real y, const Real z); 00091 inline m4x4<Real>& asRotationX(const Real angle); 00093 inline m4x4<Real>& asRotationY(const Real angle); 00095 inline m4x4<Real>& asRotationZ(const Real angle); 00097 inline m4x4<Real>& asScale(const Real x, const Real y, const Real z); 00098 00099 inline m4x4<Real>& projection(const int width, const int height, const Real Near, const Real Far, const Real FOV); 00100 inline m4x4<Real>& lookAt(const v3<Real>& camPos, const v3<Real>& camDirUnion, const v3<Real>& camUp); 00101 inline m4x4<Real>& lookAt(const Real eyex, const Real eyey, const Real eyez, 00102 const Real centerx, const Real centery, const Real centerz, 00103 const Real upx, const Real upy, const Real upz); 00104 00106 inline m3x3<Real> as3x3(void); 00108 inline const m3x3<Real> as3x3(void) const; 00109 00110 inline m4x4<Real>& operator = (const m4x4<Real>& a); 00111 inline m4x4<Real>& operator += (const m4x4<Real>& a); 00112 inline m4x4<Real>& operator -= (const m4x4<Real>& a); 00113 inline m4x4<Real>& operator *= (const m4x4<Real>& a); 00114 inline bool operator == (const m4x4<Real>& a); 00115 inline bool operator != (const m4x4<Real>& a); 00116 00117 inline v4<Real>& operator [] (const int i); 00118 inline const v4<Real>& operator [] (const int i) const; 00119 inline Real& operator () (const int i); 00120 inline const Real operator () (const int i) const; 00121 inline Real& operator () (const int row, const int col); 00122 inline const Real operator () (const int row, const int col) const; 00123 }; 00124 00125 template<typename Real> inline m4x4<Real> add(const m4x4<Real>& a, const m4x4<Real>& b); 00126 template<typename Real> inline m4x4<Real> sub(const m4x4<Real>& a, const m4x4<Real>& b); 00127 template<typename Real> inline m4x4<Real> mul(const m4x4<Real>& a, const m4x4<Real>& b); 00128 template<typename Real> inline void mul(m4x4<Real>& out, const m4x4<Real>& a, const m4x4<Real>& b); 00129 template<typename Real> inline v4<Real> mul(const v4<Real>& v, const m4x4<Real>& m); 00130 template<typename Real> inline void mul(v4<Real>& out, const v4<Real>& v, const m4x4<Real>& m); 00131 template<typename Real> inline v4<Real> mul(const m4x4<Real>& m, const v4<Real>& v); 00132 template<typename Real> inline void mul(v4<Real>& out, const m4x4<Real>& m, const v4<Real>& v); 00133 00134 template<typename Real> inline v4<Real> operator * (const v4<Real>& a, const m4x4<Real>& b); 00135 template<typename Real> inline v4<Real> operator * (const m4x4<Real>& a, const v4<Real>& b); 00136 template<typename Real> inline m4x4<Real> operator * (const m4x4<Real>& a, const m4x4<Real>& b); 00137 template<typename Real> inline m4x4<Real> operator + (const m4x4<Real>& a, const m4x4<Real>& b); 00138 template<typename Real> inline m4x4<Real> operator - (const m4x4<Real>& a, const m4x4<Real>& b); 00139 00140 template<typename Real> inline m4x4<Real> Identity4x4(); 00141 template<typename Real> inline m4x4<Real> Zero4x4(); 00142 00143 template<typename Real> inline m4x4<Real> Translation(const Real x, const Real y, const Real z); 00144 template<typename Real> inline m4x4<Real> Scale(const Real x, const Real y, const Real z); 00145 template<typename Real> inline m4x4<Real> RotationX(const Real angle); 00146 template<typename Real> inline m4x4<Real> RotationY(const Real angle); 00147 template<typename Real> inline m4x4<Real> RotationZ(const Real angle); 00149 template<typename Real> inline m4x4<Real> inverse(const m4x4<Real> m); 00150 template<typename Real> inline m4x4<Real> transpose(const m4x4<Real> m); 00152 template<typename Real> inline m4x4<Real> Projection(const int width, const int height, 00153 const Real Near, const Real Far, const Real FOV); 00155 template<typename Real> inline m4x4<Real> LookAt(const Real eyex, const Real eyey, const Real eyez, 00156 const Real atx, const Real aty, const Real atz, 00157 const Real upx, const Real upy, const Real upz); 00158 00159 template<typename Real> inline m4x4<Real> ProjectionStereo( 00160 const int screenWidth, 00161 const int screenHeight, 00162 const Real nearPlane, 00163 const Real farPlane, 00164 const Real camFOV, 00165 const Real distToEyeCenter, 00166 const Real focalLength = 20.f); 00167 00168 template<typename Real> inline m4x4<Real> LookAtStereo( 00169 const v3<Real> camPos, 00170 const v3<Real> camLookAt, 00171 const v3<Real> camUp, 00172 const Real distToEyeCenter, 00173 const Real focalLength = 20.f); 00174 00175 typedef m4x4<float> float4x4; 00176 typedef m4x4<double> double4x4;