diff --git a/doc/debug-tools.dox b/doc/debug-tools.dox index 517fee209..95f4ded6d 100644 --- a/doc/debug-tools.dox +++ b/doc/debug-tools.dox @@ -69,7 +69,7 @@ DebugTools::ResourceManager::instance()->set("my", // renderer is automatically added to the object features and also to // specified drawable group. Object3D* object; -new DebugTools::ObjectRenderer2D(object, "my", debugDrawables); +new DebugTools::ObjectRenderer2D(*object, "my", debugDrawables); @endcode See DebugTools::ObjectRenderer and DebugTools::ShapeRenderer for more diff --git a/src/DebugTools/ForceRenderer.cpp b/src/DebugTools/ForceRenderer.cpp index ac0cf7427..c1bbb53bd 100644 --- a/src/DebugTools/ForceRenderer.cpp +++ b/src/DebugTools/ForceRenderer.cpp @@ -64,15 +64,15 @@ const std::array indices{{ } -template ForceRenderer::ForceRenderer(SceneGraph::AbstractObject* object, const typename DimensionTraits::VectorType& forcePosition, const typename DimensionTraits::VectorType* force, ResourceKey options, SceneGraph::DrawableGroup* drawables): SceneGraph::Drawable(object, drawables), forcePosition(forcePosition), force(force), options(ResourceManager::instance()->get(options)) { +template ForceRenderer::ForceRenderer(SceneGraph::AbstractObject& object, const typename DimensionTraits::VectorType& forcePosition, const typename DimensionTraits::VectorType& force, ResourceKey options, SceneGraph::DrawableGroup* drawables): SceneGraph::Drawable(object, drawables), forcePosition(forcePosition), force(force), options(ResourceManager::instance().get(options)) { /* Shader */ - shader = ResourceManager::instance()->get>(shaderKey()); - if(!shader) ResourceManager::instance()->set(shader.key(), new Shaders::Flat); + shader = ResourceManager::instance().get>(shaderKey()); + if(!shader) ResourceManager::instance().set(shader.key(), new Shaders::Flat); /* Mesh and vertex buffer */ - mesh = ResourceManager::instance()->get("force"); - vertexBuffer = ResourceManager::instance()->get("force-vertices"); - indexBuffer = ResourceManager::instance()->get("force-indices"); + mesh = ResourceManager::instance().get("force"); + vertexBuffer = ResourceManager::instance().get("force-vertices"); + indexBuffer = ResourceManager::instance().get("force-indices"); if(mesh) return; /* Create the mesh */ @@ -80,22 +80,22 @@ template ForceRenderer::ForceRenderer(SceneG Buffer* indexBuffer = new Buffer(Buffer::Target::ElementArray); vertexBuffer->setData(positions, Buffer::Usage::StaticDraw); - ResourceManager::instance()->set(this->vertexBuffer.key(), vertexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); + ResourceManager::instance().set(this->vertexBuffer.key(), vertexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); indexBuffer->setData(indices, Buffer::Usage::StaticDraw); - ResourceManager::instance()->set(this->indexBuffer.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); + ResourceManager::instance().set(this->indexBuffer.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); Mesh* mesh = new Mesh; mesh->setPrimitive(Mesh::Primitive::Lines) .setIndexCount(indices.size()) - .addVertexBuffer(vertexBuffer, 0, + .addVertexBuffer(*vertexBuffer, 0, typename Shaders::Flat::Position(Shaders::Flat::Position::Components::Two)) - .setIndexBuffer(indexBuffer, 0, Mesh::IndexType::UnsignedByte, 0, positions.size()); - ResourceManager::instance()->set(this->mesh.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); + .setIndexBuffer(*indexBuffer, 0, Mesh::IndexType::UnsignedByte, 0, positions.size()); + ResourceManager::instance().set(this->mesh.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); } -template void ForceRenderer::draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera* camera) { - shader->setTransformationProjectionMatrix(camera->projectionMatrix()*Implementation::forceRendererTransformation(transformationMatrix.transformPoint(forcePosition), *force)*DimensionTraits::MatrixType::scaling(typename DimensionTraits::VectorType(options->scale()))) +template void ForceRenderer::draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera& camera) { + shader->setTransformationProjectionMatrix(camera.projectionMatrix()*Implementation::forceRendererTransformation(transformationMatrix.transformPoint(forcePosition), force)*DimensionTraits::MatrixType::scaling(typename DimensionTraits::VectorType(options->scale()))) .setColor(options->color()) .use(); mesh->draw(); diff --git a/src/DebugTools/ForceRenderer.h b/src/DebugTools/ForceRenderer.h index df5babf4e..2bb1704ad 100644 --- a/src/DebugTools/ForceRenderer.h +++ b/src/DebugTools/ForceRenderer.h @@ -117,14 +117,17 @@ template class MAGNUM_DEBUGTOOLS_EXPORT ForceRenderer: p * saved as reference to original vector and thus it must be available * for the whole lifetime of the renderer. */ - explicit ForceRenderer(SceneGraph::AbstractObject* object, const typename DimensionTraits::VectorType& forcePosition, const typename DimensionTraits::VectorType* force, ResourceKey options = ResourceKey(), SceneGraph::DrawableGroup* drawables = nullptr); + explicit ForceRenderer(SceneGraph::AbstractObject& object, const typename DimensionTraits::VectorType& forcePosition, const typename DimensionTraits::VectorType& force, ResourceKey options = ResourceKey(), SceneGraph::DrawableGroup* drawables = nullptr); + + /** @overload */ + ForceRenderer(SceneGraph::AbstractObject&, const typename DimensionTraits::VectorType&, typename DimensionTraits::VectorType&&, ResourceKey = ResourceKey(), SceneGraph::DrawableGroup* = nullptr) = delete; protected: - void draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera* camera) override; + void draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera& camera) override; private: const typename DimensionTraits::VectorType forcePosition; - const typename DimensionTraits::VectorType* const force; + const typename DimensionTraits::VectorType& force; Resource options; Resource> shader; diff --git a/src/DebugTools/Implementation/AbstractShapeRenderer.cpp b/src/DebugTools/Implementation/AbstractShapeRenderer.cpp index c8e7789d8..856d9497b 100644 --- a/src/DebugTools/Implementation/AbstractShapeRenderer.cpp +++ b/src/DebugTools/Implementation/AbstractShapeRenderer.cpp @@ -47,21 +47,21 @@ template<> void create<2>(Trade::MeshData2D& data, Resource& meshResource, /* Vertex buffer */ Buffer* buffer = new Buffer(Buffer::Target::Array); buffer->setData(data.positions(0), Buffer::Usage::StaticDraw); - ResourceManager::instance()->set(vertexBufferResource.key(), buffer, ResourceDataState::Final, ResourcePolicy::Manual); + ResourceManager::instance().set(vertexBufferResource.key(), buffer, ResourceDataState::Final, ResourcePolicy::Manual); /* Mesh configuration */ Mesh* mesh = new Mesh; mesh->setPrimitive(data.primitive()) .setVertexCount(data.positions(0).size()) - .addVertexBuffer(buffer, 0, Shaders::Flat2D::Position()); - ResourceManager::instance()->set(meshResource.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); + .addVertexBuffer(*buffer, 0, Shaders::Flat2D::Position()); + ResourceManager::instance().set(meshResource.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); /* Index buffer, if needed, if not, resource key doesn't have to be set */ if(data.isIndexed()) { CORRADE_INTERNAL_ASSERT(indexBufferResource.key() != ResourceKey()); Buffer* indexBuffer = new Buffer(Buffer::Target::ElementArray); - MeshTools::compressIndices(mesh, indexBuffer, Buffer::Usage::StaticDraw, data.indices()); - ResourceManager::instance()->set(indexBufferResource.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); + MeshTools::compressIndices(*mesh, *indexBuffer, Buffer::Usage::StaticDraw, data.indices()); + ResourceManager::instance().set(indexBufferResource.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); } } @@ -69,33 +69,33 @@ template<> void create<3>(Trade::MeshData3D& data, Resource& meshResource, /* Vertex buffer */ Buffer* vertexBuffer = new Buffer(Buffer::Target::Array); vertexBuffer->setData(data.positions(0), Buffer::Usage::StaticDraw); - ResourceManager::instance()->set(vertexBufferResource.key(), vertexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); + ResourceManager::instance().set(vertexBufferResource.key(), vertexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); /* Mesh configuration */ Mesh* mesh = new Mesh; mesh->setPrimitive(data.primitive()) .setVertexCount(data.positions(0).size()) - .addVertexBuffer(vertexBuffer, 0, Shaders::Flat3D::Position()); - ResourceManager::instance()->set(meshResource.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); + .addVertexBuffer(*vertexBuffer, 0, Shaders::Flat3D::Position()); + ResourceManager::instance().set(meshResource.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); /* Index buffer, if needed, if not, resource key doesn't have to be set */ if(data.isIndexed()) { CORRADE_INTERNAL_ASSERT(indexBufferResource.key() != ResourceKey()); Buffer* indexBuffer = new Buffer(Buffer::Target::ElementArray); - MeshTools::compressIndices(mesh, indexBuffer, Buffer::Usage::StaticDraw, data.indices()); - ResourceManager::instance()->set(indexBufferResource.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); + MeshTools::compressIndices(*mesh, *indexBuffer, Buffer::Usage::StaticDraw, data.indices()); + ResourceManager::instance().set(indexBufferResource.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); } } } template AbstractShapeRenderer::AbstractShapeRenderer(ResourceKey meshKey, ResourceKey vertexBufferKey, ResourceKey indexBufferKey) { - wireframeShader = ResourceManager::instance()->get>(shaderKey()); - wireframeMesh = ResourceManager::instance()->get(meshKey); - vertexBuffer = ResourceManager::instance()->get(vertexBufferKey); - indexBuffer = ResourceManager::instance()->get(indexBufferKey); + wireframeShader = ResourceManager::instance().get>(shaderKey()); + wireframeMesh = ResourceManager::instance().get(meshKey); + vertexBuffer = ResourceManager::instance().get(vertexBufferKey); + indexBuffer = ResourceManager::instance().get(indexBufferKey); - if(!wireframeShader) ResourceManager::instance()->set(shaderKey(), + if(!wireframeShader) ResourceManager::instance().set(shaderKey(), new Shaders::Flat, ResourceDataState::Final, ResourcePolicy::Resident); } diff --git a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp index 5a497c2da..dd90f600b 100644 --- a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp +++ b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp @@ -31,7 +31,7 @@ namespace Magnum { namespace DebugTools { namespace Implementation { -template AxisAlignedBoxRenderer::AxisAlignedBoxRenderer(const Shapes::Implementation::AbstractShape* axisAlignedBox): axisAlignedBox(static_cast>*>(axisAlignedBox)->shape) {} +template AxisAlignedBoxRenderer::AxisAlignedBoxRenderer(const Shapes::Implementation::AbstractShape& axisAlignedBox): axisAlignedBox(static_cast>&>(axisAlignedBox).shape) {} template void AxisAlignedBoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { AbstractBoxRenderer::wireframeShader->setTransformationProjectionMatrix(projectionMatrix* diff --git a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.h b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.h index b50cb5777..999cc4bf1 100644 --- a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.h +++ b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.h @@ -34,7 +34,8 @@ namespace Magnum { namespace DebugTools { namespace Implementation { template class AxisAlignedBoxRenderer: public AbstractBoxRenderer { public: - AxisAlignedBoxRenderer(const Shapes::Implementation::AbstractShape* axisAlignedBox); + explicit AxisAlignedBoxRenderer(const Shapes::Implementation::AbstractShape& axisAlignedBox); + AxisAlignedBoxRenderer(Shapes::Implementation::AbstractShape&&) = delete; void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; diff --git a/src/DebugTools/Implementation/BoxRenderer.cpp b/src/DebugTools/Implementation/BoxRenderer.cpp index dd5a45239..16ce142ee 100644 --- a/src/DebugTools/Implementation/BoxRenderer.cpp +++ b/src/DebugTools/Implementation/BoxRenderer.cpp @@ -31,7 +31,7 @@ namespace Magnum { namespace DebugTools { namespace Implementation { -template BoxRenderer::BoxRenderer(const Shapes::Implementation::AbstractShape* box): box(static_cast>*>(box)->shape) {} +template BoxRenderer::BoxRenderer(const Shapes::Implementation::AbstractShape& box): box(static_cast>&>(box).shape) {} template void BoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { AbstractBoxRenderer::wireframeShader->setTransformationProjectionMatrix(projectionMatrix*box.transformation()) diff --git a/src/DebugTools/Implementation/BoxRenderer.h b/src/DebugTools/Implementation/BoxRenderer.h index c027ae6d8..54b00cfd2 100644 --- a/src/DebugTools/Implementation/BoxRenderer.h +++ b/src/DebugTools/Implementation/BoxRenderer.h @@ -34,7 +34,8 @@ namespace Magnum { namespace DebugTools { namespace Implementation { template class BoxRenderer: public AbstractBoxRenderer { public: - BoxRenderer(const Shapes::Implementation::AbstractShape* box); + explicit BoxRenderer(const Shapes::Implementation::AbstractShape& box); + BoxRenderer(const Shapes::Implementation::AbstractShape&&) = delete; void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; diff --git a/src/DebugTools/Implementation/LineSegmentRenderer.cpp b/src/DebugTools/Implementation/LineSegmentRenderer.cpp index 9d0ee7524..0ed2c53e5 100644 --- a/src/DebugTools/Implementation/LineSegmentRenderer.cpp +++ b/src/DebugTools/Implementation/LineSegmentRenderer.cpp @@ -50,7 +50,7 @@ namespace { template<> inline Trade::MeshData3D meshData<3>() { return Primitives::Line3D::wireframe(); } } -template LineSegmentRenderer::LineSegmentRenderer(const Shapes::Implementation::AbstractShape* line): AbstractShapeRenderer(meshKey(), vertexBufferKey(), {}), line(static_cast>*>(line)->shape) { +template LineSegmentRenderer::LineSegmentRenderer(const Shapes::Implementation::AbstractShape& line): AbstractShapeRenderer(meshKey(), vertexBufferKey(), {}), line(static_cast>&>(line).shape) { if(!AbstractShapeRenderer::wireframeMesh) AbstractShapeRenderer::createResources(meshData()); } diff --git a/src/DebugTools/Implementation/LineSegmentRenderer.h b/src/DebugTools/Implementation/LineSegmentRenderer.h index 946870cc2..556db46ec 100644 --- a/src/DebugTools/Implementation/LineSegmentRenderer.h +++ b/src/DebugTools/Implementation/LineSegmentRenderer.h @@ -34,7 +34,8 @@ namespace Magnum { namespace DebugTools { namespace Implementation { template class LineSegmentRenderer: public AbstractShapeRenderer { public: - LineSegmentRenderer(const Shapes::Implementation::AbstractShape* line); + explicit LineSegmentRenderer(const Shapes::Implementation::AbstractShape& line); + LineSegmentRenderer(const Shapes::Implementation::AbstractShape&&) = delete; void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; diff --git a/src/DebugTools/Implementation/PointRenderer.cpp b/src/DebugTools/Implementation/PointRenderer.cpp index 458014adb..7a5243180 100644 --- a/src/DebugTools/Implementation/PointRenderer.cpp +++ b/src/DebugTools/Implementation/PointRenderer.cpp @@ -48,7 +48,7 @@ namespace { template<> inline Trade::MeshData3D meshData<3>() { return Primitives::Crosshair3D::wireframe(); } } -template PointRenderer::PointRenderer(const Shapes::Implementation::AbstractShape* point): AbstractShapeRenderer(meshKey(), vertexBufferKey(), {}), point(static_cast>*>(point)->shape) { +template PointRenderer::PointRenderer(const Shapes::Implementation::AbstractShape& point): AbstractShapeRenderer(meshKey(), vertexBufferKey(), {}), point(static_cast>&>(point).shape) { if(!AbstractShapeRenderer::wireframeMesh) AbstractShapeRenderer::createResources(meshData()); } diff --git a/src/DebugTools/Implementation/PointRenderer.h b/src/DebugTools/Implementation/PointRenderer.h index 2b194e663..adb88415b 100644 --- a/src/DebugTools/Implementation/PointRenderer.h +++ b/src/DebugTools/Implementation/PointRenderer.h @@ -34,7 +34,8 @@ namespace Magnum { namespace DebugTools { namespace Implementation { template class PointRenderer: public AbstractShapeRenderer { public: - PointRenderer(const Shapes::Implementation::AbstractShape* point); + explicit PointRenderer(const Shapes::Implementation::AbstractShape& point); + PointRenderer(Shapes::Implementation::AbstractShape&&) = delete; void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; diff --git a/src/DebugTools/Implementation/SphereRenderer.cpp b/src/DebugTools/Implementation/SphereRenderer.cpp index 8f13afac0..9a6815738 100644 --- a/src/DebugTools/Implementation/SphereRenderer.cpp +++ b/src/DebugTools/Implementation/SphereRenderer.cpp @@ -43,7 +43,7 @@ AbstractSphereRenderer<3>::AbstractSphereRenderer(): AbstractShapeRenderer<3>("s if(!wireframeMesh) createResources(Primitives::UVSphere::wireframe(40, 20)); } -template SphereRenderer::SphereRenderer(const Shapes::Implementation::AbstractShape* sphere): sphere(static_cast>*>(sphere)->shape) {} +template SphereRenderer::SphereRenderer(const Shapes::Implementation::AbstractShape& sphere): sphere(static_cast>&>(sphere).shape) {} template void SphereRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { AbstractShapeRenderer::wireframeShader->setTransformationProjectionMatrix(projectionMatrix* diff --git a/src/DebugTools/Implementation/SphereRenderer.h b/src/DebugTools/Implementation/SphereRenderer.h index 232231732..14687a6ee 100644 --- a/src/DebugTools/Implementation/SphereRenderer.h +++ b/src/DebugTools/Implementation/SphereRenderer.h @@ -36,17 +36,18 @@ template class AbstractSphereRenderer; template<> class AbstractSphereRenderer<2>: public AbstractShapeRenderer<2> { public: - AbstractSphereRenderer(); + explicit AbstractSphereRenderer(); }; template<> class AbstractSphereRenderer<3>: public AbstractShapeRenderer<3> { public: - AbstractSphereRenderer(); + explicit AbstractSphereRenderer(); }; template class SphereRenderer: public AbstractSphereRenderer { public: - SphereRenderer(const Shapes::Implementation::AbstractShape* sphere); + explicit SphereRenderer(const Shapes::Implementation::AbstractShape& sphere); + SphereRenderer(const Shapes::Implementation::AbstractShape&&) = delete; void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; diff --git a/src/DebugTools/ObjectRenderer.cpp b/src/DebugTools/ObjectRenderer.cpp index 143fcf8b3..98b6a7dc7 100644 --- a/src/DebugTools/ObjectRenderer.cpp +++ b/src/DebugTools/ObjectRenderer.cpp @@ -142,15 +142,15 @@ const std::array Renderer<3>::indices{{ } -template ObjectRenderer::ObjectRenderer(SceneGraph::AbstractObject* object, ResourceKey options, SceneGraph::DrawableGroup* drawables): SceneGraph::Drawable(object, drawables), options(ResourceManager::instance()->get(options)) { +template ObjectRenderer::ObjectRenderer(SceneGraph::AbstractObject& object, ResourceKey options, SceneGraph::DrawableGroup* drawables): SceneGraph::Drawable(object, drawables), options(ResourceManager::instance().get(options)) { /* Shader */ - shader = ResourceManager::instance()->get>(Renderer::shader()); - if(!shader) ResourceManager::instance()->set(shader.key(), new Shaders::VertexColor); + shader = ResourceManager::instance().get>(Renderer::shader()); + if(!shader) ResourceManager::instance().set(shader.key(), new Shaders::VertexColor); /* Mesh and vertex buffer */ - mesh = ResourceManager::instance()->get(Renderer::mesh()); - vertexBuffer = ResourceManager::instance()->get(Renderer::vertexBuffer()); - indexBuffer = ResourceManager::instance()->get(Renderer::indexBuffer()); + mesh = ResourceManager::instance().get(Renderer::mesh()); + vertexBuffer = ResourceManager::instance().get(Renderer::vertexBuffer()); + indexBuffer = ResourceManager::instance().get(Renderer::indexBuffer()); if(mesh) return; /* Create the mesh */ @@ -158,23 +158,23 @@ template ObjectRenderer::ObjectRenderer(Scen Buffer* indexBuffer = new Buffer(Buffer::Target::ElementArray); Mesh* mesh = new Mesh; - MeshTools::interleave(mesh, vertexBuffer, Buffer::Usage::StaticDraw, Renderer::positions, Renderer::colors); - ResourceManager::instance()->set(this->vertexBuffer.key(), vertexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); + MeshTools::interleave(*mesh, *vertexBuffer, Buffer::Usage::StaticDraw, Renderer::positions, Renderer::colors); + ResourceManager::instance().set(this->vertexBuffer.key(), vertexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); indexBuffer->setData(Renderer::indices, Buffer::Usage::StaticDraw); - ResourceManager::instance()->set(this->indexBuffer.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); + ResourceManager::instance().set(this->indexBuffer.key(), indexBuffer, ResourceDataState::Final, ResourcePolicy::Manual); mesh->setPrimitive(Mesh::Primitive::Lines) .setIndexCount(Renderer::indices.size()) - .addInterleavedVertexBuffer(vertexBuffer, 0, + .addInterleavedVertexBuffer(*vertexBuffer, 0, typename Shaders::VertexColor::Position(), typename Shaders::VertexColor::Color()) - .setIndexBuffer(indexBuffer, 0, Mesh::IndexType::UnsignedByte, 0, Renderer::positions.size()); - ResourceManager::instance()->set(this->mesh.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); + .setIndexBuffer(*indexBuffer, 0, Mesh::IndexType::UnsignedByte, 0, Renderer::positions.size()); + ResourceManager::instance().set(this->mesh.key(), mesh, ResourceDataState::Final, ResourcePolicy::Manual); } -template void ObjectRenderer::draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera* camera) { - shader->setTransformationProjectionMatrix(camera->projectionMatrix()*transformationMatrix*DimensionTraits::MatrixType::scaling(typename DimensionTraits::VectorType(options->size()))) +template void ObjectRenderer::draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera& camera) { + shader->setTransformationProjectionMatrix(camera.projectionMatrix()*transformationMatrix*DimensionTraits::MatrixType::scaling(typename DimensionTraits::VectorType(options->size()))) .use(); mesh->draw(); diff --git a/src/DebugTools/ObjectRenderer.h b/src/DebugTools/ObjectRenderer.h index df99e2b34..928e63568 100644 --- a/src/DebugTools/ObjectRenderer.h +++ b/src/DebugTools/ObjectRenderer.h @@ -95,10 +95,10 @@ template class MAGNUM_DEBUGTOOLS_EXPORT ObjectRenderer: * * The renderer is automatically added to object's features. */ - explicit ObjectRenderer(SceneGraph::AbstractObject* object, ResourceKey options = ResourceKey(), SceneGraph::DrawableGroup* drawables = nullptr); + explicit ObjectRenderer(SceneGraph::AbstractObject& object, ResourceKey options = ResourceKey(), SceneGraph::DrawableGroup* drawables = nullptr); protected: - void draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera* camera) override; + void draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera& camera) override; private: Resource options; diff --git a/src/DebugTools/ShapeRenderer.cpp b/src/DebugTools/ShapeRenderer.cpp index 1c36ff272..f659779eb 100644 --- a/src/DebugTools/ShapeRenderer.cpp +++ b/src/DebugTools/ShapeRenderer.cpp @@ -39,74 +39,74 @@ namespace Magnum { namespace DebugTools { namespace Implementation { -template<> void createDebugMesh(ShapeRenderer<2>* renderer, const Shapes::Implementation::AbstractShape<2>* shape) { - switch(shape->type()) { +template<> void createDebugMesh(ShapeRenderer<2>& renderer, const Shapes::Implementation::AbstractShape<2>& shape) { + switch(shape.type()) { case Shapes::AbstractShape2D::Type::AxisAlignedBox: - renderer->renderers.push_back(new Implementation::AxisAlignedBoxRenderer<2>(shape)); + renderer.renderers.push_back(new Implementation::AxisAlignedBoxRenderer<2>(shape)); break; case Shapes::AbstractShape2D::Type::Box: - renderer->renderers.push_back(new Implementation::BoxRenderer<2>(shape)); + renderer.renderers.push_back(new Implementation::BoxRenderer<2>(shape)); break; case Shapes::AbstractShape2D::Type::LineSegment: - renderer->renderers.push_back(new Implementation::LineSegmentRenderer<2>(shape)); + renderer.renderers.push_back(new Implementation::LineSegmentRenderer<2>(shape)); break; case Shapes::AbstractShape2D::Type::Point: - renderer->renderers.push_back(new Implementation::PointRenderer<2>(shape)); + renderer.renderers.push_back(new Implementation::PointRenderer<2>(shape)); break; case Shapes::AbstractShape2D::Type::Sphere: - renderer->renderers.push_back(new Implementation::SphereRenderer<2>(shape)); + renderer.renderers.push_back(new Implementation::SphereRenderer<2>(shape)); break; case Shapes::AbstractShape2D::Type::Composition: { const Shapes::Composition2D& composition = - static_cast*>(shape)->shape; + static_cast&>(shape).shape; for(std::size_t i = 0; i != composition.size(); ++i) createDebugMesh(renderer, Shapes::Implementation::getAbstractShape(composition, i)); } break; default: - Warning() << "DebugTools::ShapeRenderer2D::createShapeRenderer(): type" << shape->type() << "not implemented"; + Warning() << "DebugTools::ShapeRenderer2D::createShapeRenderer(): type" << shape.type() << "not implemented"; } } -template<> void createDebugMesh(ShapeRenderer<3>* renderer, const Shapes::Implementation::AbstractShape<3>* shape) { - switch(shape->type()) { +template<> void createDebugMesh(ShapeRenderer<3>& renderer, const Shapes::Implementation::AbstractShape<3>& shape) { + switch(shape.type()) { case Shapes::AbstractShape3D::Type::AxisAlignedBox: - renderer->renderers.push_back(new Implementation::AxisAlignedBoxRenderer<3>(shape)); + renderer.renderers.push_back(new Implementation::AxisAlignedBoxRenderer<3>(shape)); break; case Shapes::AbstractShape3D::Type::Box: - renderer->renderers.push_back(new Implementation::BoxRenderer<3>(shape)); + renderer.renderers.push_back(new Implementation::BoxRenderer<3>(shape)); break; case Shapes::AbstractShape3D::Type::LineSegment: - renderer->renderers.push_back(new Implementation::LineSegmentRenderer<3>(shape)); + renderer.renderers.push_back(new Implementation::LineSegmentRenderer<3>(shape)); break; case Shapes::AbstractShape3D::Type::Point: - renderer->renderers.push_back(new Implementation::PointRenderer<3>(shape)); + renderer.renderers.push_back(new Implementation::PointRenderer<3>(shape)); break; case Shapes::AbstractShape3D::Type::Sphere: - renderer->renderers.push_back(new Implementation::SphereRenderer<3>(shape)); + renderer.renderers.push_back(new Implementation::SphereRenderer<3>(shape)); break; case Shapes::AbstractShape3D::Type::Composition: { const Shapes::Composition3D& composition = - static_cast*>(shape)->shape; + static_cast&>(shape).shape; for(std::size_t i = 0; i != composition.size(); ++i) createDebugMesh(renderer, Shapes::Implementation::getAbstractShape(composition, i)); } break; default: - Warning() << "DebugTools::ShapeRenderer3D::createShapeRenderer(): type" << shape->type() << "not implemented"; + Warning() << "DebugTools::ShapeRenderer3D::createShapeRenderer(): type" << shape.type() << "not implemented"; } } } -template ShapeRenderer::ShapeRenderer(Shapes::AbstractShape* shape, ResourceKey options, SceneGraph::DrawableGroup* drawables): SceneGraph::Drawable(shape->object(), drawables), options(ResourceManager::instance()->get(options)) { - Implementation::createDebugMesh(this, Shapes::Implementation::getAbstractShape(shape)); +template ShapeRenderer::ShapeRenderer(Shapes::AbstractShape& shape, ResourceKey options, SceneGraph::DrawableGroup* drawables): SceneGraph::Drawable(shape.object(), drawables), options(ResourceManager::instance().get(options)) { + Implementation::createDebugMesh(*this, Shapes::Implementation::getAbstractShape(shape)); } template ShapeRenderer::~ShapeRenderer() { for(auto i: renderers) delete i; } -template void ShapeRenderer::draw(const typename DimensionTraits::MatrixType&, SceneGraph::AbstractCamera* camera) { - typename DimensionTraits::MatrixType projectionMatrix = camera->projectionMatrix()*camera->cameraMatrix(); +template void ShapeRenderer::draw(const typename DimensionTraits::MatrixType&, SceneGraph::AbstractCamera& camera) { + typename DimensionTraits::MatrixType projectionMatrix = camera.projectionMatrix()*camera.cameraMatrix(); for(auto i: renderers) i->draw(options, projectionMatrix); } diff --git a/src/DebugTools/ShapeRenderer.h b/src/DebugTools/ShapeRenderer.h index 0da35cf1c..86add1e9e 100644 --- a/src/DebugTools/ShapeRenderer.h +++ b/src/DebugTools/ShapeRenderer.h @@ -46,7 +46,7 @@ template class ShapeRenderer; namespace Implementation { template class AbstractShapeRenderer; - template void createDebugMesh(ShapeRenderer* renderer, const Shapes::Implementation::AbstractShape* shape); + template void createDebugMesh(ShapeRenderer& renderer, const Shapes::Implementation::AbstractShape& shape); } /** @@ -139,7 +139,7 @@ new DebugTools::ShapeRenderer2D(shape, "red", debugDrawables); @see ShapeRenderer2D, ShapeRenderer3D */ template class MAGNUM_DEBUGTOOLS_EXPORT ShapeRenderer: public SceneGraph::Drawable { - friend void Implementation::createDebugMesh<>(ShapeRenderer*, const Shapes::Implementation::AbstractShape*); + friend void Implementation::createDebugMesh<>(ShapeRenderer&, const Shapes::Implementation::AbstractShape&); public: /** @@ -154,13 +154,13 @@ template class MAGNUM_DEBUGTOOLS_EXPORT ShapeRenderer: p * @p shape must be available for the whole lifetime of the renderer * and if it is group, it must not change its internal structure. */ - explicit ShapeRenderer(Shapes::AbstractShape* shape, ResourceKey options = ResourceKey(), SceneGraph::DrawableGroup* drawables = nullptr); + explicit ShapeRenderer(Shapes::AbstractShape& shape, ResourceKey options = ResourceKey(), SceneGraph::DrawableGroup* drawables = nullptr); ~ShapeRenderer(); protected: /** @todoc Remove Float when Doxygen properly treats this as override */ - void draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera* camera) override; + void draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera& camera) override; private: Resource options;