From 4f4e1230d7cc8d3ee491eed5eeba19f60f2fc8b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 30 Mar 2013 19:23:48 +0100 Subject: [PATCH] DebugTools: added support for 2D spheres into ShapeRenderer. --- src/DebugTools/CMakeLists.txt | 3 +- .../Implementation/SphereRenderer.cpp | 53 ++++++++++++++++++ .../Implementation/SphereRenderer.h | 54 +++++++++++++++++++ src/DebugTools/ShapeRenderer.cpp | 5 ++ 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 src/DebugTools/Implementation/SphereRenderer.cpp create mode 100644 src/DebugTools/Implementation/SphereRenderer.h diff --git a/src/DebugTools/CMakeLists.txt b/src/DebugTools/CMakeLists.txt index 55081223a..8d09c7346 100644 --- a/src/DebugTools/CMakeLists.txt +++ b/src/DebugTools/CMakeLists.txt @@ -33,7 +33,8 @@ set(MagnumDebugTools_SRCS Implementation/AbstractShapeRenderer.cpp Implementation/AxisAlignedBoxRenderer.cpp Implementation/BoxRenderer.cpp - Implementation/PointRenderer.cpp) + Implementation/PointRenderer.cpp + Implementation/SphereRenderer.cpp) set(MagnumDebugTools_HEADERS ForceRenderer.h diff --git a/src/DebugTools/Implementation/SphereRenderer.cpp b/src/DebugTools/Implementation/SphereRenderer.cpp new file mode 100644 index 000000000..67a367c3a --- /dev/null +++ b/src/DebugTools/Implementation/SphereRenderer.cpp @@ -0,0 +1,53 @@ +/* + 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 "SphereRenderer.h" + +#include "Mesh.h" +#include "DebugTools/ShapeRenderer.h" +#include "Physics/Sphere.h" +#include "Primitives/Circle.h" +#include "Shaders/FlatShader.h" +#include "Trade/MeshData2D.h" + +namespace Magnum { namespace DebugTools { namespace Implementation { + +AbstractSphereRenderer<2>::AbstractSphereRenderer(): AbstractShapeRenderer<2>("sphere2d", "sphere2d-vertices", {}) { + if(!mesh) this->createResources(Primitives::Circle::wireframe(40)); +} + +template SphereRenderer::SphereRenderer(Physics::Sphere& sphere): sphere(sphere) {} + +template void SphereRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { + this->shader->setTransformationProjectionMatrix(projectionMatrix* + DimensionTraits::MatrixType::translation(sphere.position())* + DimensionTraits::MatrixType::scaling(typename DimensionTraits::VectorType(sphere.radius()))) + ->setColor(options->color()) + ->use(); + this->mesh->draw(); +} + +template class SphereRenderer<2>; + +}}} diff --git a/src/DebugTools/Implementation/SphereRenderer.h b/src/DebugTools/Implementation/SphereRenderer.h new file mode 100644 index 000000000..e7cf52922 --- /dev/null +++ b/src/DebugTools/Implementation/SphereRenderer.h @@ -0,0 +1,54 @@ +#ifndef Magnum_DebugTools_Implementation_SphereRenderer_h +#define Magnum_DebugTools_Implementation_SphereRenderer_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 AbstractSphereRenderer; + +template<> class AbstractSphereRenderer<2>: public AbstractShapeRenderer<2> { + public: + AbstractSphereRenderer(); +}; + +template class SphereRenderer: public AbstractSphereRenderer { + public: + SphereRenderer(Physics::Sphere& sphere); + + void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; + + private: + Physics::Sphere& sphere; +}; + +}}} + +#endif diff --git a/src/DebugTools/ShapeRenderer.cpp b/src/DebugTools/ShapeRenderer.cpp index 1987e529b..38fbd46ce 100644 --- a/src/DebugTools/ShapeRenderer.cpp +++ b/src/DebugTools/ShapeRenderer.cpp @@ -31,11 +31,13 @@ #include "Physics/ObjectShape.h" #include "Physics/Point.h" #include "Physics/ShapeGroup.h" +#include "Physics/Sphere.h" #include "SceneGraph/AbstractCamera.h" #include "Implementation/AxisAlignedBoxRenderer.h" #include "Implementation/BoxRenderer.h" #include "Implementation/PointRenderer.h" +#include "Implementation/SphereRenderer.h" namespace Magnum { namespace DebugTools { @@ -58,6 +60,9 @@ template<> void createDebugMesh(ShapeRenderer<2>* renderer, Physics::AbstractSha if(group->first()) createDebugMesh(renderer, group->first()); if(group->second()) createDebugMesh(renderer, group->second()); } break; + case Physics::AbstractShape2D::Type::Sphere: + renderer->renderers.push_back(new Implementation::SphereRenderer<2>(*static_cast(shape))); + break; default: Warning() << "DebugTools::ShapeRenderer2D::createShapeRenderer(): type" << shape->type() << "not implemented"; }