|
|
|
@ -158,21 +158,65 @@ namespace detail |
|
|
|
|
|
|
|
|
|
VECTORIZE_VEC(log2) |
|
|
|
|
|
|
|
|
|
namespace detail |
|
|
|
|
{ |
|
|
|
|
template <template <class, precision> class vecType, typename T, precision P> |
|
|
|
|
struct compute_sqrt{}; |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
struct compute_sqrt<detail::tvec1, T, P> |
|
|
|
|
{ |
|
|
|
|
static detail::tvec1<T, P> call(detail::tvec1<T, P> const & x) |
|
|
|
|
{ |
|
|
|
|
return detail::tvec1<T, P>(std::sqrt(x.x)); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
struct compute_sqrt<detail::tvec2, T, P> |
|
|
|
|
{ |
|
|
|
|
static detail::tvec2<T, P> call(detail::tvec2<T, P> const & x) |
|
|
|
|
{ |
|
|
|
|
return detail::tvec2<T, P>(std::sqrt(x.x), std::sqrt(x.y)); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
struct compute_sqrt<detail::tvec3, T, P> |
|
|
|
|
{ |
|
|
|
|
static detail::tvec3<T, P> call(detail::tvec3<T, P> const & x) |
|
|
|
|
{ |
|
|
|
|
return detail::tvec3<T, P>(std::sqrt(x.x), std::sqrt(x.y), std::sqrt(x.z)); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
struct compute_sqrt<detail::tvec4, T, P> |
|
|
|
|
{ |
|
|
|
|
static detail::tvec4<T, P> call(detail::tvec4<T, P> const & x) |
|
|
|
|
{ |
|
|
|
|
return detail::tvec4<T, P>(std::sqrt(x.x), std::sqrt(x.y), std::sqrt(x.z), std::sqrt(x.w)); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
}//namespace detail |
|
|
|
|
|
|
|
|
|
// sqrt |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType sqrt |
|
|
|
|
( |
|
|
|
|
genType const & x |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER float sqrt(float x) |
|
|
|
|
{ |
|
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'sqrt' only accept floating-point inputs"); |
|
|
|
|
|
|
|
|
|
assert(x >= genType(0)); |
|
|
|
|
|
|
|
|
|
return std::sqrt(x); |
|
|
|
|
return detail::compute_sqrt<detail::tvec1, float, highp>::call(x).x; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
VECTORIZE_VEC(sqrt) |
|
|
|
|
GLM_FUNC_QUALIFIER double sqrt(double x) |
|
|
|
|
{ |
|
|
|
|
return detail::compute_sqrt<detail::tvec1, double, highp>::call(x).x; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P, template <typename, precision> class vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER vecType<T, P> sqrt(vecType<T, P> const & x) |
|
|
|
|
{ |
|
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'sqrt' only accept floating-point inputs"); |
|
|
|
|
return detail::compute_sqrt<vecType, T, P>::call(x); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// inversesqrt |
|
|
|
|
GLM_FUNC_QUALIFIER float inversesqrt(float const & x) |
|
|
|
|