/////////////////////////////////////////////////////////////////////////////////////////////////// // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2008-08-03 // Updated : 2008-09-14 // Licence : This source is under MIT License // File : glm/core/func_trigonometric.inl /////////////////////////////////////////////////////////////////////////////////////////////////// namespace glm { namespace core{ namespace function{ namespace trigonometric{ // radians template GLM_FUNC_QUALIFIER genType radians ( genType const & degrees ) { GLM_STATIC_ASSERT(detail::type::is_float, "'radians' only accept floating-point input"); const genType pi = genType(3.1415926535897932384626433832795); return degrees * (pi / genType(180)); } template GLM_FUNC_QUALIFIER detail::tvec2 radians ( detail::tvec2 const & degrees ) { return detail::tvec2( radians(degrees.x), radians(degrees.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 radians ( detail::tvec3 const & degrees ) { return detail::tvec3( radians(degrees.x), radians(degrees.y), radians(degrees.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 radians ( detail::tvec4 const & degrees ) { return detail::tvec4( radians(degrees.x), radians(degrees.y), radians(degrees.z), radians(degrees.w)); } // degrees template GLM_FUNC_QUALIFIER genType degrees ( genType const & radians ) { GLM_STATIC_ASSERT(detail::type::is_float, "'degrees' only accept floating-point input"); const genType pi = genType(3.1415926535897932384626433832795); return radians * (genType(180) / pi); } template GLM_FUNC_QUALIFIER detail::tvec2 degrees ( detail::tvec2 const & radians ) { return detail::tvec2( degrees(radians.x), degrees(radians.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 degrees ( detail::tvec3 const & radians ) { return detail::tvec3( degrees(radians.x), degrees(radians.y), degrees(radians.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 degrees ( detail::tvec4 const & radians ) { return detail::tvec4( degrees(radians.x), degrees(radians.y), degrees(radians.z), degrees(radians.w)); } // sin template GLM_FUNC_QUALIFIER genType sin ( genType const & angle ) { GLM_STATIC_ASSERT(detail::type::is_float, "'sin' only accept floating-point input"); return ::std::sin(angle); } template GLM_FUNC_QUALIFIER detail::tvec2 sin ( detail::tvec2 const & angle ) { return detail::tvec2( sin(angle.x), sin(angle.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 sin ( detail::tvec3 const & angle ) { return detail::tvec3( sin(angle.x), sin(angle.y), sin(angle.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 sin ( detail::tvec4 const & angle ) { return detail::tvec4( sin(angle.x), sin(angle.y), sin(angle.z), sin(angle.w)); } // cos template GLM_FUNC_QUALIFIER genType cos(genType const & angle) { GLM_STATIC_ASSERT(detail::type::is_float, "'cos' only accept floating-point input"); return ::std::cos(angle); } template GLM_FUNC_QUALIFIER detail::tvec2 cos ( detail::tvec2 const & angle ) { return detail::tvec2( cos(angle.x), cos(angle.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 cos ( detail::tvec3 const & angle ) { return detail::tvec3( cos(angle.x), cos(angle.y), cos(angle.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 cos ( detail::tvec4 const & angle ) { return detail::tvec4( cos(angle.x), cos(angle.y), cos(angle.z), cos(angle.w)); } // tan template GLM_FUNC_QUALIFIER genType tan ( genType const & angle ) { GLM_STATIC_ASSERT(detail::type::is_float, "'tan' only accept floating-point input"); return ::std::tan(angle); } template GLM_FUNC_QUALIFIER detail::tvec2 tan ( detail::tvec2 const & angle ) { return detail::tvec2( tan(angle.x), tan(angle.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 tan ( detail::tvec3 const & angle ) { return detail::tvec3( tan(angle.x), tan(angle.y), tan(angle.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 tan ( detail::tvec4 const & angle ) { return detail::tvec4( tan(angle.x), tan(angle.y), tan(angle.z), tan(angle.w)); } // asin template GLM_FUNC_QUALIFIER genType asin ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'asin' only accept floating-point input"); return ::std::asin(x); } template GLM_FUNC_QUALIFIER detail::tvec2 asin ( detail::tvec2 const & x ) { return detail::tvec2( asin(x.x), asin(x.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 asin ( detail::tvec3 const & x ) { return detail::tvec3( asin(x.x), asin(x.y), asin(x.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 asin ( detail::tvec4 const & x ) { return detail::tvec4( asin(x.x), asin(x.y), asin(x.z), asin(x.w)); } // acos template GLM_FUNC_QUALIFIER genType acos ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'acos' only accept floating-point input"); return ::std::acos(x); } template GLM_FUNC_QUALIFIER detail::tvec2 acos ( detail::tvec2 const & x ) { return detail::tvec2( acos(x.x), acos(x.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 acos ( detail::tvec3 const & x ) { return detail::tvec3( acos(x.x), acos(x.y), acos(x.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 acos ( detail::tvec4 const & x ) { return detail::tvec4( acos(x.x), acos(x.y), acos(x.z), acos(x.w)); } // atan template GLM_FUNC_QUALIFIER genType atan ( genType const & y, genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'atan' only accept floating-point input"); return ::std::atan2(y, x); } template GLM_FUNC_QUALIFIER detail::tvec2 atan ( detail::tvec2 const & y, detail::tvec2 const & x ) { return detail::tvec2( atan(y.x, x.x), atan(y.y, x.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 atan ( detail::tvec3 const & y, detail::tvec3 const & x ) { return detail::tvec3( atan(y.x, x.x), atan(y.y, x.y), atan(y.z, x.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 atan ( detail::tvec4 const & y, detail::tvec4 const & x ) { return detail::tvec4( atan(y.x, x.x), atan(y.y, x.y), atan(y.z, x.z), atan(y.w, x.w)); } template GLM_FUNC_QUALIFIER genType atan ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'atan' only accept floating-point input"); return ::std::atan(x); } template GLM_FUNC_QUALIFIER detail::tvec2 atan ( detail::tvec2 const & x ) { return detail::tvec2( atan(x.x), atan(x.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 atan ( detail::tvec3 const & x ) { return detail::tvec3( atan(x.x), atan(x.y), atan(x.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 atan ( detail::tvec4 const & x ) { return detail::tvec4( atan(x.x), atan(x.y), atan(x.z), atan(x.w)); } // sinh template GLM_FUNC_QUALIFIER genType sinh ( genType const & angle ) { GLM_STATIC_ASSERT(detail::type::is_float, "'sinh' only accept floating-point input"); return std::sinh(angle); } template GLM_FUNC_QUALIFIER detail::tvec2 sinh ( detail::tvec2 const & angle ) { return detail::tvec2( sinh(angle.x), sinh(angle.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 sinh ( detail::tvec3 const & angle ) { return detail::tvec3( sinh(angle.x), sinh(angle.y), sinh(angle.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 sinh ( detail::tvec4 const & angle ) { return detail::tvec4( sinh(angle.x), sinh(angle.y), sinh(angle.z), sinh(angle.w)); } // cosh template GLM_FUNC_QUALIFIER genType cosh ( genType const & angle ) { GLM_STATIC_ASSERT(detail::type::is_float, "'cosh' only accept floating-point input"); return std::cosh(angle); } template GLM_FUNC_QUALIFIER detail::tvec2 cosh ( detail::tvec2 const & angle ) { return detail::tvec2( cosh(angle.x), cosh(angle.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 cosh ( detail::tvec3 const & angle ) { return detail::tvec3( cosh(angle.x), cosh(angle.y), cosh(angle.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 cosh ( detail::tvec4 const & angle ) { return detail::tvec4( cosh(angle.x), cosh(angle.y), cosh(angle.z), cosh(angle.w)); } // tanh template GLM_FUNC_QUALIFIER genType tanh ( genType const & angle ) { GLM_STATIC_ASSERT(detail::type::is_float, "'tanh' only accept floating-point input"); return std::tanh(angle); } template GLM_FUNC_QUALIFIER detail::tvec2 tanh ( detail::tvec2 const & angle ) { return detail::tvec2( tanh(angle.x), tanh(angle.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 tanh ( detail::tvec3 const & angle ) { return detail::tvec3( tanh(angle.x), tanh(angle.y), tanh(angle.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 tanh ( detail::tvec4 const & angle ) { return detail::tvec4( tanh(angle.x), tanh(angle.y), tanh(angle.z), tanh(angle.w)); } // asinh template GLM_FUNC_QUALIFIER genType asinh ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'asinh' only accept floating-point input"); return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x)); } template GLM_FUNC_QUALIFIER detail::tvec2 asinh ( detail::tvec2 const & x ) { return detail::tvec2( asinh(x.x), asinh(x.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 asinh ( detail::tvec3 const & x ) { return detail::tvec3( asinh(x.x), asinh(x.y), asinh(x.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 asinh ( detail::tvec4 const & x ) { return detail::tvec4( asinh(x.x), asinh(x.y), asinh(x.z), asinh(x.w)); } // acosh template GLM_FUNC_QUALIFIER genType acosh ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'acosh' only accept floating-point input"); if(x < genType(1)) return genType(0); return log(x + sqrt(x * x - genType(1))); } template GLM_FUNC_QUALIFIER detail::tvec2 acosh ( detail::tvec2 const & x ) { return detail::tvec2( acosh(x.x), acosh(x.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 acosh ( detail::tvec3 const & x ) { return detail::tvec3( acosh(x.x), acosh(x.y), acosh(x.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 acosh ( detail::tvec4 const & x ) { return detail::tvec4( acosh(x.x), acosh(x.y), acosh(x.z), acosh(x.w)); } // atanh template GLM_FUNC_QUALIFIER genType atanh ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'atanh' only accept floating-point input"); if(abs(x) >= genType(1)) return 0; return genType(0.5) * log((genType(1) + x) / (genType(1) - x)); } template GLM_FUNC_QUALIFIER detail::tvec2 atanh ( detail::tvec2 const & x ) { return detail::tvec2( atanh(x.x), atanh(x.y)); } template GLM_FUNC_QUALIFIER detail::tvec3 atanh ( detail::tvec3 const & x ) { return detail::tvec3( atanh(x.x), atanh(x.y), atanh(x.z)); } template GLM_FUNC_QUALIFIER detail::tvec4 atanh ( detail::tvec4 const & x ) { return detail::tvec4( atanh(x.x), atanh(x.y), atanh(x.z), atanh(x.w)); } }//namespace trigonometric }//namespace function }//namespace core }//namespace glm