arbeit
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

mat4.h

Go to the documentation of this file.
00001 /*
00002  * $Id: mat4.h,v 1.6 2003/10/09 08:27:51 jmk Exp $
00003  */
00004 ///////////////////////////////////////////////////////////////////////////
00005 //              _____________  ______________________    __   __  _____
00006 //             /  ________  |  |   ___   ________   /   |  \ /  \   |
00007 //            |  |       |  |_ |  |_ |  |       /  /    \__  |      |
00008 //            |  |  ___  |  || |  || |  |      /  /        | |      |
00009 //            |  | |   \ |  || |  || |  |     /  /      \__/ \__/ __|__
00010 //            |  | |_@  ||  || |  || |  |    /  /          Institute
00011 //            |  |___/  ||  ||_|  || |  |   /  /_____________________
00012 //             \_______/  \______/ | |__|  /___________________________
00013 //                        |  |__|  |
00014 //                         \______/
00015 //                    University of Utah       
00016 //                           2002
00017 ///////////////////////////////////////////////////////////////////////////
00018 
00019 // mat4.h
00020 
00021 #ifndef mat4_h
00022 #define mat4_h
00023 
00024 #include "mm.h"
00025 #include "mat3.h"
00026 
00027 namespace gutz
00028 {
00029 template <class T>
00030 class vec3;
00031 
00032 template <class T>
00033 class vec4;
00034 
00035 template <class T>
00036 class quat;
00037 
00038 template <class T>
00039 class mat4
00040 {  
00041 public:
00042   // defauts to identity  
00043   inline mat4 ();
00044     inline mat4 (const mat4<T>& M);
00045     inline mat4 (const T);
00046     inline mat4 (T*);
00047     inline mat4 (T, T, T, T,
00048                                  T, T, T, T,
00049                                  T, T, T, T,
00050                                  T, T, T, T);
00051     inline mat4 (const vec4<T>&, const vec4<T>&,
00052                                  const vec4<T>&, const vec4<T>&);
00053     // inline mat4 (const mat4<T>&); use default
00054     inline mat4 (const mat3<T>&, const vec3<T>&);
00055     inline ~mat4 () {}
00056 
00057     // inline mat4& operator= (const mat4&); use default
00058     inline mat4& operator+= (const mat4&);
00059     inline mat4& operator-= (const mat4&);
00060     inline mat4& operator*= (const T);
00061     inline mat4& operator/= (const T);
00062     inline mat4& operator*= (const mat4&);
00063   
00064     inline mat4 operator+ (const mat4&) const;
00065     inline mat4 operator- (const mat4&) const;
00066     inline mat4 operator- () const;
00067   
00068     inline mat4 operator* (const T) const;
00069     inline mat4 operator/ (const T) const;
00070     inline mat4 operator* (const mat4&) const;
00071     inline vec4<T> operator* (const vec4<T>&) const;
00072 
00073     inline T* v ();
00074         inline const T* v () const;
00075     inline void set(const T, const T, const T, const T,
00076                             const T, const T, const T, const T,
00077                             const T, const T, const T, const T,
00078                             const T, const T, const T, const T);
00079     inline T& operator[] (const int);
00080     inline T  operator[] (const int) const;
00081 
00082     inline vec4<T>& x() const;
00083     inline vec4<T>& y() const;
00084     inline vec4<T>& z() const;
00085     inline vec4<T>& w() const;
00086 
00087     inline void zero ();
00088     inline void eye ();
00089   
00090     mat4 inv () const;
00091     mat4 rinv () const;
00092 
00093     inline mat4 tp () const;
00094 
00095     inline mat3<T> rot () const;
00096     inline void rot (const mat3<T>&);
00097 
00098     inline vec3<T> trans () const;
00099     inline void trans (const vec3<T>&);
00100 
00101     inline vec3<T> tpoint (const vec3<T>&) const;
00102     inline vec3<T> tdir (const vec3<T>&) const;
00103 
00104 public:
00105     T m[16];
00106 };
00107 
00108 //-----------------------------------------------------------------------------
00109 // Typedefs
00110 //-----------------------------------------------------------------------------
00111 
00112 typedef mat4<uchar>         mat4ub;
00113 typedef mat4<int>              mat4i;
00114 typedef mat4<uint>          mat4ui;
00115 typedef mat4<float>         mat4f;
00116 typedef mat4<double>        mat4d;
00117 
00118 //-----------------------------------------------------------------------------
00119 // External functions
00120 //-----------------------------------------------------------------------------
00121 template <class T>
00122 inline
00123 mat4<T>
00124 operator* (const T, const mat4<T>&);
00125 
00126 template <class T>
00127 mat4<T>
00128 diag (const vec4<T>&); // diagonal matrix
00129 
00130 template <class T>
00131 std::ostream&
00132 operator<< (std::ostream& os, const mat4<T>& M)
00133 {
00134     os << M.m[ 0] << " " << M.m[ 4] << " " 
00135         << M.m[ 8] << " " << M.m[12] << "\n"
00136        << M.m[ 1] << " " << M.m[ 5] << " "
00137         << M.m[ 9] << " " << M.m[13] << "\n"
00138        << M.m[ 2] << " " << M.m[ 6] << " "
00139              << M.m[10] << " " << M.m[14] << "\n"
00140        << M.m[ 3] << " " << M.m[ 7] << " "
00141         << M.m[11] << " " << M.m[15];
00142 
00143     return os;
00144 }
00145 
00146 template <class T>
00147 std::istream&
00148 operator>> (std::istream& is, mat4<T>& M)
00149 {
00150    is >> M.m[ 0] >> M.m[ 4] >> M.m[ 8] >> M.m[12];
00151    is >> M.m[ 1] >> M.m[ 5] >> M.m[ 9] >> M.m[13];
00152    is >> M.m[ 2] >> M.m[ 6] >> M.m[10] >> M.m[14];
00153    is >> M.m[ 3] >> M.m[ 7] >> M.m[11] >> M.m[15];
00154    return is;
00155 }
00156 
00157 template <class T>
00158 bool
00159 str2mat4 (const std::string& s, mat4<T>& v)
00160 {
00161     std::istringstream z(s);
00162     mat4<T> w;
00163     bool status = z.eof();
00164     for (int i=0; i<15; i++)
00165     {
00166         z >> w.m[i];
00167         status = status || z.fail() || z.eof();
00168     }
00169     z >> w.m[15];
00170     status = status || z.fail();
00171     if (!status) v = w.tp();
00172     return status;
00173 }
00174 
00175 template <class T>
00176 bool
00177 str2mat4 (const std::string*, mat4<T>*);
00178 
00179 //-----------------------------------------------------------------------------
00180 // Implementation
00181 //-----------------------------------------------------------------------------
00182 
00183 template <class T>
00184 mat4<T>::mat4 ()
00185 {
00186     m[ 0] = 1; m[ 1] = 0; m[ 2] = 0; m[ 3] = 0;
00187     m[ 4] = 0; m[ 5] = 1; m[ 6] = 0; m[ 7] = 0;
00188     m[ 8] = 0; m[ 9] = 0; m[10] = 1; m[11] = 0;
00189     m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1;
00190 }
00191 
00192 template <class T>
00193 mat4<T>::mat4 (const T c)
00194 {
00195     m[ 0] = c; m[ 1] = c; m[ 2] = c; m[ 3] = c;
00196     m[ 4] = c; m[ 5] = c; m[ 6] = c; m[ 7] = c;
00197     m[ 8] = c; m[ 9] = c; m[10] = c; m[11] = c;
00198     m[12] = c; m[13] = c; m[14] = c; m[15] = c;
00199 }
00200 
00201 template <class T>
00202 mat4<T>::mat4 (T* m0)
00203 {
00204     m[ 0] = m0[ 0]; m[ 1] = m0[ 1]; m[ 2] = m0[ 2]; m[ 3] = m0[ 3];
00205     m[ 4] = m0[ 4]; m[ 5] = m0[ 5]; m[ 6] = m0[ 6]; m[ 7] = m0[ 7];
00206     m[ 8] = m0[ 8]; m[ 9] = m0[ 9]; m[10] = m0[10]; m[11] = m0[11];
00207     m[12] = m0[12]; m[13] = m0[13]; m[14] = m0[14]; m[15] = m0[15];
00208 }
00209 
00210 template <class T>
00211 mat4<T>::mat4 (T m0, T m1, T m2, T m3,
00212                     T m4, T m5, T m6, T m7,
00213                     T m8, T m9, T m10, T m11,
00214                     T m12, T m13, T m14, T m15)
00215 {
00216     m[ 0] = m0; m[ 1] = m1; m[ 2] = m2; m[ 3] = m3;
00217     m[ 4] = m4; m[ 5] = m5; m[ 6] = m6; m[ 7] = m7;
00218     m[ 8] = m8; m[ 9] = m9; m[10] = m10; m[11] = m11;
00219     m[12] = m12; m[13] = m13; m[14] = m14; m[15] = m15;
00220 }
00221 
00222 template <class T>
00223 mat4<T>::mat4 (const vec4<T>& c0, const vec4<T>& c1,
00224                const vec4<T>& c2, const vec4<T>& c3)
00225 {
00226     m[ 0] = c0.x; m[ 1] = c0.y; m[ 2] = c0.z; m[ 3] = c0.w;
00227     m[ 4] = c1.x; m[ 5] = c1.y; m[ 6] = c1.z; m[ 7] = c1.w;
00228     m[ 8] = c2.x; m[ 9] = c2.y; m[10] = c2.z; m[11] = c2.w;
00229     m[12] = c3.x; m[13] = c3.y; m[14] = c3.z; m[15] = c3.w;
00230 }
00231 
00232 template <class T>
00233 mat4<T>::mat4(const mat3<T>& M, const vec3<T>& v)
00234 {
00235     m[ 0] = M.m[0]; m[ 1] = M.m[1]; m[ 2] = M.m[2]; m[ 3] = 0;
00236     m[ 4] = M.m[3]; m[ 5] = M.m[4]; m[ 6] = M.m[5]; m[ 7] = 0;
00237     m[ 8] = M.m[6]; m[ 9] = M.m[7]; m[10] = M.m[8]; m[11] = 0;
00238     m[12] = v.x; m[13] = v.y; m[14] = v.z; m[15] = 1;
00239 }
00240 
00241 template <class T>
00242 mat4<T>::mat4 (const mat4<T>& M)
00243 {
00244     m[ 0] = M.m[ 0]; m[ 1] = M.m[ 1]; m[ 2] = M.m[ 2]; m[ 3] = M.m[ 3];
00245     m[ 4] = M.m[ 4]; m[ 5] = M.m[ 5]; m[ 6] = M.m[ 6]; m[ 7] = M.m[ 7];
00246     m[ 8] = M.m[ 8]; m[ 9] = M.m[ 9]; m[10] = M.m[10]; m[11] = M.m[11];
00247     m[12] = M.m[12]; m[13] = M.m[13]; m[14] = M.m[14]; m[15] = M.m[15];
00248 }
00249 
00250 template <class T>
00251 mat4<T>&
00252 mat4<T>::operator+= (const mat4<T>& M)
00253 {    
00254     m[ 0] += M.m[ 0]; m[ 1] += M.m[ 1]; m[ 2] += M.m[ 2]; m[ 3] += M.m[ 3];
00255     m[ 4] += M.m[ 4]; m[ 5] += M.m[ 5]; m[ 6] += M.m[ 6]; m[ 7] += M.m[ 7];
00256     m[ 8] += M.m[ 8]; m[ 9] += M.m[ 9]; m[10] += M.m[10]; m[11] += M.m[11];
00257     m[12] += M.m[12]; m[13] += M.m[13]; m[14] += M.m[14]; m[15] += M.m[15];
00258     return *this;
00259 }
00260 
00261 template <class T>
00262 mat4<T>&
00263 mat4<T>::operator-= (const mat4<T>& M)
00264 {
00265     m[ 0] -= M.m[ 0]; m[ 1] -= M.m[ 1]; m[ 2] -= M.m[ 2]; m[ 3] -= M.m[ 3];
00266     m[ 4] -= M.m[ 4]; m[ 5] -= M.m[ 5]; m[ 6] -= M.m[ 6]; m[ 7] -= M.m[ 7];
00267     m[ 8] -= M.m[ 8]; m[ 9] -= M.m[ 9]; m[10] -= M.m[10]; m[11] -= M.m[11];
00268     m[12] -= M.m[12]; m[13] -= M.m[13]; m[14] -= M.m[14]; m[15] -= M.m[15];
00269     return *this;
00270 }
00271 
00272 template <class T>
00273 mat4<T>&
00274 mat4<T>::operator*= (T c)
00275 {
00276     m[ 0] *= c; m[ 1] *= c; m[ 2] *= c; m[ 3] *= c;
00277     m[ 4] *= c; m[ 5] *= c; m[ 6] *= c; m[ 7] *= c;
00278     m[ 8] *= c; m[ 9] *= c; m[10] *= c; m[11] *= c;
00279     m[12] *= c; m[13] *= c; m[14] *= c; m[15] *= c;
00280     return *this;
00281 }
00282 
00283 template <class T>
00284 mat4<T>&
00285 mat4<T>::operator/= (T c)
00286 {
00287     T d = 1/c;
00288     m[ 0] *= d; m[ 1] *= d; m[ 2] *= d; m[ 3] *= d;
00289     m[ 4] *= d; m[ 5] *= d; m[ 6] *= d; m[ 7] *= d;
00290     m[ 8] *= d; m[ 9] *= d; m[10] *= d; m[11] *= d;
00291     m[12] *= d; m[13] *= d; m[14] *= d; m[15] *= d;
00292     return *this;
00293 }
00294 
00295 template <class T>
00296 mat4<T>&
00297 mat4<T>::operator*= (const mat4<T>& M)
00298 {
00299     mat4<T> temp(*this);
00300 
00301     m[ 0] = 
00302         temp.m[ 0] * M.m[ 0] + temp.m[ 4] * M.m[ 1] + 
00303         temp.m[ 8] * M.m[ 2] + temp.m[12] * M.m[ 3];
00304     m[ 1] = 
00305         temp.m[ 1] * M.m[ 0] + temp.m[ 5] * M.m[ 1] + 
00306         temp.m[ 9] * M.m[ 2] + temp.m[13] * M.m[ 3];
00307     m[ 2] = 
00308         temp.m[ 2] * M.m[ 0] + temp.m[ 6] * M.m[ 1] + 
00309         temp.m[10] * M.m[ 2] + temp.m[14] * M.m[ 3];
00310     m[ 3] = 
00311         temp.m[ 3] * M.m[ 0] + temp.m[ 7] * M.m[ 1] + 
00312         temp.m[11] * M.m[ 2] + temp.m[15] * M.m[ 3];
00313 
00314     m[ 4] = 
00315         temp.m[ 0] * M.m[ 4] + temp.m[ 4] * M.m[ 5] + 
00316         temp.m[ 8] * M.m[ 6] + temp.m[12] * M.m[ 7];
00317     m[ 5] = 
00318         temp.m[ 1] * M.m[ 4] + temp.m[ 5] * M.m[ 5] + 
00319         temp.m[ 9] * M.m[ 6] + temp.m[13] * M.m[ 7];
00320     m[ 6] = 
00321         temp.m[ 2] * M.m[ 4] + temp.m[ 6] * M.m[ 5] + 
00322         temp.m[10] * M.m[ 6] + temp.m[14] * M.m[ 7];
00323     m[ 7] = 
00324         temp.m[ 3] * M.m[ 4] + temp.m[ 7] * M.m[ 5] + 
00325         temp.m[11] * M.m[ 6] + temp.m[15] * M.m[ 7];
00326 
00327     m[ 8] = 
00328         temp.m[ 0] * M.m[ 8] + temp.m[ 4] * M.m[ 9] + 
00329         temp.m[ 8] * M.m[10] + temp.m[12] * M.m[11];
00330     m[ 9] = 
00331         temp.m[ 1] * M.m[ 8] + temp.m[ 5] * M.m[ 9] + 
00332         temp.m[ 9] * M.m[10] + temp.m[13] * M.m[11];
00333     m[10] = 
00334         temp.m[ 2] * M.m[ 8] + temp.m[ 6] * M.m[ 9] + 
00335         temp.m[10] * M.m[10] + temp.m[14] * M.m[11];
00336     m[11] = 
00337         temp.m[ 3] * M.m[ 8] + temp.m[ 7] * M.m[ 9] + 
00338         temp.m[11] * M.m[10] + temp.m[15] * M.m[11];
00339 
00340     m[12] = 
00341         temp.m[ 0] * M.m[12] + temp.m[ 4] * M.m[13] + 
00342         temp.m[ 8] * M.m[14] + temp.m[12] * M.m[15];
00343     m[13] = 
00344         temp.m[ 1] * M.m[12] + temp.m[ 5] * M.m[13] + 
00345         temp.m[ 9] * M.m[14] + temp.m[13] * M.m[15];
00346     m[14] = 
00347         temp.m[ 2] * M.m[12] + temp.m[ 6] * M.m[13] + 
00348         temp.m[10] * M.m[14] + temp.m[14] * M.m[15];
00349     m[15] = 
00350         temp.m[ 3] * M.m[12] + temp.m[ 7] * M.m[13] + 
00351         temp.m[11] * M.m[14] + temp.m[15] * M.m[15];
00352 
00353     return *this;
00354 }
00355 
00356 template <class T>
00357 mat4<T>
00358 mat4<T>::operator+ (const mat4<T>& M) const
00359 {
00360     return mat4<T>(m[ 0] + M.m[ 0], m[ 1] + M.m[ 1],
00361                    m[ 2] + M.m[ 2], m[ 3] + M.m[ 3],
00362                    m[ 4] + M.m[ 4], m[ 5] + M.m[ 5],
00363                    m[ 6] + M.m[ 6], m[ 7] + M.m[ 7],
00364                    m[ 8] + M.m[ 8], m[ 9] + M.m[ 9],
00365                    m[10] + M.m[10], m[11] + M.m[11],
00366                    m[12] + M.m[12], m[13] + M.m[13],
00367                    m[14] + M.m[14], m[15] + M.m[15]);
00368 }
00369 
00370 template <class T>
00371 mat4<T>
00372 mat4<T>::operator- (const mat4<T>& M) const
00373 {
00374     return mat4<T>(m[ 0] - M.m[ 0], m[ 1] - M.m[ 1],
00375                    m[ 2] - M.m[ 2], m[ 3] - M.m[ 3],
00376                    m[ 4] - M.m[ 4], m[ 5] - M.m[ 5],
00377                    m[ 6] - M.m[ 6], m[ 7] - M.m[ 7],
00378                    m[ 8] - M.m[ 8], m[ 9] - M.m[ 9],
00379                    m[10] - M.m[10], m[11] - M.m[11],
00380                    m[12] - M.m[12], m[13] - M.m[13],
00381                    m[14] - M.m[14], m[15] - M.m[15]);
00382 }
00383 
00384 template <class T>
00385 mat4<T>
00386 mat4<T>::operator- () const
00387 {
00388     return mat4<T>(-m[ 0], -m[ 1], -m[ 2], -m[ 3],
00389                    -m[ 4], -m[ 5], -m[ 6], -m[ 7],
00390                    -m[ 8], -m[ 9], -m[10], -m[11],
00391                    -m[12], -m[13], -m[14], -m[15]);
00392 }
00393 
00394 template <class T>
00395 mat4<T>
00396 mat4<T>::operator* (T c) const
00397 {
00398     return mat4<T>(m[ 0]*c, m[ 1]*c, m[ 2]*c, m[ 3]*c,
00399                    m[ 4]*c, m[ 5]*c, m[ 6]*c, m[ 7]*c,
00400                    m[ 8]*c, m[ 9]*c, m[10]*c, m[11]*c,
00401                    m[12]*c, m[13]*c, m[14]*c, m[15]*c);
00402 }
00403 
00404 template <class T>
00405 mat4<T>
00406 mat4<T>::operator/ (T c) const
00407 {
00408     T d = 1/c;
00409     return mat4<T>(m[ 0]*d, m[ 1]*d, m[ 2]*d, m[ 3]*d,
00410                    m[ 4]*d, m[ 5]*d, m[ 6]*d, m[ 7]*d,
00411                    m[ 8]*d, m[ 9]*d, m[10]*d, m[11]*d,
00412                    m[12]*d, m[13]*d, m[14]*d, m[15]*d);
00413 }
00414 
00415 template <class T>
00416 mat4<T>
00417 mat4<T>::operator* (const mat4<T>& M) const
00418 {
00419     return mat4<T>(m[ 0]*M.m[ 0] + m[ 4]*M.m[ 1] + m[ 8]*M.m[ 2] + m[12]*M.m[ 3],
00420                    m[ 1]*M.m[ 0] + m[ 5]*M.m[ 1] + m[ 9]*M.m[ 2] + m[13]*M.m[ 3],
00421                    m[ 2]*M.m[ 0] + m[ 6]*M.m[ 1] + m[10]*M.m[ 2] + m[14]*M.m[ 3],
00422                    m[ 3]*M.m[ 0] + m[ 7]*M.m[ 1] + m[11]*M.m[ 2] + m[15]*M.m[ 3],
00423                     
00424                    m[ 0]*M.m[ 4] + m[ 4]*M.m[ 5] + m[ 8]*M.m[ 6] + m[12]*M.m[ 7],
00425                    m[ 1]*M.m[ 4] + m[ 5]*M.m[ 5] + m[ 9]*M.m[ 6] + m[13]*M.m[ 7],
00426                    m[ 2]*M.m[ 4] + m[ 6]*M.m[ 5] + m[10]*M.m[ 6] + m[14]*M.m[ 7],
00427                    m[ 3]*M.m[ 4] + m[ 7]*M.m[ 5] + m[11]*M.m[ 6] + m[15]*M.m[ 7],
00428                     
00429                    m[ 0]*M.m[ 8] + m[ 4]*M.m[ 9] + m[ 8]*M.m[10] + m[12]*M.m[11],
00430                    m[ 1]*M.m[ 8] + m[ 5]*M.m[ 9] + m[ 9]*M.m[10] + m[13]*M.m[11],
00431                    m[ 2]*M.m[ 8] + m[ 6]*M.m[ 9] + m[10]*M.m[10] + m[14]*M.m[11],
00432                    m[ 3]*M.m[ 8] + m[ 7]*M.m[ 9] + m[11]*M.m[10] + m[15]*M.m[11],
00433                     
00434                    m[ 0]*M.m[12] + m[ 4]*M.m[13] + m[ 8]*M.m[14] + m[12]*M.m[15],
00435                    m[ 1]*M.m[12] + m[ 5]*M.m[13] + m[ 9]*M.m[14] + m[13]*M.m[15],
00436                    m[ 2]*M.m[12] + m[ 6]*M.m[13] + m[10]*M.m[14] + m[14]*M.m[15],
00437                    m[ 3]*M.m[12] + m[ 7]*M.m[13] + m[11]*M.m[14] + m[15]*M.m[15]);
00438 }
00439 
00440 template <class T>
00441 vec4<T>
00442 mat4<T>::operator* (const vec4<T>& v) const
00443 {
00444     return vec4<T>(     m[ 0]*v.x + m[ 4]*v.y + m[ 8]*v.z + m[12]*v.w,
00445                                         m[ 1]*v.x + m[ 5]*v.y + m[ 9]*v.z + m[13]*v.w,
00446                                         m[ 2]*v.x + m[ 6]*v.y + m[10]*v.z + m[14]*v.w,
00447                                         m[ 3]*v.x + m[ 7]*v.y + m[11]*v.z + m[15]*v.w);
00448 }
00449 
00450 template <class T>
00451 T*
00452 mat4<T>::v ()
00453 {
00454     return m;
00455 }
00456 
00457 template <class T>
00458 const T*
00459 mat4<T>::v () const
00460 {
00461     return m;
00462 }
00463 
00464 template <class T>
00465 void
00466 mat4<T>::set (const T m0, const T m1, const T m2, const T m3,
00467               const T m4, const T m5, const T m6, const T m7,
00468               const T m8, const T m9, const T m10, const T m11,
00469               const T m12, const T m13, const T m14, const T m15)
00470 {
00471     m[ 0] = m0; m[ 1] = m1; m[ 2] = m2; m[ 3] = m3;
00472     m[ 4] = m4; m[ 5] = m5; m[ 6] = m6; m[ 7] = m7;
00473     m[ 8] = m8; m[ 9] = m9; m[10] = m10; m[11] = m11;
00474     m[12] = m12; m[13] = m13; m[14] = m14; m[15] = m15;
00475 }
00476 
00477 template <class T>
00478 T&
00479 mat4<T>::operator[] (const int i)
00480 {
00481     return v()[i];
00482 }
00483 
00484 template <class T>
00485 T
00486 mat4<T>::operator[] (const int i) const
00487 {
00488     return v()[i];
00489 }
00490 
00491 template <class T>
00492 void
00493 mat4<T>::zero ()
00494 {
00495     m[ 0] = 0; m[ 1] = 0; m[ 2] = 0; m[ 3] = 0;
00496     m[ 4] = 0; m[ 5] = 0; m[ 6] = 0; m[ 7] = 0;
00497     m[ 8] = 0; m[ 9] = 0; m[10] = 0; m[11] = 0;
00498     m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 0;
00499 }
00500 
00501 template <class T>
00502 void
00503 mat4<T>::eye ()
00504 {
00505     m[ 0] = 1; m[ 1] = 0; m[ 2] = 0; m[ 3] = 0;
00506     m[ 4] = 0; m[ 5] = 1; m[ 6] = 0; m[ 7] = 0;
00507     m[ 8] = 0; m[ 9] = 0; m[10] = 1; m[11] = 0;
00508     m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1;
00509 }
00510 
00511 template <class T>
00512 vec4<T>&
00513 mat4<T>::x () const
00514 {
00515     return (vec4<T>&)m[0];
00516 }
00517 
00518 template <class T>
00519 vec4<T>&
00520 mat4<T>::y () const
00521 {
00522     return (vec4<T>&)m[4];
00523 }
00524 
00525 template <class T>
00526 vec4<T>&
00527 mat4<T>::z () const
00528 {
00529     return (vec4<T>&)m[8];
00530 }
00531 
00532 template <class T>
00533 vec4<T>&
00534 mat4<T>::w () const
00535 {
00536     return (vec4<T>&)m[12];
00537 }
00538 
00539 template <class T>
00540 mat4<T>
00541 mat4<T>::inv () const
00542 {
00543     T det00 = 
00544         m[ 5]*(m[10]*m[15] - m[11]*m[14]) - 
00545         m[ 9]*(m[ 6]*m[15] - m[ 7]*m[14]) + 
00546         m[13]*(m[ 6]*m[11] - m[ 7]*m[10]);
00547     T det01 = 
00548         m[ 1]*(m[10]*m[15] - m[11]*m[14]) - 
00549         m[ 9]*(m[ 2]*m[15] - m[ 3]*m[14]) + 
00550         m[13]*(m[ 2]*m[11] - m[ 3]*m[10]);
00551     T det02 = 
00552         m[ 1]*(m[ 6]*m[15] - m[ 7]*m[14]) - 
00553         m[ 5]*(m[ 2]*m[15] - m[ 3]*m[14]) + 
00554         m[13]*(m[ 2]*m[ 7] - m[ 3]*m[ 6]);
00555     T det03 = 
00556         m[ 1]*(m[ 6]*m[11] - m[ 7]*m[10]) - 
00557         m[ 5]*(m[ 2]*m[11] - m[ 3]*m[10]) + 
00558         m[ 9]*(m[ 2]*m[ 7] - m[ 3]*m[ 6]);
00559   
00560     T det10 = 
00561         m[ 4]*(m[10]*m[15] - m[11]*m[14]) - 
00562         m[ 8]*(m[ 6]*m[15] - m[ 7]*m[14]) + 
00563         m[12]*(m[ 6]*m[11] - m[ 7]*m[10]);
00564     T det11 = 
00565         m[ 0]*(m[10]*m[15] - m[11]*m[14]) - 
00566         m[ 8]*(m[ 2]*m[15] - m[ 3]*m[14]) + 
00567         m[12]*(m[ 2]*m[11] - m[ 3]*m[10]);
00568     T det12 = 
00569         m[ 0]*(m[ 6]*m[15] - m[ 7]*m[14]) - 
00570         m[ 4]*(m[ 2]*m[15] - m[ 3]*m[14]) + 
00571         m[12]*(m[ 2]*m[ 7] - m[ 3]*m[ 6]);
00572     T det13 = 
00573         m[ 0]*(m[ 6]*m[11] - m[ 7]*m[10]) - 
00574         m[ 4]*(m[ 2]*m[11] - m[ 3]*m[10]) + 
00575         m[ 8]*(m[ 2]*m[ 7] - m[ 3]*m[ 6]);
00576   
00577     T det20 = 
00578         m[ 4]*(m[ 9]*m[15] - m[11]*m[13]) - 
00579         m[ 8]*(m[ 5]*m[15] - m[ 7]*m[13]) + 
00580         m[12]*(m[ 5]*m[11] - m[ 7]*m[ 9]);
00581     T det21 = 
00582         m[ 0]*(m[ 9]*m[15] - m[11]*m[13]) - 
00583         m[ 8]*(m[ 1]*m[15] - m[ 3]*m[13]) + 
00584         m[12]*(m[ 1]*m[11] - m[ 3]*m[ 9]);
00585     T det22 = 
00586         m[ 0]*(m[ 5]*m[15] - m[ 7]*m[13]) - 
00587         m[ 4]*(m[ 1]*m[15] - m[ 3]*m[13]) + 
00588         m[12]*(m[ 1]*m[ 7] - m[ 3]*m[ 5]);
00589     T det23 = 
00590         m[ 0]*(m[ 5]*m[11] - m[ 7]*m[ 9]) - 
00591         m[ 4]*(m[ 1]*m[11] - m[ 3]*m[ 9]) + 
00592         m[ 8]*(m[ 1]*m[ 7] - m[ 3]*m[ 5]);
00593   
00594     T det30 = 
00595         m[ 4]*(m[ 9]*m[14] - m[10]*m[13]) - 
00596         m[ 8]*(m[ 5]*m[14] - m[ 6]*m[13]) + 
00597         m[12]*(m[ 5]*m[10] - m[ 6]*m[ 9]);
00598     T det31 = 
00599         m[ 0]*(m[ 9]*m[14] - m[10]*m[13]) - 
00600         m[ 8]*(m[ 1]*m[14] - m[ 2]*m[13]) + 
00601         m[12]*(m[ 1]*m[10] - m[ 2]*m[ 9]);
00602     T det32 = 
00603         m[ 0]*(m[ 5]*m[14] - m[ 6]*m[13]) - 
00604         m[ 4]*(m[ 1]*m[14] - m[ 2]*m[13]) + 
00605         m[12]*(m[ 1]*m[ 6] - m[ 2]*m[ 5]);
00606     T det33 = 
00607         m[ 0]*(m[ 5]*m[10] - m[ 6]*m[ 9]) - 
00608         m[ 4]*(m[ 1]*m[ 9] - m[ 2]*m[ 9]) + 
00609         m[ 8]*(m[ 1]*m[ 6] - m[ 2]*m[ 5]);
00610 
00611     T d = 1 / (det00*m[ 0] - det01*m[ 4] + det02*m[ 8] - det03*m[12]);
00612 
00613     return mat4<T>( det00*d, -det01*d,  det02*d, -det03*d,
00614                    -det10*d,  det11*d, -det12*d,  det13*d,
00615                     det20*d, -det21*d,  det22*d, -det23*d,
00616                    -det30*d,  det31*d, -det32*d,  det33*d);
00617 }
00618 
00619 template <class T>
00620 mat4<T>
00621 mat4<T>::rinv () const
00622 {
00623     mat3<T> R = rot().tp();
00624     vec3<T> p = -(R*trans());
00625     return mat4<T>(R, p);
00626 }
00627 
00628 template <class T>
00629 mat4<T>
00630 mat4<T>::tp () const
00631 {
00632     return mat4<T>(m[ 0], m[ 4], m[ 8], m[12],
00633                    m[ 1], m[ 5], m[ 9], m[13],
00634                    m[ 2], m[ 6], m[10], m[14],
00635                    m[ 3], m[ 7], m[11], m[15]);
00636 }
00637 
00638 template <class T>
00639 mat3<T>
00640 mat4<T>::rot () const
00641 {
00642     return mat3<T>(m[ 0], m[ 1], m[ 2],
00643                    m[ 4], m[ 5], m[ 6],
00644                    m[ 8], m[ 9], m[10]);
00645 }
00646 
00647 template <class T>
00648 void
00649 mat4<T>::rot (const mat3<T>& M)
00650 {
00651     m[ 0] = M.m[0]; m[ 1] = M.m[1]; m[ 2] = M.m[2];
00652     m[ 4] = M.m[3]; m[ 5] = M.m[4]; m[ 6] = M.m[5];
00653     m[ 8] = M.m[6]; m[ 9] = M.m[7]; m[10] = M.m[8];
00654 }
00655 
00656 template <class T>
00657 vec3<T>
00658 mat4<T>::trans () const
00659 {
00660     return vec3<T>(m[12], m[13], m[14]);
00661 }
00662 
00663 template <class T>
00664 void
00665 mat4<T>::trans (const vec3<T>& v)
00666 {
00667     m[12] = v.x; m[13] = v.y; m[14] = v.z;
00668 }
00669 
00670 template <class T>
00671 vec3<T>
00672 mat4<T>::tpoint (const vec3<T>& p) const
00673 {
00674     return vec3<T>(m[ 0]*p.x + m[ 4]*p.y + m[ 8]*p.z + m[12],
00675                            m[ 1]*p.x + m[ 5]*p.y + m[ 9]*p.z + m[13],
00676                            m[ 2]*p.x + m[ 6]*p.y + m[10]*p.z + m[14]);
00677 }
00678 
00679 template <class T>
00680 vec3<T>
00681 mat4<T>::tdir (const vec3<T>& p) const
00682 {
00683     return vec3<T>(m[ 0]*p.x + m[ 4]*p.y + m[ 8]*p.z,
00684                            m[ 1]*p.x + m[ 5]*p.y + m[ 9]*p.z,
00685                            m[ 2]*p.x + m[ 6]*p.y + m[10]*p.z);
00686 }
00687 
00688 template <class T>
00689 mat4<T>
00690 operator* (const T c, const mat4<T>& M)
00691 {
00692     return mat4<T>(M.m[ 0]*c, M.m[ 1]*c, M.m[ 2]*c, M.m[ 3]*c,
00693                    M.m[ 4]*c, M.m[ 5]*c, M.m[ 6]*c, M.m[ 7]*c,
00694                    M.m[ 8]*c, M.m[ 9]*c, M.m[10]*c, M.m[11]*c,
00695                    M.m[12]*c, M.m[13]*c, M.m[14]*c, M.m[15]*c);
00696 }
00697 
00698 template <class T>
00699 mat4<T>
00700 diag (const vec4<T>& v)
00701 {
00702     return mat4<T>(v.x, 0, 0, 0,
00703                    0, v.y, 0, 0,
00704                    0, 0, v.z, 0,
00705                    0, 0, 0, v.w);
00706 }
00707 
00708 template <class T>
00709 bool
00710 str2mat4 (const std::string* s, mat4<T>& M)
00711 {
00712     if (!s) return true;
00713     return str2mat4(*s, M);
00714 }
00715 
00716 //-----------------------------------------------------------------------------
00717 
00718 typedef mat4<float>  mat4f;
00719 typedef mat4<double> mat4d;
00720 
00721 #define str2mat4f str2mat4<float>
00722 #define str2mat4d str2mat4<double>
00723 
00724 #if __win32
00725 inline
00726 mat4d
00727 mm_castf2d (mat4f M)
00728 {
00729     return mat4d(M.m[ 0], M.m[ 1], M.m[ 2], M.m[ 3],
00730                  M.m[ 4], M.m[ 5], M.m[ 6], M.m[ 7],
00731                  M.m[ 8], M.m[ 9], M.m[10], M.m[11],
00732                  M.m[12], M.m[13], M.m[14], M.m[15]);
00733 }
00734 
00735 inline
00736 mat4f
00737 mm_castd2f (mat4d M)
00738 {
00739     return mat4f((float)M.m[ 0], (float)M.m[ 1], (float)M.m[ 2], (float)M.m[ 3],
00740                  (float)M.m[ 4], (float)M.m[ 5], (float)M.m[ 6], (float)M.m[ 7],
00741                  (float)M.m[ 8], (float)M.m[ 9], (float)M.m[10], (float)M.m[11],
00742                  (float)M.m[12], (float)M.m[13], (float)M.m[14], (float)M.m[15]);
00743 }
00744 #else //__real_os
00745 template <class T1, class T2>
00746 mat4<T2>
00747 mm_cast (mat4<T1> v)
00748 {
00749     return mat4<T2>(M.m[ 0], M.m[ 1], M.m[ 2], M.m[ 3],
00750                     M.m[ 4], M.m[ 5], M.m[ 6], M.m[ 7],
00751                     M.m[ 8], M.m[ 9], M.m[10], M.m[11],
00752                     M.m[12], M.m[13], M.m[14], M.m[15]);
00753 }
00754 #endif
00755 
00756 } // End of namespace gutz
00757 
00758 #endif // mat4_h

Send questions, comments, and bug reports to:
jmk