diff --git a/src/Physics/CMakeLists.txt b/src/Physics/CMakeLists.txt index e3eec9146..f577e1594 100644 --- a/src/Physics/CMakeLists.txt +++ b/src/Physics/CMakeLists.txt @@ -12,7 +12,9 @@ set(MagnumPhysics_SRCS ShapeGroup.cpp Sphere.cpp + Implementation/AbstractBoxRenderer.cpp Implementation/AbstractDebugRenderer.cpp + Implementation/AxisAlignedBoxRenderer.cpp Implementation/BoxRenderer.cpp) set(MagnumPhysics_HEADERS diff --git a/src/Physics/DebugDrawResourceManager.cpp b/src/Physics/DebugDrawResourceManager.cpp index 477899368..ed9f64d75 100644 --- a/src/Physics/DebugDrawResourceManager.cpp +++ b/src/Physics/DebugDrawResourceManager.cpp @@ -21,9 +21,11 @@ #include "ResourceManager.h" #include "Shaders/FlatShader.h" #include "AbstractShape.h" +#include "AxisAlignedBox.h" #include "Box.h" #include "ObjectShape.h" #include "ShapeGroup.h" +#include "Implementation/AxisAlignedBoxRenderer.h" #include "Implementation/BoxRenderer.h" #include "Implementation/DebugRenderer.h" @@ -44,6 +46,8 @@ template SceneGraph::Drawable<3> PHYSICS_EXPORT * DebugDrawResourceManager::crea void DebugDrawResourceManager::createDebugMesh(Implementation::DebugRenderer<2>* renderer, AbstractShape2D* shape) { switch(shape->type()) { + case AbstractShape2D::Type::AxisAlignedBox: + renderer->addRenderer(new Implementation::AxisAlignedBoxRenderer<2>(*static_cast(shape))); case AbstractShape2D::Type::Box: renderer->addRenderer(new Implementation::BoxRenderer<2>(*static_cast(shape))); break; diff --git a/src/Physics/Implementation/AbstractBoxRenderer.cpp b/src/Physics/Implementation/AbstractBoxRenderer.cpp new file mode 100644 index 000000000..95e7cdaeb --- /dev/null +++ b/src/Physics/Implementation/AbstractBoxRenderer.cpp @@ -0,0 +1,70 @@ +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "AbstractBoxRenderer.h" + +#include "Buffer.h" +#include "Physics/DebugDrawResourceManager.h" +#include "Primitives/Cube.h" +#include "Primitives/Square.h" +#include "Shaders/FlatShader.h" + +namespace Magnum { namespace Physics { namespace Implementation { + +namespace { + template struct BoxMesh {}; + + template<> struct BoxMesh<2> { + static ResourceKey shader() { return {"shader2d"}; } + static ResourceKey key() { return {"box2d"}; } + + static Mesh* mesh(Buffer* buffer) { + Primitives::Square square; + Mesh* mesh = new Mesh; + buffer->setData(*square.positions(0), Buffer::Usage::StaticDraw); + return mesh->setPrimitive(square.primitive()) + ->setVertexCount(square.positions(0)->size()) + ->addVertexBuffer(buffer, Shaders::FlatShader<2>::Position()); + } + }; + + template<> struct BoxMesh<3> { + static ResourceKey shader() { return {"shader3d"}; } + static ResourceKey key() { return {"box3d"}; } + + static Mesh* mesh(Buffer* buffer) { + Primitives::Cube cube; + Mesh* mesh = new Mesh; + buffer->setData(*cube.positions(0), Buffer::Usage::StaticDraw); + return mesh->setPrimitive(cube.primitive()) + ->setVertexCount(cube.positions(0)->size()) + ->addVertexBuffer(buffer, Shaders::FlatShader<2>::Position()); + } + }; +} + +template AbstractBoxRenderer::AbstractBoxRenderer(): AbstractDebugRenderer(BoxMesh::shader(), BoxMesh::key()), buffer(DebugDrawResourceManager::instance()->get(BoxMesh::key())) { + if(!this->mesh) { + DebugDrawResourceManager::instance()->set(this->buffer.key(), new Buffer, ResourceDataState::Final, ResourcePolicy::Manual); + DebugDrawResourceManager::instance()->set(this->mesh.key(), BoxMesh::mesh(buffer), ResourceDataState::Final, ResourcePolicy::Manual); + } +} + +template AbstractBoxRenderer::~AbstractBoxRenderer() {} + +template class AbstractBoxRenderer<2>; +template class AbstractBoxRenderer<3>; + +}}} diff --git a/src/Physics/Implementation/AbstractBoxRenderer.h b/src/Physics/Implementation/AbstractBoxRenderer.h new file mode 100644 index 000000000..87c57687e --- /dev/null +++ b/src/Physics/Implementation/AbstractBoxRenderer.h @@ -0,0 +1,40 @@ +#ifndef Magnum_Physics_Implementation_AbstractBoxRenderer_h +#define Magnum_Physics_Implementation_AbstractBoxRenderer_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "AbstractDebugRenderer.h" + +#include "magnumCompatibility.h" + +namespace Magnum { + +class Buffer; + +namespace Physics { namespace Implementation { + +template class AbstractBoxRenderer: public AbstractDebugRenderer { + public: + AbstractBoxRenderer(); + + ~AbstractBoxRenderer(); + + protected: + Resource buffer; +}; + +}}} + +#endif diff --git a/src/Physics/Implementation/AbstractShapeRenderer.cpp b/src/Physics/Implementation/AbstractShapeRenderer.cpp new file mode 100644 index 000000000..ee4d3596e --- /dev/null +++ b/src/Physics/Implementation/AbstractShapeRenderer.cpp @@ -0,0 +1,32 @@ +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "AbstractShapeRenderer.h" + +#include "AbstractShaderProgram.h" +#include "Mesh.h" +#include "Physics/DebugDrawResourceManager.h" +#include "Shaders/FlatShader.h" + +namespace Magnum { namespace Physics { namespace Implementation { + +template AbstractShapeRenderer::AbstractShapeRenderer(ResourceKey shader, ResourceKey mesh): shader(DebugDrawResourceManager::instance()->get>(shader)), mesh(DebugDrawResourceManager::instance()->get(mesh)) {} + +template AbstractShapeRenderer::~AbstractShapeRenderer() {} + +template class AbstractShapeRenderer<2>; +template class AbstractShapeRenderer<3>; + +}}} diff --git a/src/Physics/Implementation/AbstractShapeRenderer.h b/src/Physics/Implementation/AbstractShapeRenderer.h new file mode 100644 index 000000000..276d53ba2 --- /dev/null +++ b/src/Physics/Implementation/AbstractShapeRenderer.h @@ -0,0 +1,50 @@ +#ifndef Magnum_Physics_Implementation_AbstractShapeRenderer_h +#define Magnum_Physics_Implementation_AbstractShapeRenderer_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "DimensionTraits.h" +#include "ResourceManager.h" +#include "SceneGraph/SceneGraph.h" + +namespace Magnum { + +class AbstractShaderProgram; +class Mesh; + +namespace Shaders { + template class FlatShader; +} + +namespace Physics { namespace Implementation { + +struct Options; + +template class AbstractShapeRenderer { + public: + AbstractShapeRenderer(ResourceKey shader, ResourceKey mesh); + + virtual ~AbstractShapeRenderer(); + + virtual void draw(Resource& options, const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera* camera) = 0; + + protected: + Resource> shader; + Resource mesh; +}; + +}}} + +#endif diff --git a/src/Physics/Implementation/AxisAlignedBoxRenderer.cpp b/src/Physics/Implementation/AxisAlignedBoxRenderer.cpp new file mode 100644 index 000000000..57e701116 --- /dev/null +++ b/src/Physics/Implementation/AxisAlignedBoxRenderer.cpp @@ -0,0 +1,38 @@ +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "AxisAlignedBoxRenderer.h" + +#include "Mesh.h" +#include "Physics/DebugDrawResourceManager.h" +#include "SceneGraph/AbstractCamera.h" +#include "Shaders/FlatShader.h" + +namespace Magnum { namespace Physics { namespace Implementation { + +template void AxisAlignedBoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType&, typename SceneGraph::AbstractCamera* camera) { + typename DimensionTraits::MatrixType transformation = + DimensionTraits::MatrixType::translation(axisAlignedBox.transformedPosition())* + DimensionTraits::MatrixType::scaling(axisAlignedBox.transformedSize()); + this->shader->setTransformationProjection(camera->projectionMatrix()*camera->cameraMatrix()*transformation) + ->setColor(options->color) + ->use(); + this->mesh->draw(); +} + +template class AxisAlignedBoxRenderer<2>; +template class AxisAlignedBoxRenderer<3>; + +}}} diff --git a/src/Physics/Implementation/AxisAlignedBoxRenderer.h b/src/Physics/Implementation/AxisAlignedBoxRenderer.h new file mode 100644 index 000000000..5ee7062ec --- /dev/null +++ b/src/Physics/Implementation/AxisAlignedBoxRenderer.h @@ -0,0 +1,38 @@ +#ifndef Magnum_Physics_Implementation_AxisAlignedBoxRenderer_h +#define Magnum_Physics_Implementation_AxisAlignedBoxRenderer_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "AbstractBoxRenderer.h" + +#include "Physics/AxisAlignedBox.h" + +#include "magnumCompatibility.h" + +namespace Magnum { namespace Physics { namespace Implementation { + +template class AxisAlignedBoxRenderer: public AbstractBoxRenderer { + public: + inline AxisAlignedBoxRenderer(AxisAlignedBox& axisAlignedBox): axisAlignedBox(axisAlignedBox) {} + + void draw(Resource& options, const typename DimensionTraits::MatrixType& transformation, typename SceneGraph::AbstractCamera* camera) override; + + private: + AxisAlignedBox& axisAlignedBox; +}; + +}}} + +#endif diff --git a/src/Physics/Implementation/BoxRenderer.cpp b/src/Physics/Implementation/BoxRenderer.cpp index a6cc9d4ca..1624e7aa3 100644 --- a/src/Physics/Implementation/BoxRenderer.cpp +++ b/src/Physics/Implementation/BoxRenderer.cpp @@ -15,55 +15,13 @@ #include "BoxRenderer.h" -#include "Buffer.h" -#include "Physics/Box.h" +#include "Mesh.h" #include "Physics/DebugDrawResourceManager.h" -#include "Primitives/Cube.h" -#include "Primitives/Square.h" #include "SceneGraph/AbstractCamera.h" #include "Shaders/FlatShader.h" namespace Magnum { namespace Physics { namespace Implementation { -namespace { - template struct BoxMesh {}; - - template<> struct BoxMesh<2> { - static ResourceKey shader() { return {"shader2d"}; } - static ResourceKey key() { return {"box2d"}; } - - static Mesh* mesh(Buffer* buffer) { - Primitives::Square square; - Mesh* mesh = new Mesh; - buffer->setData(*square.positions(0), Buffer::Usage::StaticDraw); - return mesh->setPrimitive(square.primitive()) - ->setVertexCount(square.positions(0)->size()) - ->addVertexBuffer(buffer, Shaders::FlatShader<2>::Position()); - } - }; - - template<> struct BoxMesh<3> { - static ResourceKey shader() { return {"shader3d"}; } - static ResourceKey key() { return {"box3d"}; } - - static Mesh* mesh(Buffer* buffer) { - Primitives::Cube cube; - Mesh* mesh = new Mesh; - buffer->setData(*cube.positions(0), Buffer::Usage::StaticDraw); - return mesh->setPrimitive(cube.primitive()) - ->setVertexCount(cube.positions(0)->size()) - ->addVertexBuffer(buffer, Shaders::FlatShader<2>::Position()); - } - }; -} - -template BoxRenderer::BoxRenderer(Box& box): AbstractDebugRenderer(BoxMesh::shader(), BoxMesh::key()), buffer(DebugDrawResourceManager::instance()->get(BoxMesh::key())), box(box) { - if(!this->mesh) { - DebugDrawResourceManager::instance()->set(this->buffer.key(), new Buffer, ResourceDataState::Final, ResourcePolicy::Manual); - DebugDrawResourceManager::instance()->set(this->mesh.key(), BoxMesh::mesh(buffer), ResourceDataState::Final, ResourcePolicy::Manual); - } -} - template void BoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType&, typename SceneGraph::AbstractCamera* camera) { this->shader->setTransformationProjection(camera->projectionMatrix()*camera->cameraMatrix()*box.transformedTransformation()) ->setColor(options->color) diff --git a/src/Physics/Implementation/BoxRenderer.h b/src/Physics/Implementation/BoxRenderer.h index d563c7c63..c1e248478 100644 --- a/src/Physics/Implementation/BoxRenderer.h +++ b/src/Physics/Implementation/BoxRenderer.h @@ -15,28 +15,21 @@ GNU Lesser General Public License version 3 for more details. */ -#include "AbstractDebugRenderer.h" +#include "AbstractBoxRenderer.h" -#include "magnumCompatibility.h" - -namespace Magnum { - -class Buffer; +#include "Physics/Box.h" -namespace Physics { - -template class Box; +#include "magnumCompatibility.h" -namespace Implementation { +namespace Magnum { namespace Physics { namespace Implementation { -template class BoxRenderer: public AbstractDebugRenderer { +template class BoxRenderer: public AbstractBoxRenderer { public: - BoxRenderer(Box& box); + inline BoxRenderer(Box& box): box(box) {} void draw(Resource& options, const typename DimensionTraits::MatrixType& transformation, typename SceneGraph::AbstractCamera* camera) override; private: - Resource buffer; Box& box; };