From 1b3e14ea9a6a530cc8a9b44d1363f07c94a07bd3 Mon Sep 17 00:00:00 2001 From: Squareys Date: Wed, 26 Feb 2020 19:15:03 +0100 Subject: [PATCH] Math: Non-const overloads for Frustum::(left|right|top|bottom|near|far|[]) Signed-off-by: Squareys --- src/Magnum/Math/Frustum.h | 55 ++++++++++++++++++++++------ src/Magnum/Math/Test/FrustumTest.cpp | 50 ++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 18 deletions(-) diff --git a/src/Magnum/Math/Frustum.h b/src/Magnum/Math/Frustum.h index a21990ecb..0f76104d7 100644 --- a/src/Magnum/Math/Frustum.h +++ b/src/Magnum/Math/Frustum.h @@ -146,10 +146,17 @@ template class Frustum { /** * @brief Plane at given index + * @m_since_latest * * Expects that @p i is less than @cpp 6 @ce. */ + Vector4& operator[](std::size_t i) { + CORRADE_ASSERT(i < 6, "Math::Frustum::operator[](): index" << i << "out of range", + _data[i]); + return _data[i]; + } /* returns const& so [][] operations are also constexpr */ + /** @overload */ constexpr const Vector4& operator[](std::size_t i) const { return CORRADE_CONSTEXPR_ASSERT(i < 6, "Math::Frustum::operator[](): index" << i << "out of range"), _data[i]; } @@ -196,23 +203,47 @@ template class Frustum { */ constexpr const Vector4* cend() const { return _data + 6; } - /** @brief Left plane */ - constexpr Vector4 left() const { return _data[0]; } + /** + * @brief Left plane + * @m_since_latest + */ + Vector4& left() { return _data[0]; } + constexpr Vector4 left() const { return _data[0]; } /**< @overload */ - /** @brief Right plane */ - constexpr Vector4 right() const { return _data[1]; } + /** + * @brief Right plane + * @m_since_latest + */ + Vector4& right() { return _data[1]; } + constexpr Vector4 right() const { return _data[1]; } /**< @overload */ - /** @brief Bottom plane */ - constexpr Vector4 bottom() const { return _data[2]; } + /** + * @brief Bottom plane + * @m_since_latest + */ + Vector4& bottom() { return _data[2]; } + constexpr Vector4 bottom() const { return _data[2]; } /**< @overload */ - /** @brief Top plane */ - constexpr Vector4 top() const { return _data[3]; } + /** + * @brief Top plane + * @m_since_latest + */ + Vector4& top() { return _data[3]; } + constexpr Vector4 top() const { return _data[3]; } /**< @overload */ - /** @brief Near plane */ - constexpr Vector4 near() const { return _data[4]; } + /** + * @brief Near plane + * @m_since_latest + */ + Vector4& near() { return _data[4]; } + constexpr Vector4 near() const { return _data[4]; } /**< @overload */ - /** @brief Far plane */ - constexpr Vector4 far() const { return _data[5]; } + /** + * @brief Far plane + * @m_since_latest + */ + Vector4& far() { return _data[5]; } + constexpr Vector4 far() const { return _data[5]; } /**< @overload */ private: Vector4 _data[6]; diff --git a/src/Magnum/Math/Test/FrustumTest.cpp b/src/Magnum/Math/Test/FrustumTest.cpp index f0b7f3f88..43c3d0bd7 100644 --- a/src/Magnum/Math/Test/FrustumTest.cpp +++ b/src/Magnum/Math/Test/FrustumTest.cpp @@ -124,14 +124,52 @@ void FrustumTest::construct() { planes[2], planes[3], planes[4], planes[5]}; - CORRADE_COMPARE(frustum[0], planes[0]); - CORRADE_COMPARE(frustum[1], planes[1]); - CORRADE_COMPARE(frustum[2], planes[2]); - CORRADE_COMPARE(frustum[3], planes[3]); - CORRADE_COMPARE(frustum[4], planes[4]); - CORRADE_COMPARE(frustum[5], planes[5]); + constexpr Vector4 c0 = frustum[0]; + constexpr Vector4 c1 = frustum[1]; + constexpr Vector4 c2 = frustum[2]; + constexpr Vector4 c3 = frustum[3]; + constexpr Vector4 c4 = frustum[4]; + constexpr Vector4 c5 = frustum[5]; + CORRADE_COMPARE(c0, planes[0]); + CORRADE_COMPARE(c1, planes[1]); + CORRADE_COMPARE(c2, planes[2]); + CORRADE_COMPARE(c3, planes[3]); + CORRADE_COMPARE(c4, planes[4]); + CORRADE_COMPARE(c5, planes[5]); + + constexpr Vector4 cleft = frustum.left(); + constexpr Vector4 cright = frustum.right(); + constexpr Vector4 cbottom = frustum.bottom(); + constexpr Vector4 ctop = frustum.top(); + constexpr Vector4 cnear = frustum.near(); + constexpr Vector4 cfar = frustum.far(); + CORRADE_COMPARE(cleft, planes[0]); + CORRADE_COMPARE(cright, planes[1]); + CORRADE_COMPARE(cbottom, planes[2]); + CORRADE_COMPARE(ctop, planes[3]); + CORRADE_COMPARE(cnear, planes[4]); + CORRADE_COMPARE(cfar, planes[5]); CORRADE_VERIFY((std::is_nothrow_constructible::value)); + + Frustum a{ + planes[0], planes[1], + planes[2], planes[3], + planes[4], planes[5]}; + + CORRADE_COMPARE(a[0], planes[0]); + CORRADE_COMPARE(a[1], planes[1]); + CORRADE_COMPARE(a[2], planes[2]); + CORRADE_COMPARE(a[3], planes[3]); + CORRADE_COMPARE(a[4], planes[4]); + CORRADE_COMPARE(a[5], planes[5]); + + CORRADE_COMPARE(a.left(), planes[0]); + CORRADE_COMPARE(a.right(), planes[1]); + CORRADE_COMPARE(a.bottom(), planes[2]); + CORRADE_COMPARE(a.top(), planes[3]); + CORRADE_COMPARE(a.near(), planes[4]); + CORRADE_COMPARE(a.far(), planes[5]); } void FrustumTest::constructIdentity() {