diff --git a/src/Magnum/Math/Frustum.h b/src/Magnum/Math/Frustum.h index cfcc5bad4..1ebe2cc2e 100644 --- a/src/Magnum/Math/Frustum.h +++ b/src/Magnum/Math/Frustum.h @@ -81,6 +81,25 @@ template class Frustum { Vector4 _data[6]; }; +/** @debugoperator{Magnum::Math::Frustum} */ +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug& debug, const Frustum& value) { + debug << "Frustum({" << Corrade::Utility::Debug::nospace; + for(std::size_t i = 0; i != 6; ++i) { + if(i != 0) debug << Corrade::Utility::Debug::nospace << "},\n {" << Corrade::Utility::Debug::nospace; + for(std::size_t j = 0; j != 4; ++j) { + if(j != 0) debug << Corrade::Utility::Debug::nospace << ","; + debug << value[i][j]; + } + } + return debug << Corrade::Utility::Debug::nospace << "})"; +} + +/* Explicit instantiation for commonly used types */ +#ifndef DOXYGEN_GENERATING_OUTPUT +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Frustum&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Frustum&); +#endif + }} #endif diff --git a/src/Magnum/Math/Test/FrustumTest.cpp b/src/Magnum/Math/Test/FrustumTest.cpp index 417cee211..018a6afb6 100644 --- a/src/Magnum/Math/Test/FrustumTest.cpp +++ b/src/Magnum/Math/Test/FrustumTest.cpp @@ -24,6 +24,7 @@ DEALINGS IN THE SOFTWARE. */ +#include #include #include @@ -36,6 +37,8 @@ struct FrustumTest: Corrade::TestSuite::Tester { void construct(); void constructFromMatrix(); + + void debug(); }; typedef Math::Vector4 Vector4; @@ -44,7 +47,9 @@ typedef Math::Frustum Frustum; FrustumTest::FrustumTest() { addTests({&FrustumTest::construct, - &FrustumTest::constructFromMatrix}); + &FrustumTest::constructFromMatrix, + + &FrustumTest::debug}); } void FrustumTest::construct() { @@ -83,6 +88,25 @@ void FrustumTest::constructFromMatrix() { TestSuite::Compare::Container); } +void FrustumTest::debug() { + Frustum frustum{ + {-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}}; + + std::ostringstream out; + Debug{&out} << frustum; + CORRADE_COMPARE(out.str(), "Frustum({-1, 2, -3, 0.1},\n" + " {1, -2, 3, 0.2},\n" + " {-4, 5, -6, 0.3},\n" + " {4, -5, 6, 0.4},\n" + " {-7, 8, -9, 0.5},\n" + " {7, -8, 9, 0.6})\n"); +} + }}} CORRADE_TEST_MAIN(Magnum::Math::Test::FrustumTest) diff --git a/src/Magnum/Math/instantiation.cpp b/src/Magnum/Math/instantiation.cpp index 2516b8bcb..3dced1269 100644 --- a/src/Magnum/Math/instantiation.cpp +++ b/src/Magnum/Math/instantiation.cpp @@ -26,6 +26,7 @@ #include "Magnum/Math/Bezier.h" #include "Magnum/Math/DualComplex.h" #include "Magnum/Math/DualQuaternion.h" +#include "Magnum/Math/Frustum.h" #include "Magnum/Math/Range.h" namespace Corrade { namespace Utility { @@ -179,6 +180,9 @@ template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vec template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<3, Double>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Vector<4, Double>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Frustum&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Frustum&); + template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Range<1, Float>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Range<2, Float>&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Range<3, Float>&);