fshake3d
0.0.1
FreeformDensity3DSurfaceEditor
|
00001 #ifndef MATH_TRANSFORM_HPP 00002 #define MATH_TRANSFORM_HPP 00003 00004 #include "math.hpp" 00005 #include "opengl.hpp" 00006 00007 template<typename FloatT> 00008 gmtl::Matrix<FloatT,4,4> makeTransformPerspective(FloatT fovy, FloatT aspect, FloatT znear, FloatT zfar) 00009 { 00010 FloatT f = 1/Math::tan( Math::deg2Rad(fovy)/2 ), 00011 dp = znear - zfar; 00012 gmtl::Matrix<FloatT,4,4> r; 00013 r.set( 00014 f/aspect, 0,0,0 00015 , 0, f, 0, 0 00016 , 0, 0, (zfar+znear)/dp, (2*zfar*znear)/dp 00017 , 0, 0, -1, 0 00018 ); 00019 return r; 00020 } 00021 00022 template<typename FloatT> 00023 gmtl::Matrix<FloatT,4,4> makeInversePerspective(FloatT fovy, FloatT aspect, FloatT znear, FloatT zfar) 00024 { 00025 FloatT f = 1/Math::tan( Math::deg2Rad(fovy)/2 ), 00026 dp = znear - zfar; 00027 gmtl::Matrix<FloatT,4,4> r; 00028 r.set( 00029 aspect/f, 0,0,0 00030 , 0, 1/f, 0, 0 00031 , 0, 0, (zfar+znear)/dp, (2*zfar*znear)/dp 00032 , 0, 0, -1, 0 00033 ); 00034 return r; 00035 } 00036 00037 template<typename FloatT> 00038 gmtl::Matrix<FloatT,4,4> makeTransformOrtho(FloatT l, FloatT r, FloatT b, FloatT t, FloatT n, FloatT f) 00039 { 00040 00041 gmtl::Matrix<FloatT,4,4> result; 00042 result.set( 00043 FloatT(2.0)/(r-l), 0, 0, -(r+l)/(r-l), 00044 0, FloatT(2.0)/(t-b), 0, -(t+b)/(t-b), 00045 0, 0, FloatT(-2.0)/(f-n), -(f+n)/(f-n), 00046 0, 0, 0, FloatT(1) 00047 ); 00048 return result; 00049 } 00050 00051 template<typename FloatT> 00052 gmtl::Matrix<FloatT,4,4> makeInverseOrtho(FloatT l, FloatT r, FloatT b, FloatT t, FloatT n, FloatT f) 00053 { 00054 gmtl::Matrix<FloatT,4,4> result; 00055 result.set( 00056 (r-l)/2, 0, 0, (r+l)/2, 00057 0, (t-b)/2, 0, (t+b)/2, 00058 0, 0, (f-n)/-2, (n+f)/2, 00059 0, 0, 0, 1 00060 ); 00061 return result; 00062 } 00063 00064 #endif // MATH_TRANSFORM_HPP