DeferredRenderer 1.0

NGLMath.cpp

Go to the documentation of this file.
00001 #include "NGLMath.h"
00002 
00003 
00004 ngl::Matrix Lookat(const ngl::Vector &_eye, const ngl::Vector &_target,const ngl::Vector &_lookup)
00005 {
00006 
00007     ngl::Vector minusEye = -_eye;
00008     ngl::Vector w= _eye - _target;
00009     ngl::Vector u= _lookup.cross(w);
00010     ngl::Vector v= w.cross(u);
00011 
00012     w.normalize();
00013     v.normalize();
00014     u.normalize();
00015 
00016     ngl::Matrix view;
00017 
00018     view.m_00 = u.m_x;
00019     view.m_01 = u.m_y;
00020     view.m_02 = u.m_z;
00021     view.m_03 = minusEye.dot(u);
00022 
00023     view.m_10 = v.m_x;
00024     view.m_11 = v.m_y;
00025     view.m_12 = v.m_z;
00026     view.m_13 = minusEye.dot(v);
00027 
00028     view.m_20 = w.m_x;
00029     view.m_21 = w.m_y;
00030     view.m_22 = w.m_z;
00031     view.m_23 = minusEye.dot(w);
00032 
00033     view.m_30 = 0.0;
00034     view.m_31 = 0.0;
00035     view.m_32 = 0.0;
00036     view.m_33 = 1.0;
00037 
00038 
00039     return view;
00040 }
00041 
00042 ngl::Matrix Adj( const ngl::Matrix &_mat )
00043 {        
00044     ngl::Matrix m;
00045 
00046     m.m_00 = _mat.m_m[1][1]*(_mat.m_m[2][2]*_mat.m_m[3][3]-_mat.m_m[3][2]*_mat.m_m[2][3])+_mat.m_m[1][2]*(_mat.m_m[3][1]*_mat.m_m[2][3]-_mat.m_m[2][1]*_mat.m_m[3][3])+_mat.m_m[1][3]*(_mat.m_m[2][1]*_mat.m_m[3][2]-_mat.m_m[3][1]*_mat.m_m[2][2]);
00047     m.m_01 = _mat.m_m[1][0]*(_mat.m_m[3][2]*_mat.m_m[2][3]-_mat.m_m[2][2]*_mat.m_m[3][3])+_mat.m_m[1][2]*(_mat.m_m[2][0]*_mat.m_m[3][3]-_mat.m_m[3][0]*_mat.m_m[2][3])+_mat.m_m[1][3]*(_mat.m_m[3][0]*_mat.m_m[2][2]-_mat.m_m[2][0]*_mat.m_m[3][2]);
00048     m.m_02 = _mat.m_m[1][0]*(_mat.m_m[2][1]*_mat.m_m[3][3]-_mat.m_m[3][1]*_mat.m_m[2][3])+_mat.m_m[1][1]*(_mat.m_m[3][0]*_mat.m_m[2][3]-_mat.m_m[2][0]*_mat.m_m[3][3])+_mat.m_m[1][3]*(_mat.m_m[2][0]*_mat.m_m[3][1]-_mat.m_m[3][0]*_mat.m_m[2][1]);
00049     m.m_03 = _mat.m_m[1][0]*(_mat.m_m[3][1]*_mat.m_m[2][2]-_mat.m_m[2][1]*_mat.m_m[3][2])+_mat.m_m[1][1]*(_mat.m_m[2][0]*_mat.m_m[3][2]-_mat.m_m[3][0]*_mat.m_m[2][2])+_mat.m_m[1][2]*(_mat.m_m[3][0]*_mat.m_m[2][1]-_mat.m_m[2][0]*_mat.m_m[3][1]);
00050 
00051     m.m_10 = _mat.m_m[0][1]*(_mat.m_m[3][2]*_mat.m_m[2][3]-_mat.m_m[2][2]*_mat.m_m[3][3])+_mat.m_m[0][2]*(_mat.m_m[2][1]*_mat.m_m[3][3]-_mat.m_m[3][1]*_mat.m_m[2][3])+_mat.m_m[0][3]*(_mat.m_m[3][1]*_mat.m_m[2][2]-_mat.m_m[2][1]*_mat.m_m[3][2]);
00052     m.m_11 = _mat.m_m[0][0]*(_mat.m_m[2][2]*_mat.m_m[3][3]-_mat.m_m[3][2]*_mat.m_m[2][3])+_mat.m_m[0][2]*(_mat.m_m[3][0]*_mat.m_m[2][3]-_mat.m_m[2][0]*_mat.m_m[3][3])+_mat.m_m[0][3]*(_mat.m_m[2][0]*_mat.m_m[3][2]-_mat.m_m[3][0]*_mat.m_m[2][2]);
00053     m.m_12 = _mat.m_m[0][0]*(_mat.m_m[3][1]*_mat.m_m[2][3]-_mat.m_m[2][1]*_mat.m_m[3][3])+_mat.m_m[0][1]*(_mat.m_m[2][0]*_mat.m_m[3][3]-_mat.m_m[3][0]*_mat.m_m[2][3])+_mat.m_m[0][3]*(_mat.m_m[3][0]*_mat.m_m[2][1]-_mat.m_m[2][0]*_mat.m_m[3][1]);
00054     m.m_13=  _mat.m_m[0][0]*(_mat.m_m[2][1]*_mat.m_m[3][2]-_mat.m_m[3][1]*_mat.m_m[2][2])+_mat.m_m[0][1]*(_mat.m_m[3][0]*_mat.m_m[2][2]-_mat.m_m[2][0]*_mat.m_m[3][2])+_mat.m_m[0][2]*(_mat.m_m[2][0]*_mat.m_m[3][1]-_mat.m_m[3][0]*_mat.m_m[2][1]);
00055 
00056     m.m_20 = _mat.m_m[0][1]*(_mat.m_m[1][2]*_mat.m_m[3][3]-_mat.m_m[3][2]*_mat.m_m[1][3])+_mat.m_m[0][2]*(_mat.m_m[3][1]*_mat.m_m[1][3]-_mat.m_m[1][1]*_mat.m_m[3][3])+_mat.m_m[0][3]*(_mat.m_m[1][1]*_mat.m_m[3][2]-_mat.m_m[3][1]*_mat.m_m[1][2]);
00057     m.m_21 = _mat.m_m[0][0]*(_mat.m_m[3][2]*_mat.m_m[1][3]-_mat.m_m[1][2]*_mat.m_m[3][3])+_mat.m_m[0][2]*(_mat.m_m[1][0]*_mat.m_m[3][3]-_mat.m_m[3][0]*_mat.m_m[1][3])+_mat.m_m[0][3]*(_mat.m_m[3][0]*_mat.m_m[1][2]-_mat.m_m[1][0]*_mat.m_m[3][2]);
00058     m.m_22 = _mat.m_m[0][0]*(_mat.m_m[1][1]*_mat.m_m[3][3]-_mat.m_m[3][1]*_mat.m_m[1][3])+_mat.m_m[0][1]*(_mat.m_m[3][0]*_mat.m_m[1][3]-_mat.m_m[1][0]*_mat.m_m[3][3])+_mat.m_m[0][3]*(_mat.m_m[1][0]*_mat.m_m[3][1]-_mat.m_m[3][0]*_mat.m_m[1][1]);
00059     m.m_23 = _mat.m_m[0][0]*(_mat.m_m[3][1]*_mat.m_m[1][2]-_mat.m_m[1][1]*_mat.m_m[3][2])+_mat.m_m[0][1]*(_mat.m_m[1][0]*_mat.m_m[3][2]-_mat.m_m[3][0]*_mat.m_m[1][2])+_mat.m_m[0][2]*(_mat.m_m[3][0]*_mat.m_m[1][1]-_mat.m_m[1][0]*_mat.m_m[3][1]);
00060 
00061     m.m_30 = _mat.m_m[0][1]*(_mat.m_m[2][2]*_mat.m_m[1][3]-_mat.m_m[1][2]*_mat.m_m[2][3])+_mat.m_m[0][2]*(_mat.m_m[1][1]*_mat.m_m[2][3]-_mat.m_m[2][1]*_mat.m_m[1][3])+_mat.m_m[0][3]*(_mat.m_m[2][1]*_mat.m_m[1][2]-_mat.m_m[1][1]*_mat.m_m[2][2]);
00062     m.m_31 = _mat.m_m[0][0]*(_mat.m_m[1][2]*_mat.m_m[2][3]-_mat.m_m[2][2]*_mat.m_m[1][3])+_mat.m_m[0][2]*(_mat.m_m[2][0]*_mat.m_m[1][3]-_mat.m_m[1][0]*_mat.m_m[2][3])+_mat.m_m[0][3]*(_mat.m_m[1][0]*_mat.m_m[2][2]-_mat.m_m[2][0]*_mat.m_m[1][2]);
00063     m.m_32 = _mat.m_m[0][0]*(_mat.m_m[2][1]*_mat.m_m[1][3]-_mat.m_m[1][1]*_mat.m_m[2][3])+_mat.m_m[0][1]*(_mat.m_m[1][0]*_mat.m_m[2][3]-_mat.m_m[2][0]*_mat.m_m[1][3])+_mat.m_m[0][3]*(_mat.m_m[2][0]*_mat.m_m[1][1]-_mat.m_m[1][0]*_mat.m_m[2][1]);
00064     m.m_33 = _mat.m_m[0][0]*(_mat.m_m[1][1]*_mat.m_m[2][2]-_mat.m_m[2][1]*_mat.m_m[1][2])+_mat.m_m[0][1]*(_mat.m_m[2][0]*_mat.m_m[1][2]-_mat.m_m[1][0]*_mat.m_m[2][2])+_mat.m_m[0][2]*(_mat.m_m[1][0]*_mat.m_m[2][1]-_mat.m_m[2][0]*_mat.m_m[1][1]);
00065 
00066     return m;
00067 }
00068 
00069 float Det( const ngl::Matrix &_mat )
00070 {
00071     // Our matrices are 4.4 only, so we can just write the full formula instead of a complex algorithm.
00072     return (
00073       _mat.m_m[0][0]*_mat.m_m[1][1]*_mat.m_m[2][2]*_mat.m_m[3][3] - _mat.m_m[0][0]*_mat.m_m[1][1]*_mat.m_m[2][3]*_mat.m_m[3][2] + _mat.m_m[0][0]*_mat.m_m[1][2]*_mat.m_m[2][3]*_mat.m_m[3][1] - _mat.m_m[0][0]*_mat.m_m[1][2]*_mat.m_m[2][1]*_mat.m_m[3][3] + _mat.m_m[0][0]*_mat.m_m[1][3]*_mat.m_m[2][1]*_mat.m_m[3][2] - _mat.m_m[0][0]*_mat.m_m[1][3]*_mat.m_m[2][2]*_mat.m_m[3][1]
00074     - _mat.m_m[1][0]*_mat.m_m[2][1]*_mat.m_m[3][2]*_mat.m_m[0][3] + _mat.m_m[1][0]*_mat.m_m[2][1]*_mat.m_m[0][2]*_mat.m_m[3][3] - _mat.m_m[1][0]*_mat.m_m[3][1]*_mat.m_m[0][2]*_mat.m_m[2][3] + _mat.m_m[1][0]*_mat.m_m[3][1]*_mat.m_m[2][2]*_mat.m_m[0][3] - _mat.m_m[1][0]*_mat.m_m[0][1]*_mat.m_m[2][2]*_mat.m_m[3][3] + _mat.m_m[1][0]*_mat.m_m[0][1]*_mat.m_m[3][2]*_mat.m_m[2][3]
00075     + _mat.m_m[2][0]*_mat.m_m[3][1]*_mat.m_m[0][2]*_mat.m_m[1][3] - _mat.m_m[2][0]*_mat.m_m[3][1]*_mat.m_m[1][2]*_mat.m_m[0][3] + _mat.m_m[2][0]*_mat.m_m[0][1]*_mat.m_m[1][2]*_mat.m_m[3][3] - _mat.m_m[2][0]*_mat.m_m[0][1]*_mat.m_m[3][2]*_mat.m_m[1][3] + _mat.m_m[2][0]*_mat.m_m[1][1]*_mat.m_m[3][2]*_mat.m_m[0][3] - _mat.m_m[2][0]*_mat.m_m[1][1]*_mat.m_m[0][2]*_mat.m_m[3][3]
00076     - _mat.m_m[3][0]*_mat.m_m[0][1]*_mat.m_m[1][2]*_mat.m_m[2][3] + _mat.m_m[3][0]*_mat.m_m[0][1]*_mat.m_m[2][2]*_mat.m_m[1][3] - _mat.m_m[3][0]*_mat.m_m[1][1]*_mat.m_m[2][2]*_mat.m_m[0][3] + _mat.m_m[3][0]*_mat.m_m[1][1]*_mat.m_m[0][2]*_mat.m_m[2][3] - _mat.m_m[3][0]*_mat.m_m[2][1]*_mat.m_m[0][2]*_mat.m_m[1][3] + _mat.m_m[3][0]*_mat.m_m[2][1]*_mat.m_m[1][2]*_mat.m_m[0][3]
00077     );
00078 }
00079 
00080 ngl::Matrix Inverse( const ngl::Matrix &_mat )
00081 {
00082     return Adj(_mat)*(1.0/Det(_mat));
00083 }
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Defines