vector_reciprocal.inl 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /// @ref ext_vector_reciprocal
  2. #include "../trigonometric.hpp"
  3. #include <limits>
  4. namespace glm
  5. {
  6. // sec
  7. template<length_t L, typename T, qualifier Q>
  8. GLM_FUNC_QUALIFIER vec<L, T, Q> sec(vec<L, T, Q> const& x)
  9. {
  10. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'sec' only accept floating-point inputs");
  11. return static_cast<T>(1) / detail::functor1<vec, L, T, T, Q>::call(cos, x);
  12. }
  13. // csc
  14. template<length_t L, typename T, qualifier Q>
  15. GLM_FUNC_QUALIFIER vec<L, T, Q> csc(vec<L, T, Q> const& x)
  16. {
  17. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'csc' only accept floating-point inputs");
  18. return static_cast<T>(1) / detail::functor1<vec, L, T, T, Q>::call(sin, x);
  19. }
  20. // cot
  21. template<length_t L, typename T, qualifier Q>
  22. GLM_FUNC_QUALIFIER vec<L, T, Q> cot(vec<L, T, Q> const& x)
  23. {
  24. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'cot' only accept floating-point inputs");
  25. T const pi_over_2 = static_cast<T>(3.1415926535897932384626433832795 / 2.0);
  26. return detail::functor1<vec, L, T, T, Q>::call(tan, pi_over_2 - x);
  27. }
  28. // asec
  29. template<length_t L, typename T, qualifier Q>
  30. GLM_FUNC_QUALIFIER vec<L, T, Q> asec(vec<L, T, Q> const& x)
  31. {
  32. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'asec' only accept floating-point inputs");
  33. return detail::functor1<vec, L, T, T, Q>::call(acos, static_cast<T>(1) / x);
  34. }
  35. // acsc
  36. template<length_t L, typename T, qualifier Q>
  37. GLM_FUNC_QUALIFIER vec<L, T, Q> acsc(vec<L, T, Q> const& x)
  38. {
  39. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'acsc' only accept floating-point inputs");
  40. return detail::functor1<vec, L, T, T, Q>::call(asin, static_cast<T>(1) / x);
  41. }
  42. // acot
  43. template<length_t L, typename T, qualifier Q>
  44. GLM_FUNC_QUALIFIER vec<L, T, Q> acot(vec<L, T, Q> const& x)
  45. {
  46. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'acot' only accept floating-point inputs");
  47. T const pi_over_2 = static_cast<T>(3.1415926535897932384626433832795 / 2.0);
  48. return pi_over_2 - detail::functor1<vec, L, T, T, Q>::call(atan, x);
  49. }
  50. // sech
  51. template<length_t L, typename T, qualifier Q>
  52. GLM_FUNC_QUALIFIER vec<L, T, Q> sech(vec<L, T, Q> const& x)
  53. {
  54. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'sech' only accept floating-point inputs");
  55. return static_cast<T>(1) / detail::functor1<vec, L, T, T, Q>::call(cosh, x);
  56. }
  57. // csch
  58. template<length_t L, typename T, qualifier Q>
  59. GLM_FUNC_QUALIFIER vec<L, T, Q> csch(vec<L, T, Q> const& x)
  60. {
  61. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'csch' only accept floating-point inputs");
  62. return static_cast<T>(1) / detail::functor1<vec, L, T, T, Q>::call(sinh, x);
  63. }
  64. // coth
  65. template<length_t L, typename T, qualifier Q>
  66. GLM_FUNC_QUALIFIER vec<L, T, Q> coth(vec<L, T, Q> const& x)
  67. {
  68. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'coth' only accept floating-point inputs");
  69. return glm::cosh(x) / glm::sinh(x);
  70. }
  71. // asech
  72. template<length_t L, typename T, qualifier Q>
  73. GLM_FUNC_QUALIFIER vec<L, T, Q> asech(vec<L, T, Q> const& x)
  74. {
  75. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'asech' only accept floating-point inputs");
  76. return detail::functor1<vec, L, T, T, Q>::call(acosh, static_cast<T>(1) / x);
  77. }
  78. // acsch
  79. template<length_t L, typename T, qualifier Q>
  80. GLM_FUNC_QUALIFIER vec<L, T, Q> acsch(vec<L, T, Q> const& x)
  81. {
  82. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'acsch' only accept floating-point inputs");
  83. return detail::functor1<vec, L, T, T, Q>::call(asinh, static_cast<T>(1) / x);
  84. }
  85. // acoth
  86. template<length_t L, typename T, qualifier Q>
  87. GLM_FUNC_QUALIFIER vec<L, T, Q> acoth(vec<L, T, Q> const& x)
  88. {
  89. GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'acoth' only accept floating-point inputs");
  90. return detail::functor1<vec, L, T, T, Q>::call(atanh, static_cast<T>(1) / x);
  91. }
  92. }//namespace glm