00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
00054 inline mat4 (const mat3<T>&, const vec3<T>&);
00055 inline ~mat4 () {}
00056
00057
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
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
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>&);
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
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 }
00757
00758 #endif // mat4_h