From 141a3df45685a4763a62d1e4c6db6963168a6502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 1 Aug 2013 17:51:37 +0200 Subject: [PATCH] Reducing pointer chasings, part 3e: less pointer passing in DebugTools. In most cases just adapted to changes in root namespace and SceneGraph. ForceRenderer now takes const reference to force vector and additionally disallows passing rvalue to it. --- doc/debug-tools.dox | 2 +- src/DebugTools/ForceRenderer.cpp | 26 +++++------ src/DebugTools/ForceRenderer.h | 9 ++-- .../Implementation/AbstractShapeRenderer.cpp | 30 ++++++------- .../Implementation/AxisAlignedBoxRenderer.cpp | 2 +- .../Implementation/AxisAlignedBoxRenderer.h | 3 +- src/DebugTools/Implementation/BoxRenderer.cpp | 2 +- src/DebugTools/Implementation/BoxRenderer.h | 3 +- .../Implementation/LineSegmentRenderer.cpp | 2 +- .../Implementation/LineSegmentRenderer.h | 3 +- .../Implementation/PointRenderer.cpp | 2 +- src/DebugTools/Implementation/PointRenderer.h | 3 +- .../Implementation/SphereRenderer.cpp | 2 +- .../Implementation/SphereRenderer.h | 7 +-- src/DebugTools/ObjectRenderer.cpp | 28 ++++++------ src/DebugTools/ObjectRenderer.h | 4 +- src/DebugTools/ShapeRenderer.cpp | 44 +++++++++---------- src/DebugTools/ShapeRenderer.h | 8 ++-- 18 files changed, 94 insertions(+), 86 deletions(-) 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;