diff --git a/glm/detail/func_common.inl b/glm/detail/func_common.inl index 75159a71..1a00ff50 100644 --- a/glm/detail/func_common.inl +++ b/glm/detail/func_common.inl @@ -297,7 +297,7 @@ namespace detail template GLM_FUNC_QUALIFIER genType mod(genType x, genType y) { - return tvec1(x, y).x; + return mod(tvec1(x), y).x; } template class vecType> diff --git a/glm/gtc/constants.hpp b/glm/gtc/constants.hpp index 76fc1eb4..a39c9bd1 100644 --- a/glm/gtc/constants.hpp +++ b/glm/gtc/constants.hpp @@ -71,6 +71,11 @@ namespace glm template GLM_FUNC_DECL genType pi(); + /// Return pi * 2. + /// @see gtc_constants + template + GLM_FUNC_DECL genType two_pi(); + /// Return square root of pi. /// @see gtc_constants template @@ -81,6 +86,11 @@ namespace glm template GLM_FUNC_DECL genType half_pi(); + /// Return pi / 2 * 3. + /// @see gtc_constants + template + GLM_FUNC_DECL genType three_over_two_pi(); + /// Return pi / 4. /// @see gtc_constants template @@ -91,11 +101,21 @@ namespace glm template GLM_FUNC_DECL genType one_over_pi(); + /// Return 1 / (pi * 2). + /// @see gtc_constants + template + GLM_FUNC_DECL genType one_over_two_pi(); + /// Return 2 / pi. /// @see gtc_constants template GLM_FUNC_DECL genType two_over_pi(); + /// Return 4 / pi. + /// @see gtc_constants + template + GLM_FUNC_DECL genType four_over_pi(); + /// Return 2 / sqrt(pi). /// @see gtc_constants template diff --git a/glm/gtc/constants.inl b/glm/gtc/constants.inl index d74c53d7..4b351418 100644 --- a/glm/gtc/constants.inl +++ b/glm/gtc/constants.inl @@ -54,6 +54,12 @@ namespace glm return genType(3.14159265358979323846264338327950288); } + template + GLM_FUNC_QUALIFIER genType two_pi() + { + return genType(6.28318530717958647692528676655900576); + } + template GLM_FUNC_QUALIFIER genType root_pi() { @@ -66,6 +72,12 @@ namespace glm return genType(1.57079632679489661923132169163975144); } + template + GLM_FUNC_QUALIFIER genType three_over_two_pi() + { + return genType(4.71238898038468985769396507491925432); + } + template GLM_FUNC_QUALIFIER genType quarter_pi() { @@ -78,12 +90,24 @@ namespace glm return genType(0.318309886183790671537767526745028724); } + template + GLM_FUNC_QUALIFIER genType one_over_two_pi() + { + return genType(0.159154943091895335768883763372514362); + } + template GLM_FUNC_QUALIFIER genType two_over_pi() { return genType(0.636619772367581343075535053490057448); } + template + GLM_FUNC_QUALIFIER genType four_over_pi() + { + return genType(1.273239544735162686151070106980114898); + } + template GLM_FUNC_QUALIFIER genType two_over_root_pi() { diff --git a/glm/gtx/fast_trigonometry.hpp b/glm/gtx/fast_trigonometry.hpp index 148c23f5..8e7a9251 100644 --- a/glm/gtx/fast_trigonometry.hpp +++ b/glm/gtx/fast_trigonometry.hpp @@ -39,6 +39,7 @@ // Dependency: #include "../glm.hpp" +#include "../gtc/constants.hpp" #if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED)) # pragma message("GLM: GLM_GTX_fast_trigonometry extension included") @@ -49,45 +50,48 @@ namespace glm /// @addtogroup gtx_fast_trigonometry /// @{ - //! Faster than the common sin function but less accurate. - //! Defined between -2pi and 2pi. - //! From GLM_GTX_fast_trigonometry extension. + /// Wrap an angle to [0 2pi[ + /// From GLM_GTX_fast_trigonometry extension. template + GLM_FUNC_DECL T wrapAngle(T angle); + + /// Faster than the common sin function but less accurate. + /// From GLM_GTX_fast_trigonometry extension. + template GLM_FUNC_DECL T fastSin(T angle); - //! Faster than the common cos function but less accurate. - //! Defined between -2pi and 2pi. - //! From GLM_GTX_fast_trigonometry extension. + /// Faster than the common cos function but less accurate. + /// From GLM_GTX_fast_trigonometry extension. template GLM_FUNC_DECL T fastCos(T angle); - //! Faster than the common tan function but less accurate. - //! Defined between -2pi and 2pi. - //! From GLM_GTX_fast_trigonometry extension. + /// Faster than the common tan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. template GLM_FUNC_DECL T fastTan(T angle); - //! Faster than the common asin function but less accurate. - //! Defined between -2pi and 2pi. - //! From GLM_GTX_fast_trigonometry extension. + /// Faster than the common asin function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. template GLM_FUNC_DECL T fastAsin(T angle); - //! Faster than the common acos function but less accurate. - //! Defined between -2pi and 2pi. - //! From GLM_GTX_fast_trigonometry extension. + /// Faster than the common acos function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. template GLM_FUNC_DECL T fastAcos(T angle); - //! Faster than the common atan function but less accurate. - //! Defined between -2pi and 2pi. - //! From GLM_GTX_fast_trigonometry extension. + /// Faster than the common atan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. template GLM_FUNC_DECL T fastAtan(T y, T x); - //! Faster than the common atan function but less accurate. - //! Defined between -2pi and 2pi. - //! From GLM_GTX_fast_trigonometry extension. + /// Faster than the common atan function but less accurate. + /// Defined between -2pi and 2pi. + /// From GLM_GTX_fast_trigonometry extension. template GLM_FUNC_DECL T fastAtan(T angle); diff --git a/glm/gtx/fast_trigonometry.inl b/glm/gtx/fast_trigonometry.inl index d5d83b37..3f8abcde 100644 --- a/glm/gtx/fast_trigonometry.inl +++ b/glm/gtx/fast_trigonometry.inl @@ -7,26 +7,50 @@ // File : glm/gtx/fast_trigonometry.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm +namespace glm{ +namespace detail { - // sin - template - GLM_FUNC_QUALIFIER T fastSin(T x) + template + GLM_FUNC_QUALIFIER T cos_52s(T x) { - return x - ((x * x * x) / T(6)) + ((x * x * x * x * x) / T(120)) - ((x * x * x * x * x * x * x) / T(5040)); + T const xx(x * x); + return (T(0.9999932946) + xx * (T(-0.4999124376) + xx * (T(0.0414877472) + xx * T(-0.0012712095)))); } template class vecType> - GLM_FUNC_QUALIFIER vecType fastSin(vecType const & x) + GLM_FUNC_QUALIFIER vecType cos_52s(vecType const & x) { - return detail::functor1::call(fastSin, x); + return detail::functor1::call(cos_52s, x); + } +}//namespace detail + + // wrapAngle + template + GLM_FUNC_QUALIFIER T wrapAngle(T angle) + { + return abs(mod(angle, two_pi())); + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType wrapAngle(vecType const & x) + { + return detail::functor1::call(wrapAngle, x); } // cos template GLM_FUNC_QUALIFIER T fastCos(T x) { - return T(1) - (x * x * T(0.5)) + (x * x * x * x * T(0.041666666666)) - (x * x * x * x * x * x * T(0.00138888888888)); + T const angle(wrapAngle(x)); + + if(angle()) + return detail::cos_52s(angle); + if(angle()) + return -detail::cos_52s(pi() - angle); + if(angle<(T(3) * half_pi())) + return -detail::cos_52s(angle - pi()); + + return detail::cos_52s(two_pi() - angle); } template class vecType> @@ -35,6 +59,19 @@ namespace glm return detail::functor1::call(fastCos, x); } + // sin + template + GLM_FUNC_QUALIFIER T fastSin(T x) + { + return fastCos(half_pi() - x); + } + + template class vecType> + GLM_FUNC_QUALIFIER vecType fastSin(vecType const & x) + { + return detail::functor1::call(fastSin, x); + } + // tan template GLM_FUNC_QUALIFIER T fastTan(T x)