diff --git a/src/Magnum/Math/Frustum.h b/src/Magnum/Math/Frustum.h index 1ebe2cc2e..aa63a21cd 100644 --- a/src/Magnum/Math/Frustum.h +++ b/src/Magnum/Math/Frustum.h @@ -61,6 +61,19 @@ template class Frustum { /** @brief Constructor */ constexpr /*implicit*/ Frustum(const Vector4& left, const Vector4& right, const Vector4& bottom, const Vector4& top, const Vector4& near, const Vector4& far): _data{left, right, bottom, top, near, far} {} + /** @brief Equality comparison */ + bool operator==(const Frustum& other) const { + for(std::size_t i = 0; i != 6; ++i) + if(_data[i] != other._data[i]) return false; + + return true; + } + + /** @brief Non-equality comparison */ + bool operator!=(const Frustum& other) const { + return !operator==(other); + } + /** * @brief Raw data * @return One-dimensional array of length `24`. diff --git a/src/Magnum/Math/Test/FrustumTest.cpp b/src/Magnum/Math/Test/FrustumTest.cpp index 018a6afb6..d7a978e63 100644 --- a/src/Magnum/Math/Test/FrustumTest.cpp +++ b/src/Magnum/Math/Test/FrustumTest.cpp @@ -38,6 +38,8 @@ struct FrustumTest: Corrade::TestSuite::Tester { void construct(); void constructFromMatrix(); + void compare(); + void debug(); }; @@ -49,6 +51,8 @@ FrustumTest::FrustumTest() { addTests({&FrustumTest::construct, &FrustumTest::constructFromMatrix, + &FrustumTest::compare, + &FrustumTest::debug}); } @@ -84,8 +88,37 @@ void FrustumTest::constructFromMatrix() { const Frustum frustum = Frustum::fromMatrix( Matrix4::perspectiveProjection(90.0_degf, 1.0f, 1.0f, 10.0f)); - CORRADE_COMPARE_AS(frustum.planes(), expected.planes(), - TestSuite::Compare::Container); + CORRADE_COMPARE(frustum, expected); +} + +void FrustumTest::compare() { + Frustum a{ + {-1.0f, 2.0f, -3.0f, 0.1f}, + { 1.0f, -2.0f, 3.0f, 0.2f}, + {-4.0f, 5.0f, -6.0f, 0.3f}, + { 4.0f, -5.0f, 6.0f, 0.4f}, + {-7.0f, 8.0f, -9.0f, 0.5f}, + { 7.0f, 8.0f, 9.0f, 0.6f}}; + + Frustum b{ + {-1.0f, 2.0f, -3.0f, 0.1f}, + { 1.0f, -2.0f, 3.0f, 0.2f}, + {-4.0f, 5.0f, -6.0f, 0.3f + Math::TypeTraits::epsilon()/2.0f}, + { 4.0f, -5.0f, 6.0f, 0.4f}, + {-7.0f, 8.0f, -9.0f, 0.5f}, + { 7.0f, 8.0f, 9.0f, 0.6f}}; + + Frustum c{ + {-1.0f, 2.0f, -3.0f, 0.1f}, + { 1.0f, -2.0f, 3.0f, 0.2f}, + {-4.0f, 5.0f, -6.0f, 0.3f}, + { 4.0f, -5.0f, 6.0f, 0.4f}, + {-7.0f, 8.0f, -9.0f, 0.5f + Math::TypeTraits::epsilon()*2.0f}, + { 7.0f, 8.0f, 9.0f, 0.6f}}; + + CORRADE_VERIFY(a == a); + CORRADE_VERIFY(a == b); + CORRADE_VERIFY(a != c); } void FrustumTest::debug() {