1#include "_vectorize.hpp" 2#include <cmath> 3#include <limits> 4 5namespace glm 6{ 7 // radians 8 template<typename genType> 9 GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType radians(genType degrees) 10 { 11 GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'radians' only accept floating-point input"); 12 13 return degrees * static_cast<genType>(0.01745329251994329576923690768489); 14 } 15 16 template<length_t L, typename T, qualifier Q> 17 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, T, Q> radians(vec<L, T, Q> const& v) 18 { 19 return detail::functor1<vec, L, T, T, Q>::call(radians, v); 20 } 21 22 // degrees 23 template<typename genType> 24 GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType degrees(genType radians) 25 { 26 GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'degrees' only accept floating-point input"); 27 28 return radians * static_cast<genType>(57.295779513082320876798154814105); 29 } 30 31 template<length_t L, typename T, qualifier Q> 32 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, T, Q> degrees(vec<L, T, Q> const& v) 33 { 34 return detail::functor1<vec, L, T, T, Q>::call(degrees, v); 35 } 36 37 // sin 38 using ::std::sin; 39 40 template<length_t L, typename T, qualifier Q> 41 GLM_FUNC_QUALIFIER vec<L, T, Q> sin(vec<L, T, Q> const& v) 42 { 43 return detail::functor1<vec, L, T, T, Q>::call(sin, v); 44 } 45 46 // cos 47 using std::cos; 48 49 template<length_t L, typename T, qualifier Q> 50 GLM_FUNC_QUALIFIER vec<L, T, Q> cos(vec<L, T, Q> const& v) 51 { 52 return detail::functor1<vec, L, T, T, Q>::call(cos, v); 53 } 54 55 // tan 56 using std::tan; 57 58 template<length_t L, typename T, qualifier Q> 59 GLM_FUNC_QUALIFIER vec<L, T, Q> tan(vec<L, T, Q> const& v) 60 { 61 return detail::functor1<vec, L, T, T, Q>::call(tan, v); 62 } 63 64 // asin 65 using std::asin; 66 67 template<length_t L, typename T, qualifier Q> 68 GLM_FUNC_QUALIFIER vec<L, T, Q> asin(vec<L, T, Q> const& v) 69 { 70 return detail::functor1<vec, L, T, T, Q>::call(asin, v); 71 } 72 73 // acos 74 using std::acos; 75 76 template<length_t L, typename T, qualifier Q> 77 GLM_FUNC_QUALIFIER vec<L, T, Q> acos(vec<L, T, Q> const& v) 78 { 79 return detail::functor1<vec, L, T, T, Q>::call(acos, v); 80 } 81 82 // atan 83 template<typename genType> 84 GLM_FUNC_QUALIFIER genType atan(genType y, genType x) 85 { 86 GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atan' only accept floating-point input"); 87 88 return ::std::atan2(y, x); 89 } 90 91 template<length_t L, typename T, qualifier Q> 92 GLM_FUNC_QUALIFIER vec<L, T, Q> atan(vec<L, T, Q> const& a, vec<L, T, Q> const& b) 93 { 94 return detail::functor2<vec, L, T, Q>::call(::std::atan2, a, b); 95 } 96 97 using std::atan; 98 99 template<length_t L, typename T, qualifier Q> 100 GLM_FUNC_QUALIFIER vec<L, T, Q> atan(vec<L, T, Q> const& v) 101 { 102 return detail::functor1<vec, L, T, T, Q>::call(atan, v); 103 } 104 105 // sinh 106 using std::sinh; 107 108 template<length_t L, typename T, qualifier Q> 109 GLM_FUNC_QUALIFIER vec<L, T, Q> sinh(vec<L, T, Q> const& v) 110 { 111 return detail::functor1<vec, L, T, T, Q>::call(sinh, v); 112 } 113 114 // cosh 115 using std::cosh; 116 117 template<length_t L, typename T, qualifier Q> 118 GLM_FUNC_QUALIFIER vec<L, T, Q> cosh(vec<L, T, Q> const& v) 119 { 120 return detail::functor1<vec, L, T, T, Q>::call(cosh, v); 121 } 122 123 // tanh 124 using std::tanh; 125 126 template<length_t L, typename T, qualifier Q> 127 GLM_FUNC_QUALIFIER vec<L, T, Q> tanh(vec<L, T, Q> const& v) 128 { 129 return detail::functor1<vec, L, T, T, Q>::call(tanh, v); 130 } 131 132 // asinh 133# if GLM_HAS_CXX11_STL 134 using std::asinh; 135# else 136 template<typename genType> 137 GLM_FUNC_QUALIFIER genType asinh(genType x) 138 { 139 GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'asinh' only accept floating-point input"); 140 141 return (x < static_cast<genType>(0) ? static_cast<genType>(-1) : (x > static_cast<genType>(0) ? static_cast<genType>(1) : static_cast<genType>(0))) * log(std::abs(x) + sqrt(static_cast<genType>(1) + x * x)); 142 } 143# endif 144 145 template<length_t L, typename T, qualifier Q> 146 GLM_FUNC_QUALIFIER vec<L, T, Q> asinh(vec<L, T, Q> const& v) 147 { 148 return detail::functor1<vec, L, T, T, Q>::call(asinh, v); 149 } 150 151 // acosh 152# if GLM_HAS_CXX11_STL 153 using std::acosh; 154# else 155 template<typename genType> 156 GLM_FUNC_QUALIFIER genType acosh(genType x) 157 { 158 GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'acosh' only accept floating-point input"); 159 160 if(x < static_cast<genType>(1)) 161 return static_cast<genType>(0); 162 return log(x + sqrt(x * x - static_cast<genType>(1))); 163 } 164# endif 165 166 template<length_t L, typename T, qualifier Q> 167 GLM_FUNC_QUALIFIER vec<L, T, Q> acosh(vec<L, T, Q> const& v) 168 { 169 return detail::functor1<vec, L, T, T, Q>::call(acosh, v); 170 } 171 172 // atanh 173# if GLM_HAS_CXX11_STL 174 using std::atanh; 175# else 176 template<typename genType> 177 GLM_FUNC_QUALIFIER genType atanh(genType x) 178 { 179 GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'atanh' only accept floating-point input"); 180 181 if(std::abs(x) >= static_cast<genType>(1)) 182 return 0; 183 return static_cast<genType>(0.5) * log((static_cast<genType>(1) + x) / (static_cast<genType>(1) - x)); 184 } 185# endif 186 187 template<length_t L, typename T, qualifier Q> 188 GLM_FUNC_QUALIFIER vec<L, T, Q> atanh(vec<L, T, Q> const& v) 189 { 190 return detail::functor1<vec, L, T, T, Q>::call(atanh, v); 191 } 192}//namespace glm 193 194#if GLM_CONFIG_SIMD == GLM_ENABLE 195# include "func_trigonometric_simd.inl" 196#endif 197 198