diff options
Diffstat (limited to 'engine-ocean/External/glm-master/glm/ext/vector_relational.inl')
-rw-r--r-- | engine-ocean/External/glm-master/glm/ext/vector_relational.inl | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/engine-ocean/External/glm-master/glm/ext/vector_relational.inl b/engine-ocean/External/glm-master/glm/ext/vector_relational.inl new file mode 100644 index 0000000..7a39ab5 --- /dev/null +++ b/engine-ocean/External/glm-master/glm/ext/vector_relational.inl @@ -0,0 +1,75 @@ +#include "../vector_relational.hpp" +#include "../common.hpp" +#include "../detail/qualifier.hpp" +#include "../detail/type_float.hpp" + +namespace glm +{ + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T Epsilon) + { + return equal(x, y, vec<L, T, Q>(Epsilon)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& Epsilon) + { + return lessThanEqual(abs(x - y), Epsilon); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, T Epsilon) + { + return notEqual(x, y, vec<L, T, Q>(Epsilon)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, T, Q> const& Epsilon) + { + return greaterThan(abs(x - y), Epsilon); + } + + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, int MaxULPs) + { + return equal(x, y, vec<L, int, Q>(MaxULPs)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, int, Q> const& MaxULPs) + { + vec<L, bool, Q> Result(false); + for(length_t i = 0; i < L; ++i) + { + detail::float_t<T> const a(x[i]); + detail::float_t<T> const b(y[i]); + + // Different signs means they do not match. + if(a.negative() != b.negative()) + { + // Check for equality to make sure +0==-0 + Result[i] = a.mantissa() == b.mantissa() && a.exponent() == b.exponent(); + } + else + { + // Find the difference in ULPs. + typename detail::float_t<T>::int_type const DiffULPs = abs(a.i - b.i); + Result[i] = DiffULPs <= MaxULPs[i]; + } + } + return Result; + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, int MaxULPs) + { + return notEqual(x, y, vec<L, int, Q>(MaxULPs)); + } + + template<length_t L, typename T, qualifier Q> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y, vec<L, int, Q> const& MaxULPs) + { + return not_(equal(x, y, MaxULPs)); + } +}//namespace glm |