Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
3.9KB

  1. /// @ref gtx_fast_trigonometry
  2. /// @file glm/gtx/fast_trigonometry.inl
  3. namespace glm{
  4. namespace detail
  5. {
  6. template<length_t L, typename T, qualifier Q>
  7. GLM_FUNC_QUALIFIER vec<L, T, Q> taylorCos(vec<L, T, Q> const& x)
  8. {
  9. return static_cast<T>(1)
  10. - (x * x) * (1.f / 2.f)
  11. + ((x * x) * (x * x)) * (1.f / 24.f)
  12. - (((x * x) * (x * x)) * (x * x)) * (1.f / 720.f)
  13. + (((x * x) * (x * x)) * ((x * x) * (x * x))) * (1.f / 40320.f);
  14. }
  15. template<typename T>
  16. GLM_FUNC_QUALIFIER T cos_52s(T x)
  17. {
  18. T const xx(x * x);
  19. return (T(0.9999932946) + xx * (T(-0.4999124376) + xx * (T(0.0414877472) + xx * T(-0.0012712095))));
  20. }
  21. template<length_t L, typename T, qualifier Q>
  22. GLM_FUNC_QUALIFIER vec<L, T, Q> cos_52s(vec<L, T, Q> const& x)
  23. {
  24. return detail::functor1<L, T, T, Q>::call(cos_52s, x);
  25. }
  26. }//namespace detail
  27. // wrapAngle
  28. template<typename T>
  29. GLM_FUNC_QUALIFIER T wrapAngle(T angle)
  30. {
  31. return abs<T>(mod<T>(angle, two_pi<T>()));
  32. }
  33. template<length_t L, typename T, qualifier Q>
  34. GLM_FUNC_QUALIFIER vec<L, T, Q> wrapAngle(vec<L, T, Q> const& x)
  35. {
  36. return detail::functor1<L, T, T, Q>::call(wrapAngle, x);
  37. }
  38. // cos
  39. template<typename T>
  40. GLM_FUNC_QUALIFIER T fastCos(T x)
  41. {
  42. T const angle(wrapAngle<T>(x));
  43. if(angle < half_pi<T>())
  44. return detail::cos_52s(angle);
  45. if(angle < pi<T>())
  46. return -detail::cos_52s(pi<T>() - angle);
  47. if(angle < (T(3) * half_pi<T>()))
  48. return -detail::cos_52s(angle - pi<T>());
  49. return detail::cos_52s(two_pi<T>() - angle);
  50. }
  51. template<length_t L, typename T, qualifier Q>
  52. GLM_FUNC_QUALIFIER vec<L, T, Q> fastCos(vec<L, T, Q> const& x)
  53. {
  54. return detail::functor1<L, T, T, Q>::call(fastCos, x);
  55. }
  56. // sin
  57. template<typename T>
  58. GLM_FUNC_QUALIFIER T fastSin(T x)
  59. {
  60. return fastCos<T>(half_pi<T>() - x);
  61. }
  62. template<length_t L, typename T, qualifier Q>
  63. GLM_FUNC_QUALIFIER vec<L, T, Q> fastSin(vec<L, T, Q> const& x)
  64. {
  65. return detail::functor1<L, T, T, Q>::call(fastSin, x);
  66. }
  67. // tan
  68. template<typename T>
  69. GLM_FUNC_QUALIFIER T fastTan(T x)
  70. {
  71. return x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539));
  72. }
  73. template<length_t L, typename T, qualifier Q>
  74. GLM_FUNC_QUALIFIER vec<L, T, Q> fastTan(vec<L, T, Q> const& x)
  75. {
  76. return detail::functor1<L, T, T, Q>::call(fastTan, x);
  77. }
  78. // asin
  79. template<typename T>
  80. GLM_FUNC_QUALIFIER T fastAsin(T x)
  81. {
  82. return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159));
  83. }
  84. template<length_t L, typename T, qualifier Q>
  85. GLM_FUNC_QUALIFIER vec<L, T, Q> fastAsin(vec<L, T, Q> const& x)
  86. {
  87. return detail::functor1<L, T, T, Q>::call(fastAsin, x);
  88. }
  89. // acos
  90. template<typename T>
  91. GLM_FUNC_QUALIFIER T fastAcos(T x)
  92. {
  93. return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2)
  94. }
  95. template<length_t L, typename T, qualifier Q>
  96. GLM_FUNC_QUALIFIER vec<L, T, Q> fastAcos(vec<L, T, Q> const& x)
  97. {
  98. return detail::functor1<L, T, T, Q>::call(fastAcos, x);
  99. }
  100. // atan
  101. template<typename T>
  102. GLM_FUNC_QUALIFIER T fastAtan(T y, T x)
  103. {
  104. T sgn = sign(y) * sign(x);
  105. return abs(fastAtan(y / x)) * sgn;
  106. }
  107. template<length_t L, typename T, qualifier Q>
  108. GLM_FUNC_QUALIFIER vec<L, T, Q> fastAtan(vec<L, T, Q> const& y, vec<L, T, Q> const& x)
  109. {
  110. return detail::functor2<L, T, Q>::call(fastAtan, y, x);
  111. }
  112. template<typename T>
  113. GLM_FUNC_QUALIFIER T fastAtan(T x)
  114. {
  115. return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909));
  116. }
  117. template<length_t L, typename T, qualifier Q>
  118. GLM_FUNC_QUALIFIER vec<L, T, Q> fastAtan(vec<L, T, Q> const& x)
  119. {
  120. return detail::functor1<L, T, T, Q>::call(fastAtan, x);
  121. }
  122. }//namespace glm