Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

matrix4.inl

Go to the documentation of this file.
00001 /*
00002     Sheep - A Rigid Body Dynamics Engine
00003     Copyright (C) 2001-2004 Francois Beaune
00004     Contact: http://toxicengine.sourceforge.net/
00005 
00006     This file is part of Sheep.
00007 
00008     Sheep is free software; you can redistribute it and/or modify
00009     it under the terms of the GNU General Public License as published by
00010     the Free Software Foundation; either version 2 of the License, or
00011     (at your option) any later version.
00012 
00013     Sheep is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016     GNU General Public License for more details.
00017 
00018     You should have received a copy of the GNU General Public License
00019     along with Sheep; if not, write to the Free Software
00020     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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) {    // q must be normalized
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     //!\todo implement.
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 /*inline
00475 Vector3 Matrix4::operator*(const Vector3 &v) const {
00476     // We treat v as the 4-dimensional vector (v.x, v.y, v.z, 1.0), and by
00477     // multiplying this vector by the 4x4 matrix, we obtain a 4-dimensional
00478     // vector (res.x, res.y, res.z, w). Finally, we divide the resulting
00479     // vector res by w to obtain a 3-dimensional vector.
00480 
00481     Real w = m_v[12] * v.m_x + m_v[13] * v.m_y + m_v[14] * v.m_z + m_v[15];
00482 
00483     assert(w != 0.0);
00484 
00485     Vector3 res;
00486 
00487     res.m_x = m_v[0] * v.m_x + m_v[1] * v.m_y + m_v[2] * v.m_z + m_v[3];
00488     res.m_y = m_v[4] * v.m_x + m_v[5] * v.m_y + m_v[6] * v.m_z + m_v[7];
00489     res.m_z = m_v[8] * v.m_x + m_v[9] * v.m_y + m_v[10] * v.m_z + m_v[11];
00490 
00491     return res / w;
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     // Compute the matrix inverse using Cramer's rule.
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     // Compute cofactors.
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     // Compute matrix determinant.
00625     const Real det = m_v[0] * u + m_v[1] * v + m_v[2] * w + m_v[3] * x;
00626 
00627     //!\todo Throw an exception if the matrix to be inverted
00628     //!\todo is singular (i.e. if fabs(det) <= EPSILON).
00629     assert(det != 0.0);
00630 
00631     // Multiply the obtained matrix by the reciprocal of the
00632     // input matrix determinant.
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 }

Generated on Tue May 11 01:31:51 2004 for toxic by doxygen 1.3.6