00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 inline
00024 Matrix4::Matrix4() {}
00025
00026 inline
00027 Matrix4::Matrix4(Real r) {
00028 m_v[0] = m_v[1] = m_v[2] = m_v[3] =
00029 m_v[4] = m_v[5] = m_v[6] = m_v[7] =
00030 m_v[8] = m_v[9] = m_v[10] = m_v[11] =
00031 m_v[12] = m_v[13] = m_v[14] = m_v[15] = r;
00032 }
00033
00034 inline
00035 Matrix4::Matrix4(const Matrix4 &m) {
00036 m_v[0] = m.m_v[0];
00037 m_v[1] = m.m_v[1];
00038 m_v[2] = m.m_v[2];
00039 m_v[3] = m.m_v[3];
00040 m_v[4] = m.m_v[4];
00041 m_v[5] = m.m_v[5];
00042 m_v[6] = m.m_v[6];
00043 m_v[7] = m.m_v[7];
00044 m_v[8] = m.m_v[8];
00045 m_v[9] = m.m_v[9];
00046 m_v[10] = m.m_v[10];
00047 m_v[11] = m.m_v[11];
00048 m_v[12] = m.m_v[12];
00049 m_v[13] = m.m_v[13];
00050 m_v[14] = m.m_v[14];
00051 m_v[15] = m.m_v[15];
00052 }
00053
00054 inline
00055 Matrix4 Matrix4::Identity() {
00056 Matrix4 res;
00057
00058 res.m_v[0] = res.m_v[5] = res.m_v[10] = res.m_v[15] = 1.0;
00059 res.m_v[1] = res.m_v[2] = res.m_v[3] = res.m_v[4] =
00060 res.m_v[6] = res.m_v[7] = res.m_v[8] = res.m_v[9] =
00061 res.m_v[11] = res.m_v[12] = res.m_v[13] = res.m_v[14] = 0.0;
00062
00063 return res;
00064 }
00065
00066 inline
00067 Matrix4 Matrix4::Rotation(const Quaternion &q) {
00068 Matrix4 res;
00069
00070 res.m_v[0] = 1.0 - 2.0 * (q.m_v.m_y * q.m_v.m_y + q.m_v.m_z * q.m_v.m_z);
00071 res.m_v[1] = 2.0 * (q.m_v.m_x * q.m_v.m_y - q.m_s * q.m_v.m_z);
00072 res.m_v[2] = 2.0 * (q.m_v.m_x * q.m_v.m_z + q.m_s * q.m_v.m_y);
00073 res.m_v[4] = 2.0 * (q.m_v.m_x * q.m_v.m_y + q.m_s * q.m_v.m_z);
00074 res.m_v[5] = 1.0 - 2.0 * (q.m_v.m_x * q.m_v.m_x + q.m_v.m_z * q.m_v.m_z);
00075 res.m_v[6] = 2.0 * (q.m_v.m_y * q.m_v.m_z - q.m_s * q.m_v.m_x);
00076 res.m_v[8] = 2.0 * (q.m_v.m_x * q.m_v.m_z - q.m_s * q.m_v.m_y);
00077 res.m_v[9] = 2.0 * (q.m_v.m_y * q.m_v.m_z + q.m_s * q.m_v.m_x);
00078 res.m_v[10] = 1.0 - 2.0 * (q.m_v.m_x * q.m_v.m_x + q.m_v.m_y * q.m_v.m_y);
00079
00080 res.m_v[3] = res.m_v[7] = res.m_v[11] =
00081 res.m_v[12] = res.m_v[13] = res.m_v[14] = 0.0;
00082 res.m_v[15] = 1.0;
00083
00084 return res;
00085 }
00086
00087 inline
00088 Matrix4 Matrix4::Rotation(Real angle, const Vector3 &axis) {
00089
00090 assert(!"Not implemented yet.");
00091 return Matrix4();
00092 }
00093
00094 inline
00095 Matrix4 Matrix4::Rotation(Real rotx, Real roty, Real rotz) {
00096 const Real a = cos(rotx);
00097 const Real b = sin(rotx);
00098 const Real c = cos(roty);
00099 const Real d = sin(roty);
00100 const Real e = cos(rotz);
00101 const Real f = sin(rotz);
00102
00103 const Real ad = a * d;
00104 const Real bd = b * d;
00105
00106 Matrix4 res;
00107
00108 res.m_v[0] = c * e;
00109 res.m_v[1] = -a * f + bd * e;
00110 res.m_v[2] = b * f + ad * e;
00111 res.m_v[3] = 0.0;
00112 res.m_v[4] = c * f;
00113 res.m_v[5] = a * e + bd * f;
00114 res.m_v[6] = -b * e + ad * f;
00115 res.m_v[7] = 0.0;
00116 res.m_v[8] = -d;
00117 res.m_v[9] = b * c;
00118 res.m_v[10] = a * c;
00119 res.m_v[11] = 0.0;
00120 res.m_v[12] = 0.0;
00121 res.m_v[13] = 0.0;
00122 res.m_v[14] = 0.0;
00123 res.m_v[15] = 1.0;
00124
00125 return res;
00126 }
00127
00128 inline
00129 Matrix4 Matrix4::Scale(const Vector3 &s) {
00130 Matrix4 res;
00131
00132 res.m_v[0] = s.m_x;
00133 res.m_v[5] = s.m_y;
00134 res.m_v[10] = s.m_z;
00135 res.m_v[15] = 1.0;
00136
00137 res.m_v[1] = res.m_v[2] = res.m_v[3] = res.m_v[4] =
00138 res.m_v[6] = res.m_v[7] = res.m_v[8] = res.m_v[9] =
00139 res.m_v[11] = res.m_v[12] = res.m_v[13] = res.m_v[14] = 0.0;
00140
00141 return res;
00142 }
00143
00144 inline
00145 Matrix4 Matrix4::Translation(const Vector3 &t) {
00146 Matrix4 res;
00147
00148 res.m_v[0] = res.m_v[5] = res.m_v[10] = res.m_v[15] = 1.0;
00149 res.m_v[1] = res.m_v[2] = res.m_v[4] =
00150 res.m_v[6] = res.m_v[8] = res.m_v[9] =
00151 res.m_v[12] = res.m_v[13] = res.m_v[14] = 0.0;
00152
00153 res.m_v[3] = t.m_x;
00154 res.m_v[7] = t.m_y;
00155 res.m_v[11] = t.m_z;
00156
00157 return res;
00158 }
00159
00160 inline
00161 Matrix4 &Matrix4::operator=(Real r) {
00162 m_v[0] = m_v[1] = m_v[2] = m_v[3] =
00163 m_v[4] = m_v[5] = m_v[6] = m_v[7] =
00164 m_v[8] = m_v[9] = m_v[10] = m_v[11] =
00165 m_v[12] = m_v[13] = m_v[14] = m_v[15] = r;
00166
00167 return *this;
00168 }
00169
00170 inline
00171 Matrix4 &Matrix4::operator=(const Matrix4 &m) {
00172 m_v[0] = m.m_v[0];
00173 m_v[1] = m.m_v[1];
00174 m_v[2] = m.m_v[2];
00175 m_v[3] = m.m_v[3];
00176 m_v[4] = m.m_v[4];
00177 m_v[5] = m.m_v[5];
00178 m_v[6] = m.m_v[6];
00179 m_v[7] = m.m_v[7];
00180 m_v[8] = m.m_v[8];
00181 m_v[9] = m.m_v[9];
00182 m_v[10] = m.m_v[10];
00183 m_v[11] = m.m_v[11];
00184 m_v[12] = m.m_v[12];
00185 m_v[13] = m.m_v[13];
00186 m_v[14] = m.m_v[14];
00187 m_v[15] = m.m_v[15];
00188
00189 return *this;
00190 }
00191
00192 inline
00193 Matrix4 Matrix4::operator+(const Matrix4 &m) const {
00194 Matrix4 res;
00195
00196 res.m_v[0] = m_v[0] + m.m_v[0];
00197 res.m_v[1] = m_v[1] + m.m_v[1];
00198 res.m_v[2] = m_v[2] + m.m_v[2];
00199 res.m_v[3] = m_v[3] + m.m_v[3];
00200 res.m_v[4] = m_v[4] + m.m_v[4];
00201 res.m_v[5] = m_v[5] + m.m_v[5];
00202 res.m_v[6] = m_v[6] + m.m_v[6];
00203 res.m_v[7] = m_v[7] + m.m_v[7];
00204 res.m_v[8] = m_v[8] + m.m_v[8];
00205 res.m_v[9] = m_v[9] + m.m_v[9];
00206 res.m_v[10] = m_v[10] + m.m_v[10];
00207 res.m_v[11] = m_v[11] + m.m_v[11];
00208 res.m_v[12] = m_v[12] + m.m_v[12];
00209 res.m_v[13] = m_v[13] + m.m_v[13];
00210 res.m_v[14] = m_v[14] + m.m_v[14];
00211 res.m_v[15] = m_v[15] + m.m_v[15];
00212
00213 return res;
00214 }
00215
00216 inline
00217 Matrix4 Matrix4::operator-(const Matrix4 &m) const {
00218 Matrix4 res;
00219
00220 res.m_v[0] = m_v[0] - m.m_v[0];
00221 res.m_v[1] = m_v[1] - m.m_v[1];
00222 res.m_v[2] = m_v[2] - m.m_v[2];
00223 res.m_v[3] = m_v[3] - m.m_v[3];
00224 res.m_v[4] = m_v[4] - m.m_v[4];
00225 res.m_v[5] = m_v[5] - m.m_v[5];
00226 res.m_v[6] = m_v[6] - m.m_v[6];
00227 res.m_v[7] = m_v[7] - m.m_v[7];
00228 res.m_v[8] = m_v[8] - m.m_v[8];
00229 res.m_v[9] = m_v[9] - m.m_v[9];
00230 res.m_v[10] = m_v[10] - m.m_v[10];
00231 res.m_v[11] = m_v[11] - m.m_v[11];
00232 res.m_v[12] = m_v[12] - m.m_v[12];
00233 res.m_v[13] = m_v[13] - m.m_v[13];
00234 res.m_v[14] = m_v[14] - m.m_v[14];
00235 res.m_v[15] = m_v[15] - m.m_v[15];
00236
00237 return res;
00238 }
00239
00240 inline
00241 Matrix4 Matrix4::operator-() const {
00242 Matrix4 res;
00243
00244 res.m_v[0] = - m_v[0];
00245 res.m_v[1] = - m_v[1];
00246 res.m_v[2] = - m_v[2];
00247 res.m_v[3] = - m_v[3];
00248 res.m_v[4] = - m_v[4];
00249 res.m_v[5] = - m_v[5];
00250 res.m_v[6] = - m_v[6];
00251 res.m_v[7] = - m_v[7];
00252 res.m_v[8] = - m_v[8];
00253 res.m_v[9] = - m_v[9];
00254 res.m_v[10] = - m_v[10];
00255 res.m_v[11] = - m_v[11];
00256 res.m_v[12] = - m_v[12];
00257 res.m_v[13] = - m_v[13];
00258 res.m_v[14] = - m_v[14];
00259 res.m_v[15] = - m_v[15];
00260
00261 return res;
00262 }
00263
00264 inline
00265 Matrix4 Matrix4::operator*(Real r) const {
00266 Matrix4 res;
00267
00268 res.m_v[0] = m_v[0] * r;
00269 res.m_v[1] = m_v[1] * r;
00270 res.m_v[2] = m_v[2] * r;
00271 res.m_v[3] = m_v[3] * r;
00272 res.m_v[4] = m_v[4] * r;
00273 res.m_v[5] = m_v[5] * r;
00274 res.m_v[6] = m_v[6] * r;
00275 res.m_v[7] = m_v[7] * r;
00276 res.m_v[8] = m_v[8] * r;
00277 res.m_v[9] = m_v[9] * r;
00278 res.m_v[10] = m_v[10] * r;
00279 res.m_v[11] = m_v[11] * r;
00280 res.m_v[12] = m_v[12] * r;
00281 res.m_v[13] = m_v[13] * r;
00282 res.m_v[14] = m_v[14] * r;
00283 res.m_v[15] = m_v[15] * r;
00284
00285 return res;
00286 }
00287
00288 inline
00289 Matrix4 Matrix4::operator/(Real r) const {
00290 Real inv_r = 1.0 / r;
00291
00292 Matrix4 res;
00293
00294 res.m_v[0] = m_v[0] * inv_r;
00295 res.m_v[1] = m_v[1] * inv_r;
00296 res.m_v[2] = m_v[2] * inv_r;
00297 res.m_v[3] = m_v[3] * inv_r;
00298 res.m_v[4] = m_v[4] * inv_r;
00299 res.m_v[5] = m_v[5] * inv_r;
00300 res.m_v[6] = m_v[6] * inv_r;
00301 res.m_v[7] = m_v[7] * inv_r;
00302 res.m_v[8] = m_v[8] * inv_r;
00303 res.m_v[9] = m_v[9] * inv_r;
00304 res.m_v[10] = m_v[10] * inv_r;
00305 res.m_v[11] = m_v[11] * inv_r;
00306 res.m_v[12] = m_v[12] * inv_r;
00307 res.m_v[13] = m_v[13] * inv_r;
00308 res.m_v[14] = m_v[14] * inv_r;
00309 res.m_v[15] = m_v[15] * inv_r;
00310
00311 return res;
00312 }
00313
00314 inline
00315 Matrix4 &Matrix4::operator+=(const Matrix4 &m) {
00316 m_v[0] += m.m_v[0];
00317 m_v[1] += m.m_v[1];
00318 m_v[2] += m.m_v[2];
00319 m_v[3] += m.m_v[3];
00320 m_v[4] += m.m_v[4];
00321 m_v[5] += m.m_v[5];
00322 m_v[6] += m.m_v[6];
00323 m_v[7] += m.m_v[7];
00324 m_v[8] += m.m_v[8];
00325 m_v[9] += m.m_v[9];
00326 m_v[10] += m.m_v[10];
00327 m_v[11] += m.m_v[11];
00328 m_v[12] += m.m_v[12];
00329 m_v[13] += m.m_v[13];
00330 m_v[14] += m.m_v[14];
00331 m_v[15] += m.m_v[15];
00332
00333 return *this;
00334 }
00335
00336 inline
00337 Matrix4 &Matrix4::operator-=(const Matrix4 &m) {
00338 m_v[0] -= m.m_v[0];
00339 m_v[1] -= m.m_v[1];
00340 m_v[2] -= m.m_v[2];
00341 m_v[3] -= m.m_v[3];
00342 m_v[4] -= m.m_v[4];
00343 m_v[5] -= m.m_v[5];
00344 m_v[6] -= m.m_v[6];
00345 m_v[7] -= m.m_v[7];
00346 m_v[8] -= m.m_v[8];
00347 m_v[9] -= m.m_v[9];
00348 m_v[10] -= m.m_v[10];
00349 m_v[11] -= m.m_v[11];
00350 m_v[12] -= m.m_v[12];
00351 m_v[13] -= m.m_v[13];
00352 m_v[14] -= m.m_v[14];
00353 m_v[15] -= m.m_v[15];
00354
00355 return *this;
00356 }
00357
00358 inline
00359 Matrix4 &Matrix4::operator*=(Real r) {
00360 m_v[0] *= r;
00361 m_v[1] *= r;
00362 m_v[2] *= r;
00363 m_v[3] *= r;
00364 m_v[4] *= r;
00365 m_v[5] *= r;
00366 m_v[6] *= r;
00367 m_v[7] *= r;
00368 m_v[8] *= r;
00369 m_v[9] *= r;
00370 m_v[10] *= r;
00371 m_v[11] *= r;
00372 m_v[12] *= r;
00373 m_v[13] *= r;
00374 m_v[14] *= r;
00375 m_v[15] *= r;
00376
00377 return *this;
00378 }
00379
00380 inline
00381 Matrix4 &Matrix4::operator/=(Real r) {
00382 Real inv_r = 1.0 / r;
00383
00384 m_v[0] *= inv_r;
00385 m_v[1] *= inv_r;
00386 m_v[2] *= inv_r;
00387 m_v[3] *= inv_r;
00388 m_v[4] *= inv_r;
00389 m_v[5] *= inv_r;
00390 m_v[6] *= inv_r;
00391 m_v[7] *= inv_r;
00392 m_v[8] *= inv_r;
00393 m_v[9] *= inv_r;
00394 m_v[10] *= inv_r;
00395 m_v[11] *= inv_r;
00396 m_v[12] *= inv_r;
00397 m_v[13] *= inv_r;
00398 m_v[14] *= inv_r;
00399 m_v[15] *= inv_r;
00400
00401 return *this;
00402 }
00403
00404 inline
00405 Matrix4 Matrix4::operator*(const Matrix4 &m) const {
00406 Matrix4 res;
00407
00408 res.m_v[0] = m_v[0] * m.m_v[0] + m_v[1] * m.m_v[4] + m_v[2] * m.m_v[8] + m_v[3] * m.m_v[12];
00409 res.m_v[1] = m_v[0] * m.m_v[1] + m_v[1] * m.m_v[5] + m_v[2] * m.m_v[9] + m_v[3] * m.m_v[13];
00410 res.m_v[2] = m_v[0] * m.m_v[2] + m_v[1] * m.m_v[6] + m_v[2] * m.m_v[10] + m_v[3] * m.m_v[14];
00411 res.m_v[3] = m_v[0] * m.m_v[3] + m_v[1] * m.m_v[7] + m_v[2] * m.m_v[11] + m_v[3] * m.m_v[15];
00412
00413 res.m_v[4] = m_v[4] * m.m_v[0] + m_v[5] * m.m_v[4] + m_v[6] * m.m_v[8] + m_v[7] * m.m_v[12];
00414 res.m_v[5] = m_v[4] * m.m_v[1] + m_v[5] * m.m_v[5] + m_v[6] * m.m_v[9] + m_v[7] * m.m_v[13];
00415 res.m_v[6] = m_v[4] * m.m_v[2] + m_v[5] * m.m_v[6] + m_v[6] * m.m_v[10] + m_v[7] * m.m_v[14];
00416 res.m_v[7] = m_v[4] * m.m_v[3] + m_v[5] * m.m_v[7] + m_v[6] * m.m_v[11] + m_v[7] * m.m_v[15];
00417
00418 res.m_v[8] = m_v[8] * m.m_v[0] + m_v[9] * m.m_v[4] + m_v[10] * m.m_v[8] + m_v[11] * m.m_v[12];
00419 res.m_v[9] = m_v[8] * m.m_v[1] + m_v[9] * m.m_v[5] + m_v[10] * m.m_v[9] + m_v[11] * m.m_v[13];
00420 res.m_v[10] = m_v[8] * m.m_v[2] + m_v[9] * m.m_v[6] + m_v[10] * m.m_v[10] + m_v[11] * m.m_v[14];
00421 res.m_v[11] = m_v[8] * m.m_v[3] + m_v[9] * m.m_v[7] + m_v[10] * m.m_v[11] + m_v[11] * m.m_v[15];
00422
00423 res.m_v[12] = m_v[12] * m.m_v[0] + m_v[13] * m.m_v[4] + m_v[14] * m.m_v[8] + m_v[15] * m.m_v[12];
00424 res.m_v[13] = m_v[12] * m.m_v[1] + m_v[13] * m.m_v[5] + m_v[14] * m.m_v[9] + m_v[15] * m.m_v[13];
00425 res.m_v[14] = m_v[12] * m.m_v[2] + m_v[13] * m.m_v[6] + m_v[14] * m.m_v[10] + m_v[15] * m.m_v[14];
00426 res.m_v[15] = m_v[12] * m.m_v[3] + m_v[13] * m.m_v[7] + m_v[14] * m.m_v[11] + m_v[15] * m.m_v[15];
00427
00428 return res;
00429 }
00430
00431 inline
00432 Matrix4 &Matrix4::operator*=(const Matrix4 &m) {
00433 Real u, v, w;
00434
00435 u = m_v[0] * m.m_v[0] + m_v[1] * m.m_v[4] + m_v[2] * m.m_v[8] + m_v[3] * m.m_v[12];
00436 v = m_v[0] * m.m_v[1] + m_v[1] * m.m_v[5] + m_v[2] * m.m_v[9] + m_v[3] * m.m_v[13];
00437 w = m_v[0] * m.m_v[2] + m_v[1] * m.m_v[6] + m_v[2] * m.m_v[10] + m_v[3] * m.m_v[14];
00438
00439 m_v[3] = m_v[0] * m.m_v[3] + m_v[1] * m.m_v[7] + m_v[2] * m.m_v[11] + m_v[3] * m.m_v[15];
00440 m_v[0] = u;
00441 m_v[1] = v;
00442 m_v[2] = w;
00443
00444 u = m_v[4] * m.m_v[0] + m_v[5] * m.m_v[4] + m_v[6] * m.m_v[8] + m_v[7] * m.m_v[12];
00445 v = m_v[4] * m.m_v[1] + m_v[5] * m.m_v[5] + m_v[6] * m.m_v[9] + m_v[7] * m.m_v[13];
00446 w = m_v[4] * m.m_v[2] + m_v[5] * m.m_v[6] + m_v[6] * m.m_v[10] + m_v[7] * m.m_v[14];
00447 m_v[7] = m_v[4] * m.m_v[3] + m_v[5] * m.m_v[7] + m_v[6] * m.m_v[11] + m_v[7] * m.m_v[15];
00448
00449 m_v[4] = u;
00450 m_v[5] = v;
00451 m_v[6] = w;
00452
00453 u = m_v[8] * m.m_v[0] + m_v[9] * m.m_v[4] + m_v[10] * m.m_v[8] + m_v[11] * m.m_v[12];
00454 v = m_v[8] * m.m_v[1] + m_v[9] * m.m_v[5] + m_v[10] * m.m_v[9] + m_v[11] * m.m_v[13];
00455 w = m_v[8] * m.m_v[2] + m_v[9] * m.m_v[6] + m_v[10] * m.m_v[10] + m_v[11] * m.m_v[14];
00456 m_v[11] = m_v[8] * m.m_v[3] + m_v[9] * m.m_v[7] + m_v[10] * m.m_v[11] + m_v[11] * m.m_v[15];
00457
00458 m_v[8] = u;
00459 m_v[9] = v;
00460 m_v[10] = w;
00461
00462 u = m_v[12] * m.m_v[0] + m_v[13] * m.m_v[4] + m_v[14] * m.m_v[8] + m_v[15] * m.m_v[12];
00463 v = m_v[12] * m.m_v[1] + m_v[13] * m.m_v[5] + m_v[14] * m.m_v[9] + m_v[15] * m.m_v[13];
00464 w = m_v[12] * m.m_v[2] + m_v[13] * m.m_v[6] + m_v[14] * m.m_v[10] + m_v[15] * m.m_v[14];
00465 m_v[15] = m_v[12] * m.m_v[3] + m_v[13] * m.m_v[7] + m_v[14] * m.m_v[11] + m_v[15] * m.m_v[15];
00466
00467 m_v[12] = u;
00468 m_v[13] = v;
00469 m_v[14] = w;
00470
00471 return *this;
00472 }
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494 inline
00495 Vector4 Matrix4::operator*(const Vector4 &v) const {
00496 return Vector4(
00497 m_v[0] * v.m_x + m_v[1] * v.m_y + m_v[2] * v.m_z + m_v[3] * v.m_w,
00498 m_v[4] * v.m_x + m_v[5] * v.m_y + m_v[6] * v.m_z + m_v[7] * v.m_w,
00499 m_v[8] * v.m_x + m_v[9] * v.m_y + m_v[10] * v.m_z + m_v[11] * v.m_w,
00500 m_v[12] * v.m_x + m_v[13] * v.m_y + m_v[14] * v.m_z + m_v[15] * v.m_w);
00501 }
00502
00503 inline
00504 Vector3 Matrix4::operator*(const Vector3 &v) const {
00505 return Vector3(
00506 m_v[0] * v.m_x + m_v[1] * v.m_y + m_v[2] * v.m_z,
00507 m_v[4] * v.m_x + m_v[5] * v.m_y + m_v[6] * v.m_z,
00508 m_v[8] * v.m_x + m_v[9] * v.m_y + m_v[10] * v.m_z);
00509 }
00510
00511 inline
00512 Point3 Matrix4::operator*(const Point3 &v) const {
00513 return Point3(
00514 m_v[0] * v.m_x + m_v[1] * v.m_y + m_v[2] * v.m_z + m_v[3],
00515 m_v[4] * v.m_x + m_v[5] * v.m_y + m_v[6] * v.m_z + m_v[7],
00516 m_v[8] * v.m_x + m_v[9] * v.m_y + m_v[10] * v.m_z + m_v[11]);
00517 }
00518
00519 inline
00520 Real &Matrix4::operator[](int i) {
00521 assert(i >= 0 && i < 16);
00522
00523 return m_v[i];
00524 }
00525
00526 inline
00527 const Real &Matrix4::operator[](int i) const {
00528 assert(i >= 0 && i < 16);
00529
00530 return m_v[i];
00531 }
00532
00533 inline
00534 Real &Matrix4::operator()(int row, int column) {
00535 assert(row >= 0 && row < 4);
00536 assert(column >= 0 && column < 4);
00537
00538 return m_v[row + row + row + column];
00539 }
00540
00541 inline
00542 const Real &Matrix4::operator()(int row, int column) const {
00543 assert(row >= 0 && row < 4);
00544 assert(column >= 0 && column < 4);
00545
00546 return m_v[row + row + row + column];
00547 }
00548
00549 inline
00550 Matrix4 Matrix4::Transpose() const {
00551 Matrix4 res;
00552
00553 res.m_v[0] = m_v[0];
00554 res.m_v[1] = m_v[4];
00555 res.m_v[2] = m_v[8];
00556 res.m_v[3] = m_v[12];
00557 res.m_v[4] = m_v[1];
00558 res.m_v[5] = m_v[5];
00559 res.m_v[6] = m_v[9];
00560 res.m_v[7] = m_v[13];
00561 res.m_v[8] = m_v[2];
00562 res.m_v[9] = m_v[6];
00563 res.m_v[10] = m_v[10];
00564 res.m_v[11] = m_v[14];
00565 res.m_v[12] = m_v[3];
00566 res.m_v[13] = m_v[7];
00567 res.m_v[14] = m_v[11];
00568 res.m_v[15] = m_v[15];
00569
00570 return res;
00571 }
00572
00573 #define DET(c0, c1, c2, c3, c4, c5, c6, c7, c8) \
00574 (c0 * (c4 * c8 - c5 * c7) + \
00575 c1 * (c5 * c6 - c3 * c8) + \
00576 c2 * (c3 * c7 - c4 * c6))
00577
00578 inline
00579 Matrix4 Matrix4::Inverse() const {
00580
00581
00582 const Real c0 = m_v[0];
00583 const Real c1 = m_v[1];
00584 const Real c2 = m_v[2];
00585 const Real c3 = m_v[3];
00586 const Real c4 = m_v[4];
00587 const Real c5 = m_v[5];
00588 const Real c6 = m_v[6];
00589 const Real c7 = m_v[7];
00590 const Real c8 = m_v[8];
00591 const Real c9 = m_v[9];
00592 const Real c10 = m_v[10];
00593 const Real c11 = m_v[11];
00594 const Real c12 = m_v[12];
00595 const Real c13 = m_v[13];
00596 const Real c14 = m_v[14];
00597 const Real c15 = m_v[15];
00598
00599 const Real u = DET(c5, c9, c13, c6, c10, c14, c7, c11, c15);
00600 const Real v = - DET(c4, c8, c12, c6, c10, c14, c7, c11, c15);
00601 const Real w = DET(c4, c8, c12, c5, c9, c13, c7, c11, c15);
00602 const Real x = - DET(c4, c8, c12, c5, c9, c13, c6, c10, c14);
00603
00604 Matrix4 res;
00605
00606
00607 res.m_v[0] = u;
00608 res.m_v[1] = - DET(c1, c9, c13, c2, c10, c14, c3, c11, c15);
00609 res.m_v[2] = DET(c1, c5, c13, c2, c6, c14, c3, c7, c15);
00610 res.m_v[3] = - DET(c1, c5, c9, c2, c6, c10, c3, c7, c11);
00611 res.m_v[4] = v;
00612 res.m_v[5] = DET(c0, c8, c12, c2, c10, c14, c3, c11, c15);
00613 res.m_v[6] = - DET(c0, c4, c12, c2, c6, c14, c3, c7, c15);
00614 res.m_v[7] = DET(c0, c4, c8, c2, c6, c10, c3, c7, c11);
00615 res.m_v[8] = w;
00616 res.m_v[9] = - DET(c0, c8, c12, c1, c9, c13, c3, c11, c15);
00617 res.m_v[10] = DET(c0, c4, c12, c1, c5, c13, c3, c7, c15);
00618 res.m_v[11] = - DET(c0, c4, c8, c1, c5, c9, c3, c7, c11);
00619 res.m_v[12] = x;
00620 res.m_v[13] = DET(c0, c8, c12, c1, c9, c13, c2, c10, c14);
00621 res.m_v[14] = - DET(c0, c4, c12, c1, c5, c13, c2, c6, c14);
00622 res.m_v[15] = DET(c0, c4, c8, c1, c5, c9, c2, c6, c10);
00623
00624
00625 const Real det = m_v[0] * u + m_v[1] * v + m_v[2] * w + m_v[3] * x;
00626
00627
00628
00629 assert(det != 0.0);
00630
00631
00632
00633 const Real inv_det = 1.0 / det;
00634 res.m_v[0] *= inv_det;
00635 res.m_v[1] *= inv_det;
00636 res.m_v[2] *= inv_det;
00637 res.m_v[3] *= inv_det;
00638 res.m_v[4] *= inv_det;
00639 res.m_v[5] *= inv_det;
00640 res.m_v[6] *= inv_det;
00641 res.m_v[7] *= inv_det;
00642 res.m_v[8] *= inv_det;
00643 res.m_v[9] *= inv_det;
00644 res.m_v[10] *= inv_det;
00645 res.m_v[11] *= inv_det;
00646 res.m_v[12] *= inv_det;
00647 res.m_v[13] *= inv_det;
00648 res.m_v[14] *= inv_det;
00649 res.m_v[15] *= inv_det;
00650
00651 return res;
00652 }
00653
00654 inline
00655 Real Matrix4::Determinant() const {
00656 const Real c4 = m_v[4];
00657 const Real c5 = m_v[5];
00658 const Real c6 = m_v[6];
00659 const Real c7 = m_v[7];
00660 const Real c8 = m_v[8];
00661 const Real c9 = m_v[9];
00662 const Real c10 = m_v[10];
00663 const Real c11 = m_v[11];
00664 const Real c12 = m_v[12];
00665 const Real c13 = m_v[13];
00666 const Real c14 = m_v[14];
00667 const Real c15 = m_v[15];
00668
00669 return
00670 m_v[0] * DET(c5, c9, c13, c6, c10, c14, c7, c11, c15)
00671 - m_v[1] * DET(c4, c8, c12, c6, c10, c14, c7, c11, c15)
00672 + m_v[2] * DET(c4, c8, c12, c5, c9, c13, c7, c11, c15)
00673 - m_v[3] * DET(c4, c8, c12, c5, c9, c13, c6, c10, c14);
00674 }
00675
00676 #undef DET
00677
00678 inline
00679 Real Matrix4::Trace() const {
00680 return m_v[0] + m_v[5] + m_v[10] + m_v[15];
00681 }
00682
00683 inline
00684 Matrix4 operator*(Real r, const Matrix4 &m) {
00685 return m * r;
00686 }