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
/** @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 */
template<class T> inline T min(std::initializer_list<T> list) {
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
/** @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 */
template<class T> inline T max(std::initializer_list<T> 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<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
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);
}
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) {
Vector<size, T> out{NoInit};
for(std::size_t i = 0; i != size; ++i)
out[i] = clamp(value[i], min, max);
return out;
}
#endif
/**
@brief Sign

8
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));
}

Loading…
Cancel
Save