From 9e796b76c884b4ce1e5fd2c3692fbe2d755daac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 19 Feb 2017 22:52:30 +0100 Subject: [PATCH] Math: added clamp(Vector, Vector, Vector), {min,max}(Vector, T) In order to provide consistent API with GLSL. Pretty annoying omission. --- src/Magnum/Math/Functions.h | 28 ++++++++++++++++++++++++-- src/Magnum/Math/Test/FunctionsTest.cpp | 8 ++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/Functions.h b/src/Magnum/Math/Functions.h index 0be3dbcba..e690baedb 100644 --- a/src/Magnum/Math/Functions.h +++ b/src/Magnum/Math/Functions.h @@ -237,6 +237,14 @@ template inline Vector min(const Vector inline Vector min(const Vector& value, T min) { + Vector out{NoInit}; + for(std::size_t i = 0; i != size; ++i) + out[i] = std::min(value[i], min); + return out; +} + /** @overload */ template inline T min(std::initializer_list list) { T out(*list.begin()); @@ -265,6 +273,14 @@ template Vector max(const Vector& v } #endif +/** @overload */ +template Vector max(const Vector& value, T max) { + Vector out{NoInit}; + for(std::size_t i = 0; i != size; ++i) + out[i] = std::max(value[i], max); + return out; +} + /** @overload */ template inline T max(std::initializer_list list) { T out(*list.begin()); @@ -305,18 +321,26 @@ Math::min(Math::max(value, min), max) @see @ref min(), @ref max() */ #ifdef DOXYGEN_GENERATING_OUTPUT -template inline T clamp(const T& value, U min, U max); +template inline T clamp(const T& value, const T& min, const T& max); #else template inline typename std::enable_if::value, T>::type clamp(T value, T min, T max) { return std::min(std::max(value, min), max); } +template Vector clamp(const Vector& value, const Vector& min, const Vector& max) { + Vector out{NoInit}; + for(std::size_t i = 0; i != size; ++i) + out[i] = clamp(value[i], min[i], max[i]); + return out; +} +#endif + +/** @overload */ template Vector clamp(const Vector& value, T min, T max) { Vector out{NoInit}; for(std::size_t i = 0; i != size; ++i) out[i] = clamp(value[i], min, max); return out; } -#endif /** @brief Sign diff --git a/src/Magnum/Math/Test/FunctionsTest.cpp b/src/Magnum/Math/Test/FunctionsTest.cpp index 77ed5b89f..1188146d0 100644 --- a/src/Magnum/Math/Test/FunctionsTest.cpp +++ b/src/Magnum/Math/Test/FunctionsTest.cpp @@ -132,6 +132,7 @@ void FunctionsTest::pow() { void FunctionsTest::min() { CORRADE_COMPARE(Math::min(5, 9), 5); CORRADE_COMPARE(Math::min(Vector3i(5, -3, 2), Vector3i(9, -5, 18)), Vector3i(5, -5, 2)); + CORRADE_COMPARE(Math::min(Vector3i{5, -3, 2}, 1), (Vector3i{1, -3, 1})); } void FunctionsTest::minList() { @@ -144,6 +145,7 @@ void FunctionsTest::minList() { void FunctionsTest::max() { CORRADE_COMPARE(Math::max(5, 9), 9); CORRADE_COMPARE(Math::max(Vector3i(5, -3, 2), Vector3i(9, -5, 18)), Vector3i(9, -3, 18)); + CORRADE_COMPARE(Math::max(Vector3i{5, -3, 2}, 3), (Vector3i{5, 3, 3})); } void FunctionsTest::maxList() { @@ -170,6 +172,12 @@ void FunctionsTest::clamp() { CORRADE_COMPARE(Math::clamp(-1.6f, -1.0f, 5.0f), -1.0f); CORRADE_COMPARE(Math::clamp(9.5f, -1.0f, 5.0f), 5.0f); + CORRADE_COMPARE(Math::clamp( + Vector3{0.5f, -1.6f, 9.5f}, + Vector3{-1.0f, 2.0f, 0.3f}, + Vector3{0.7f, 3.0f, 5.0f}), + Vector3(0.5f, 2.0f, 5.0f)); + CORRADE_COMPARE(Math::clamp(Vector3(0.5f, -1.6f, 9.5f), -1.0f, 5.0f), Vector3(0.5f, -1.0f, 5.0f)); }