diff --git a/src/Magnum/Math/Frustum.h b/src/Magnum/Math/Frustum.h index f5155c8ae..45a44ade6 100644 --- a/src/Magnum/Math/Frustum.h +++ b/src/Magnum/Math/Frustum.h @@ -101,6 +101,24 @@ template class Frustum { /** @brief Plane at given index */ constexpr Vector4 operator[](std::size_t i) const { return _data[i]; } + /** @brief Left plane */ + constexpr Vector4 left() const { return _data[0]; } + + /** @brief Right plane */ + constexpr Vector4 right() const { return _data[1]; } + + /** @brief Bottom plane */ + constexpr Vector4 bottom() const { return _data[2]; } + + /** @brief Top plane */ + constexpr Vector4 top() const { return _data[3]; } + + /** @brief Near plane */ + constexpr Vector4 near() const { return _data[4]; } + + /** @brief Far plane */ + constexpr Vector4 far() const { return _data[5]; } + private: Vector4 _data[6]; }; diff --git a/src/Magnum/Math/Test/FrustumTest.cpp b/src/Magnum/Math/Test/FrustumTest.cpp index 1d2048915..2165ac860 100644 --- a/src/Magnum/Math/Test/FrustumTest.cpp +++ b/src/Magnum/Math/Test/FrustumTest.cpp @@ -41,6 +41,8 @@ struct FrustumTest: Corrade::TestSuite::Tester { void constructCopy(); void constructFromMatrix(); + void data(); + void compare(); void debug(); @@ -57,21 +59,23 @@ FrustumTest::FrustumTest() { &FrustumTest::constructCopy, &FrustumTest::constructFromMatrix, + &FrustumTest::data, + &FrustumTest::compare, &FrustumTest::debug}); } void FrustumTest::construct() { - Vector4 planes[6]{ - {-1.0f, 0.0f, 0.0f, 1.0f}, - { 1.0f, 0.0f, 0.0f, 1.0f}, - { 0.0f, -1.0f, 0.0f, 1.0f}, - { 0.0f, 1.0f, 0.0f, 1.0f}, - { 0.0f, 0.0f, -1.0f, 1.0f}, - { 0.0f, 0.0f, 1.0f, 1.0f}}; + constexpr Vector4 planes[6]{ + {-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 frustum{ + constexpr Frustum frustum{ planes[0], planes[1], planes[2], planes[3], planes[4], planes[5]}; @@ -164,6 +168,23 @@ void FrustumTest::constructFromMatrix() { CORRADE_COMPARE(Frustum::fromMatrix({}), Frustum{}); } +void FrustumTest::data() { + /* Using default-constructed to verify that the planes are in correct order */ + constexpr Frustum a; + + constexpr Vector4 right = a.planes()[1]; + CORRADE_COMPARE(right, (Vector4{-1.0f, 0.0f, 0.0f, 1.0f})); + + constexpr Vector4 bottom = a[2]; + CORRADE_COMPARE(bottom, (Vector4{0.0f, 1.0f, 0.0f, 1.0f})); + + constexpr Vector4 near = a.near(); + CORRADE_COMPARE(near, (Vector4{0.0f, 0.0f, 1.0f, 1.0f})); + + constexpr Float b = *a.data(); + CORRADE_COMPARE(b, 1.0f); +} + void FrustumTest::compare() { Frustum a{ {-1.0f, 2.0f, -3.0f, 0.1f},