DeferredRenderer 1.0
|
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 }