diff --git a/headers/vmath.hpp/vmath_fun.hpp b/headers/vmath.hpp/vmath_fun.hpp index 3ea4c4a..3018e8c 100644 --- a/headers/vmath.hpp/vmath_fun.hpp +++ b/headers/vmath.hpp/vmath_fun.hpp @@ -95,6 +95,11 @@ namespace vmath_hpp return min(max(x, min_x), max_x); } + template < typename T > + constexpr T saturate(T x) noexcept { + return clamp(x, T(0), T(1)); + } + template < typename T > constexpr T mix(T x, T y, T a) noexcept { return x * (T(1) - a) + y * a; diff --git a/headers/vmath.hpp/vmath_vec_fun.hpp b/headers/vmath.hpp/vmath_vec_fun.hpp index e5a17ac..0dbd7ae 100644 --- a/headers/vmath.hpp/vmath_vec_fun.hpp +++ b/headers/vmath.hpp/vmath_vec_fun.hpp @@ -456,6 +456,11 @@ namespace vmath_hpp return zip([](T x, T min_x, T max_x) { return clamp(x, min_x, max_x); }, xs, min_xs, max_xs); } + template < typename T, std::size_t Size > + constexpr vec saturate(const vec& xs) { + return map([](T x) { return saturate(x); }, xs); + } + template < typename T, std::size_t Size > constexpr vec mix(const vec& xs, const vec& ys, T a) { return zip([a](T x, T y) { return mix(x, y, a); }, xs, ys); diff --git a/untests/vmath_fun_tests.cpp b/untests/vmath_fun_tests.cpp index 11da4ac..a935a00 100644 --- a/untests/vmath_fun_tests.cpp +++ b/untests/vmath_fun_tests.cpp @@ -86,6 +86,10 @@ TEST_CASE("vmath/fun") { STATIC_REQUIRE(clamp(2.5f, 2.f, 3.f) == approx(2.5f)); STATIC_REQUIRE(clamp(3.5f, 2.f, 3.f) == approx(3.0f)); + STATIC_REQUIRE(saturate(-0.5f) == approx(0.f)); + STATIC_REQUIRE(saturate(0.5f) == approx(0.5f)); + STATIC_REQUIRE(saturate(1.5f) == approx(1.f)); + STATIC_REQUIRE(mix(0.f, 10.f, 0.5f) == approx(5.f)); STATIC_REQUIRE(mix(0.f, 10.f, false) == approx(0.f)); STATIC_REQUIRE(mix(0.f, 10.f, true) == approx(10.f)); diff --git a/untests/vmath_vec_fun_tests.cpp b/untests/vmath_vec_fun_tests.cpp index 612d01b..d84e6b9 100644 --- a/untests/vmath_vec_fun_tests.cpp +++ b/untests/vmath_vec_fun_tests.cpp @@ -126,6 +126,8 @@ TEST_CASE("vmath/vec_fun") { STATIC_REQUIRE(clamp(vec2i(1,2), 0, 1) == vec2i(1,1)); STATIC_REQUIRE(clamp(vec2i(1,2), vec2i(0), vec2i(1)) == vec2i(1,1)); + STATIC_REQUIRE(saturate(vec3f(-1.f,0.5,1.5f)) == approx3(0.f,0.5f,1.f)); + STATIC_REQUIRE(mix(vec2f(0.f), vec2f(10.f), 0.5f) == approx2(5.f)); STATIC_REQUIRE(mix(vec2f(0.f), vec2f(10.f), vec2f(0.5f)) == approx2(5.f));