diff --git a/src/Magnum/Math/Bezier.h b/src/Magnum/Math/Bezier.h index 4734e71a7..106de6efd 100644 --- a/src/Magnum/Math/Bezier.h +++ b/src/Magnum/Math/Bezier.h @@ -198,6 +198,30 @@ and @ref Bezier for more information. template using CubicBezier3D = CubicBezier<3, T>; #endif +/** @debugoperator{Magnum::Math::Bezier} */ +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug& debug, const Bezier& value) { + debug << "Bezier(" << Corrade::Utility::Debug::nospace; + for(UnsignedInt o = 0; o != order + 1; ++o) { + debug << (o ? ", {" : "{") << Corrade::Utility::Debug::nospace << value[o][0] << Corrade::Utility::Debug::nospace; + for(UnsignedInt i = 1; i != dimensions; ++i) + debug << "," << value[o][i] << Corrade::Utility::Debug::nospace; + debug << "}" << Corrade::Utility::Debug::nospace; + } + return debug << ")"; +} + +/* Explicit instantiation for types used in OpenGL */ +#ifndef DOXYGEN_GENERATING_OUTPUT +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 2, Float>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 3, Float>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 2, Float>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 3, Float>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 2, Double>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 3, Double>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 2, Double>&); +extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 3, Double>&); +#endif + }} #endif diff --git a/src/Magnum/Math/Test/BezierTest.cpp b/src/Magnum/Math/Test/BezierTest.cpp index 456f81d77..bd15fcd67 100644 --- a/src/Magnum/Math/Test/BezierTest.cpp +++ b/src/Magnum/Math/Test/BezierTest.cpp @@ -24,6 +24,7 @@ DEALINGS IN THE SOFTWARE. */ +#include #include #include "Magnum/Math/Bezier.h" @@ -43,13 +44,17 @@ struct BezierTest : Corrade::TestSuite::Tester { void lerpQuadratic(); void lerpCubic(); + + void debug(); }; BezierTest::BezierTest() { addTests({&BezierTest::implicitConstructor, &BezierTest::lerpQuadratic, - &BezierTest::lerpCubic}); + &BezierTest::lerpCubic, + + &BezierTest::debug}); } void BezierTest::implicitConstructor() { @@ -80,6 +85,12 @@ void BezierTest::lerpCubic() { } } +void BezierTest::debug() { + std::ostringstream out; + Debug(&out) << CubicBezier2D{Vector2{0.0f, 1.0f}, Vector2{1.5f, -0.3f}, Vector2{2.1f, 0.5f}, Vector2{0.0f, 2.0f}}; + CORRADE_COMPARE(out.str(), "Bezier({0, 1}, {1.5, -0.3}, {2.1, 0.5}, {0, 2})\n"); +} + }}} CORRADE_TEST_MAIN(Magnum::Math::Test::BezierTest) diff --git a/src/Magnum/Math/instantiation.cpp b/src/Magnum/Math/instantiation.cpp index 22a02e425..1a56c4e79 100644 --- a/src/Magnum/Math/instantiation.cpp +++ b/src/Magnum/Math/instantiation.cpp @@ -23,6 +23,7 @@ DEALINGS IN THE SOFTWARE. */ +#include "Magnum/Math/Bezier.h" #include "Magnum/Math/DualComplex.h" #include "Magnum/Math/DualQuaternion.h" #include "Magnum/Math/Range.h" @@ -76,6 +77,15 @@ template struct ConfigurationValue>; namespace Magnum { namespace Math { #ifndef DOXYGEN_GENERATING_OUTPUT +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 2, Float>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 3, Float>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 2, Float>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 3, Float>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 2, Double>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<2, 3, Double>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 2, Double>&); +template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Bezier<3, 3, Double>&); + template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Complex&); template Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Complex&);