Browse Source

Math: added clamp(Vector, Vector, Vector), {min,max}(Vector, T)

In order to provide consistent API with GLSL. Pretty annoying omission.
pull/193/head
Vladimír Vondruš 9 years ago
parent
commit
9e796b76c8
  1. 28
      src/Magnum/Math/Functions.h
  2. 8
      src/Magnum/Math/Test/FunctionsTest.cpp

28
src/Magnum/Math/Functions.h

@ -237,6 +237,14 @@ template<std::size_t size, class T> inline Vector<size, T> min(const Vector<size
} }
#endif #endif
/** @overload */
template<std::size_t size, class T> inline Vector<size, T> min(const Vector<size, T>& value, T min) {
Vector<size, T> out{NoInit};
for(std::size_t i = 0; i != size; ++i)
out[i] = std::min(value[i], min);
return out;
}
/** @overload */ /** @overload */
template<class T> inline T min(std::initializer_list<T> list) { template<class T> inline T min(std::initializer_list<T> list) {
T out(*list.begin()); T out(*list.begin());
@ -265,6 +273,14 @@ template<std::size_t size, class T> Vector<size, T> max(const Vector<size, T>& v
} }
#endif #endif
/** @overload */
template<std::size_t size, class T> Vector<size, T> max(const Vector<size, T>& value, T max) {
Vector<size, T> out{NoInit};
for(std::size_t i = 0; i != size; ++i)
out[i] = std::max(value[i], max);
return out;
}
/** @overload */ /** @overload */
template<class T> inline T max(std::initializer_list<T> list) { template<class T> inline T max(std::initializer_list<T> list) {
T out(*list.begin()); T out(*list.begin());
@ -305,18 +321,26 @@ Math::min(Math::max(value, min), max)
@see @ref min(), @ref max() @see @ref min(), @ref max()
*/ */
#ifdef DOXYGEN_GENERATING_OUTPUT #ifdef DOXYGEN_GENERATING_OUTPUT
template<class T, class U> inline T clamp(const T& value, U min, U max); template<class T, class U> inline T clamp(const T& value, const T& min, const T& max);
#else #else
template<class T> inline typename std::enable_if<std::is_arithmetic<T>::value, T>::type clamp(T value, T min, T max) { template<class T> inline typename std::enable_if<std::is_arithmetic<T>::value, T>::type clamp(T value, T min, T max) {
return std::min(std::max(value, min), max); return std::min(std::max(value, min), max);
} }
template<std::size_t size, class T> Vector<size, T> clamp(const Vector<size, T>& value, const Vector<size, T>& min, const Vector<size, T>& max) {
Vector<size, T> 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<std::size_t size, class T> Vector<size, T> clamp(const Vector<size, T>& value, T min, T max) { template<std::size_t size, class T> Vector<size, T> clamp(const Vector<size, T>& value, T min, T max) {
Vector<size, T> out{NoInit}; Vector<size, T> out{NoInit};
for(std::size_t i = 0; i != size; ++i) for(std::size_t i = 0; i != size; ++i)
out[i] = clamp(value[i], min, max); out[i] = clamp(value[i], min, max);
return out; return out;
} }
#endif
/** /**
@brief Sign @brief Sign

8
src/Magnum/Math/Test/FunctionsTest.cpp

@ -132,6 +132,7 @@ void FunctionsTest::pow() {
void FunctionsTest::min() { void FunctionsTest::min() {
CORRADE_COMPARE(Math::min(5, 9), 5); 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), Vector3i(9, -5, 18)), Vector3i(5, -5, 2));
CORRADE_COMPARE(Math::min(Vector3i{5, -3, 2}, 1), (Vector3i{1, -3, 1}));
} }
void FunctionsTest::minList() { void FunctionsTest::minList() {
@ -144,6 +145,7 @@ void FunctionsTest::minList() {
void FunctionsTest::max() { void FunctionsTest::max() {
CORRADE_COMPARE(Math::max(5, 9), 9); 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), Vector3i(9, -5, 18)), Vector3i(9, -3, 18));
CORRADE_COMPARE(Math::max(Vector3i{5, -3, 2}, 3), (Vector3i{5, 3, 3}));
} }
void FunctionsTest::maxList() { 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(-1.6f, -1.0f, 5.0f), -1.0f);
CORRADE_COMPARE(Math::clamp(9.5f, -1.0f, 5.0f), 5.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)); CORRADE_COMPARE(Math::clamp(Vector3(0.5f, -1.6f, 9.5f), -1.0f, 5.0f), Vector3(0.5f, -1.0f, 5.0f));
} }

Loading…
Cancel
Save