diff --git a/src/Magnum/Math/Frustum.h b/src/Magnum/Math/Frustum.h index 45a44ade6..b9729c5dd 100644 --- a/src/Magnum/Math/Frustum.h +++ b/src/Magnum/Math/Frustum.h @@ -72,6 +72,14 @@ template class Frustum { /** @brief Construct a frustum from plane equations */ constexpr /*implicit*/ Frustum(const Vector4& left, const Vector4& right, const Vector4& bottom, const Vector4& top, const Vector4& near, const Vector4& far) noexcept: _data{left, right, bottom, top, near, far} {} + /** + * @brief Construct frustum from another of different type + * + * Performs only default casting on the values, no rounding or + * anything else. + */ + template constexpr explicit Frustum(const Frustum& other) noexcept; + /** @brief Equality comparison */ bool operator==(const Frustum& other) const { for(std::size_t i = 0; i != 6; ++i) @@ -150,6 +158,14 @@ template constexpr Frustum::Frustum(IdentityInitT) noexcept: _data{ { 0.0f, 0.0f, 1.0f, 1.0f}, { 0.0f, 0.0f, -1.0f, 1.0f}} {} +template template constexpr Frustum::Frustum(const Frustum& other) noexcept: _data{ + Vector4{other[0]}, + Vector4{other[1]}, + Vector4{other[2]}, + Vector4{other[3]}, + Vector4{other[4]}, + Vector4{other[5]}} {} + }} #endif diff --git a/src/Magnum/Math/Test/FrustumTest.cpp b/src/Magnum/Math/Test/FrustumTest.cpp index d08b745c3..4e06ded00 100644 --- a/src/Magnum/Math/Test/FrustumTest.cpp +++ b/src/Magnum/Math/Test/FrustumTest.cpp @@ -38,6 +38,7 @@ struct FrustumTest: Corrade::TestSuite::Tester { void construct(); void constructIdentity(); void constructNoInit(); + void constructConversion(); void constructCopy(); void constructFromMatrix(); @@ -51,11 +52,13 @@ struct FrustumTest: Corrade::TestSuite::Tester { typedef Math::Vector4 Vector4; typedef Math::Matrix4 Matrix4; typedef Math::Frustum Frustum; +typedef Math::Frustum Frustumd; FrustumTest::FrustumTest() { addTests({&FrustumTest::construct, &FrustumTest::constructIdentity, &FrustumTest::constructNoInit, + &FrustumTest::constructConversion, &FrustumTest::constructCopy, &FrustumTest::constructFromMatrix, @@ -132,6 +135,31 @@ void FrustumTest::constructNoInit() { CORRADE_VERIFY((std::is_nothrow_constructible::value)); } +void FrustumTest::constructConversion() { + constexpr Frustumd a{ + {-1.0, 2.0, -3.0, 0.1}, + { 1.0, -2.0, 3.0, 0.2}, + {-4.0, 5.0, -6.0, 0.3}, + { 4.0, -5.0, 6.0, 0.4}, + {-7.0, 8.0, -9.0, 0.5}, + { 7.0, 8.0, 9.0, 0.6}}; + Frustum expected{ + {-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}}; + + constexpr Frustum b{a}; + CORRADE_COMPARE(b, expected); + + /* Implicit conversion is not allowed */ + CORRADE_VERIFY(!(std::is_convertible::value)); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); +} + void FrustumTest::constructCopy() { constexpr Frustum a{ {-1.0f, 2.0f, -3.0f, 0.1f},