|
|
|
@ -9,24 +9,47 @@ |
|
|
|
|
|
|
|
|
|
namespace glm |
|
|
|
|
{ |
|
|
|
|
// sin |
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER T fastSin(T const & x) |
|
|
|
|
GLM_FUNC_QUALIFIER T wrapAngle(T const & angle) |
|
|
|
|
{ |
|
|
|
|
return x - ((x * x * x) / T(6)) + ((x * x * x * x * x) / T(120)) - ((x * x * x * x * x * x * x) / T(5040)); |
|
|
|
|
T result = angle - floor<T>(angle * one_over_two_pi<T>()) * two_pi<T>(); |
|
|
|
|
result = result > T(0) ? result : -result; |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
VECTORIZE_VEC(fastSin) |
|
|
|
|
VECTORIZE_VEC(wrapAngle) |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER T cos_52s(T const & x) |
|
|
|
|
{ |
|
|
|
|
T const xx(x * x); |
|
|
|
|
return (T(0.9999932946) + xx * (T(-0.4999124376) + xx * (T(0.0414877472) + xx * T(-0.0012712095)))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
VECTORIZE_VEC(cos_52s) |
|
|
|
|
|
|
|
|
|
// cos |
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER T fastCos(T const & 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<T>(x)); |
|
|
|
|
if(angle<half_pi<T>()) return cos_52s(angle); |
|
|
|
|
if(angle<pi<T>()) return -cos_52s(pi<T>() - angle); |
|
|
|
|
if(angle<(T(3) * half_pi<T>())) return -cos_52s(angle - pi<T>()); |
|
|
|
|
return cos_52s(two_pi<T>() - angle); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
VECTORIZE_VEC(fastCos) |
|
|
|
|
|
|
|
|
|
// sin |
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER T fastSin(T const & x) |
|
|
|
|
{ |
|
|
|
|
return fastCos<T>(half_pi<T>() - x); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
VECTORIZE_VEC(fastSin) |
|
|
|
|
|
|
|
|
|
// tan |
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER T fastTan(T const & x) |
|
|
|
|