diff --git a/src/DebugTools/CMakeLists.txt b/src/DebugTools/CMakeLists.txt index a80d6e435..bbad443ce 100644 --- a/src/DebugTools/CMakeLists.txt +++ b/src/DebugTools/CMakeLists.txt @@ -33,6 +33,7 @@ set(MagnumDebugTools_SRCS Implementation/AbstractShapeRenderer.cpp Implementation/AxisAlignedBoxRenderer.cpp Implementation/BoxRenderer.cpp + Implementation/LineSegmentRenderer.cpp Implementation/PointRenderer.cpp Implementation/SphereRenderer.cpp) diff --git a/src/DebugTools/Implementation/LineSegmentRenderer.cpp b/src/DebugTools/Implementation/LineSegmentRenderer.cpp new file mode 100644 index 000000000..c9a0240c8 --- /dev/null +++ b/src/DebugTools/Implementation/LineSegmentRenderer.cpp @@ -0,0 +1,68 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "LineSegmentRenderer.h" + +#include "Mesh.h" +#include "DebugTools/ShapeRenderer.h" +#include "Physics/Line.h" +#include "Primitives/Line.h" +#include "Shaders/FlatShader.h" +#include "Trade/MeshData2D.h" +#include "Trade/MeshData3D.h" + +#include "DebugTools/Implementation/LineSegmentRendererTransformation.h" + +namespace Magnum { namespace DebugTools { namespace Implementation { + +namespace { + template ResourceKey meshKey(); + template<> inline ResourceKey meshKey<2>() { return ResourceKey("line2d"); } + template<> inline ResourceKey meshKey<3>() { return ResourceKey("line3d"); } + + template ResourceKey vertexBufferKey(); + template<> inline ResourceKey vertexBufferKey<2>() { return ResourceKey("line2d-vertices"); } + template<> inline ResourceKey vertexBufferKey<3>() { return ResourceKey("line3d-vertices"); } + + template typename MeshData::Type meshData(); + template<> inline Trade::MeshData2D meshData<2>() { return Primitives::Line2D::wireframe(); } + template<> inline Trade::MeshData3D meshData<3>() { return Primitives::Line3D::wireframe(); } +} + +template LineSegmentRenderer::LineSegmentRenderer(Physics::Line& line): AbstractShapeRenderer(meshKey(), vertexBufferKey(), {}), line(line) { + if(!this->mesh) this->createResources(meshData()); +} + +template void LineSegmentRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { + this->shader->setTransformationProjectionMatrix(projectionMatrix* + Implementation::lineSegmentRendererTransformation(line.transformedA(), line.transformedB())) + ->setColor(options->color()) + ->use(); + this->mesh->draw(); +} + +template class LineSegmentRenderer<2>; +template class LineSegmentRenderer<3>; + +}}} diff --git a/src/DebugTools/Implementation/LineSegmentRenderer.h b/src/DebugTools/Implementation/LineSegmentRenderer.h new file mode 100644 index 000000000..a67208825 --- /dev/null +++ b/src/DebugTools/Implementation/LineSegmentRenderer.h @@ -0,0 +1,47 @@ +#ifndef Magnum_DebugTools_Implementation_LineSegmentRenderer_h +#define Magnum_DebugTools_Implementation_LineSegmentRenderer_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "AbstractShapeRenderer.h" + +#include "Physics/Physics.h" + +#include "corradeCompatibility.h" + +namespace Magnum { namespace DebugTools { namespace Implementation { + +template class LineSegmentRenderer: public AbstractShapeRenderer { + public: + LineSegmentRenderer(Physics::Line& line); + + void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; + + private: + Physics::Line& line; +}; + +}}} + +#endif diff --git a/src/DebugTools/Implementation/LineSegmentRendererTransformation.h b/src/DebugTools/Implementation/LineSegmentRendererTransformation.h new file mode 100644 index 000000000..fc94a1bfe --- /dev/null +++ b/src/DebugTools/Implementation/LineSegmentRendererTransformation.h @@ -0,0 +1,39 @@ +#ifndef Magnum_DebugTools_Implementation_LineSegmentRendererTransformation_h +#define Magnum_DebugTools_Implementation_LineSegmentRendererTransformation_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "DimensionTraits.h" + +namespace Magnum { namespace DebugTools { namespace Implementation { + +template typename DimensionTraits::MatrixType lineSegmentRendererTransformation(const typename DimensionTraits::VectorType& a, const typename DimensionTraits::VectorType& b) { + auto transformation = DimensionTraits::MatrixType::translation(a); + transformation.right() = b - a; + return transformation; +} + +}}} + +#endif diff --git a/src/DebugTools/ShapeRenderer.cpp b/src/DebugTools/ShapeRenderer.cpp index 38fbd46ce..060bfffcc 100644 --- a/src/DebugTools/ShapeRenderer.cpp +++ b/src/DebugTools/ShapeRenderer.cpp @@ -29,6 +29,7 @@ #include "Physics/AxisAlignedBox.h" #include "Physics/Box.h" #include "Physics/ObjectShape.h" +#include "Physics/LineSegment.h" #include "Physics/Point.h" #include "Physics/ShapeGroup.h" #include "Physics/Sphere.h" @@ -36,6 +37,7 @@ #include "Implementation/AxisAlignedBoxRenderer.h" #include "Implementation/BoxRenderer.h" +#include "Implementation/LineSegmentRenderer.h" #include "Implementation/PointRenderer.h" #include "Implementation/SphereRenderer.h" @@ -52,6 +54,9 @@ template<> void createDebugMesh(ShapeRenderer<2>* renderer, Physics::AbstractSha case Physics::AbstractShape2D::Type::Box: renderer->renderers.push_back(new Implementation::BoxRenderer<2>(*static_cast(shape))); break; + case Physics::AbstractShape2D::Type::LineSegment: + renderer->renderers.push_back(new Implementation::LineSegmentRenderer<2>(*static_cast(shape))); + break; case Physics::AbstractShape2D::Type::Point: renderer->renderers.push_back(new Implementation::PointRenderer<2>(*static_cast(shape))); break; @@ -76,6 +81,9 @@ template<> void createDebugMesh(ShapeRenderer<3>* renderer, Physics::AbstractSha case Physics::AbstractShape3D::Type::Box: renderer->renderers.push_back(new Implementation::BoxRenderer<3>(*static_cast(shape))); break; + case Physics::AbstractShape3D::Type::LineSegment: + renderer->renderers.push_back(new Implementation::LineSegmentRenderer<3>(*static_cast(shape))); + break; case Physics::AbstractShape3D::Type::Point: renderer->renderers.push_back(new Implementation::PointRenderer<3>(*static_cast(shape))); break; diff --git a/src/DebugTools/Test/CMakeLists.txt b/src/DebugTools/Test/CMakeLists.txt index 00f3ccf65..1e945d0c0 100644 --- a/src/DebugTools/Test/CMakeLists.txt +++ b/src/DebugTools/Test/CMakeLists.txt @@ -23,3 +23,4 @@ # corrade_add_test(DebugToolsForceRendererTest ForceRendererTest.cpp LIBRARIES MagnumMathTestLib) +corrade_add_test(DebugToolsLineSegmentRendererTest LineSegmentRendererTest.cpp LIBRARIES MagnumMathTestLib) diff --git a/src/DebugTools/Test/LineSegmentRendererTest.cpp b/src/DebugTools/Test/LineSegmentRendererTest.cpp new file mode 100644 index 000000000..5e0a056bc --- /dev/null +++ b/src/DebugTools/Test/LineSegmentRendererTest.cpp @@ -0,0 +1,67 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include + +#include "Math/Matrix3.h" +#include "Math/Matrix4.h" +#include "Magnum.h" +#include "DebugTools/Implementation/LineSegmentRendererTransformation.h" + +namespace Magnum { namespace DebugTools { namespace Test { + +class LineSegmentRendererTest: public Corrade::TestSuite::Tester { + public: + explicit LineSegmentRendererTest(); + + void line2D(); + void line3D(); +}; + +LineSegmentRendererTest::LineSegmentRendererTest() { + addTests({&LineSegmentRendererTest::line2D, + &LineSegmentRendererTest::line3D}); +} + +void LineSegmentRendererTest::line2D() { + const Vector2 a(-2.0f, 3.0f); + const Vector2 b(3.4f, -1.5f); + const Matrix3 matrix = Implementation::lineSegmentRendererTransformation<2>(a, b); + + CORRADE_COMPARE(matrix.transformPoint({0.0f, 0.0f}), a); + CORRADE_COMPARE(matrix.transformPoint({1.0f, 0.0f}), b); +} + +void LineSegmentRendererTest::line3D() { + const Vector3 a(-2.0f, 3.0f, 1.5f); + const Vector3 b(3.4f, -1.5f, 0.5f); + const Matrix4 matrix = Implementation::lineSegmentRendererTransformation<3>(a, b); + + CORRADE_COMPARE(matrix.transformPoint({0.0f, 0.0f, 0.0f}), a); + CORRADE_COMPARE(matrix.transformPoint({1.0f, 0.0f, 0.0f}), b); +} + +}}} + +CORRADE_TEST_MAIN(Magnum::DebugTools::Test::LineSegmentRendererTest)