diff --git a/src/DebugTools/Implementation/AbstractBoxRenderer.cpp b/src/DebugTools/Implementation/AbstractBoxRenderer.cpp index 011997e4f..60fb738a8 100644 --- a/src/DebugTools/Implementation/AbstractBoxRenderer.cpp +++ b/src/DebugTools/Implementation/AbstractBoxRenderer.cpp @@ -32,11 +32,11 @@ namespace Magnum { namespace DebugTools { namespace Implementation { AbstractBoxRenderer<2>::AbstractBoxRenderer(): AbstractShapeRenderer<2>("box2d", "box2d-vertices", {}) { - if(!mesh) this->createResources(Primitives::Square::wireframe()); + if(!wireframeMesh) this->createResources(Primitives::Square::wireframe()); } AbstractBoxRenderer<3>::AbstractBoxRenderer(): AbstractShapeRenderer<3>("box3d", "box3d-vertices", "box3d-indices") { - if(!mesh) this->createResources(Primitives::Cube::wireframe()); + if(!wireframeMesh) this->createResources(Primitives::Cube::wireframe()); } template class AbstractBoxRenderer<2>; diff --git a/src/DebugTools/Implementation/AbstractShapeRenderer.cpp b/src/DebugTools/Implementation/AbstractShapeRenderer.cpp index 06f9b30cd..b976cb576 100644 --- a/src/DebugTools/Implementation/AbstractShapeRenderer.cpp +++ b/src/DebugTools/Implementation/AbstractShapeRenderer.cpp @@ -90,19 +90,19 @@ template<> void create<3>(Trade::MeshData3D& data, Resource& meshResource, } template AbstractShapeRenderer::AbstractShapeRenderer(ResourceKey meshKey, ResourceKey vertexBufferKey, ResourceKey indexBufferKey) { - shader = ResourceManager::instance()->get>(shaderKey()); - mesh = ResourceManager::instance()->get(meshKey); + wireframeShader = ResourceManager::instance()->get>(shaderKey()); + wireframeMesh = ResourceManager::instance()->get(meshKey); vertexBuffer = ResourceManager::instance()->get(vertexBufferKey); indexBuffer = ResourceManager::instance()->get(indexBufferKey); - if(!shader) ResourceManager::instance()->set(shaderKey(), + if(!wireframeShader) ResourceManager::instance()->set(shaderKey(), new Shaders::FlatShader, ResourceDataState::Final, ResourcePolicy::Resident); } template AbstractShapeRenderer::~AbstractShapeRenderer() {} template void AbstractShapeRenderer::createResources(typename MeshData::Type data) { - create(data, this->mesh, this->vertexBuffer, this->indexBuffer); + create(data, this->wireframeMesh, this->vertexBuffer, this->indexBuffer); } template class AbstractShapeRenderer<2>; diff --git a/src/DebugTools/Implementation/AbstractShapeRenderer.h b/src/DebugTools/Implementation/AbstractShapeRenderer.h index 16f7f6606..25105f6c4 100644 --- a/src/DebugTools/Implementation/AbstractShapeRenderer.h +++ b/src/DebugTools/Implementation/AbstractShapeRenderer.h @@ -49,8 +49,8 @@ template class AbstractShapeRenderer { /* Call only if the mesh resource isn't already present */ void createResources(typename MeshData::Type data); - Resource> shader; - Resource mesh; + Resource> wireframeShader; + Resource wireframeMesh; private: Resource indexBuffer, vertexBuffer; diff --git a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp index 9ef7904d5..4072650b5 100644 --- a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp +++ b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp @@ -34,12 +34,12 @@ namespace Magnum { namespace DebugTools { namespace Implementation { template AxisAlignedBoxRenderer::AxisAlignedBoxRenderer(Physics::AxisAlignedBox& axisAlignedBox): axisAlignedBox(axisAlignedBox) {} template void AxisAlignedBoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { - this->shader->setTransformationProjectionMatrix(projectionMatrix* + this->wireframeShader->setTransformationProjectionMatrix(projectionMatrix* DimensionTraits::MatrixType::translation((axisAlignedBox.transformedMin()+axisAlignedBox.transformedMax())/2)* DimensionTraits::MatrixType::scaling(axisAlignedBox.transformedMax()-axisAlignedBox.transformedMin())) ->setColor(options->color()) ->use(); - this->mesh->draw(); + this->wireframeMesh->draw(); } template class AxisAlignedBoxRenderer<2>; diff --git a/src/DebugTools/Implementation/BoxRenderer.cpp b/src/DebugTools/Implementation/BoxRenderer.cpp index d9a34c62d..4e0bcb9fd 100644 --- a/src/DebugTools/Implementation/BoxRenderer.cpp +++ b/src/DebugTools/Implementation/BoxRenderer.cpp @@ -34,10 +34,10 @@ namespace Magnum { namespace DebugTools { namespace Implementation { template BoxRenderer::BoxRenderer(Physics::Box& box): box(box) {} template void BoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { - this->shader->setTransformationProjectionMatrix(projectionMatrix*box.transformedTransformation()) + this->wireframeShader->setTransformationProjectionMatrix(projectionMatrix*box.transformedTransformation()) ->setColor(options->color()) ->use(); - this->mesh->draw(); + this->wireframeMesh->draw(); } template class BoxRenderer<2>; diff --git a/src/DebugTools/Implementation/LineSegmentRenderer.cpp b/src/DebugTools/Implementation/LineSegmentRenderer.cpp index c9a0240c8..900b96055 100644 --- a/src/DebugTools/Implementation/LineSegmentRenderer.cpp +++ b/src/DebugTools/Implementation/LineSegmentRenderer.cpp @@ -51,15 +51,15 @@ namespace { } template LineSegmentRenderer::LineSegmentRenderer(Physics::Line& line): AbstractShapeRenderer(meshKey(), vertexBufferKey(), {}), line(line) { - if(!this->mesh) this->createResources(meshData()); + if(!this->wireframeMesh) this->createResources(meshData()); } template void LineSegmentRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { - this->shader->setTransformationProjectionMatrix(projectionMatrix* + this->wireframeShader->setTransformationProjectionMatrix(projectionMatrix* Implementation::lineSegmentRendererTransformation(line.transformedA(), line.transformedB())) ->setColor(options->color()) ->use(); - this->mesh->draw(); + this->wireframeMesh->draw(); } template class LineSegmentRenderer<2>; diff --git a/src/DebugTools/Implementation/PointRenderer.cpp b/src/DebugTools/Implementation/PointRenderer.cpp index c414813f2..31283541a 100644 --- a/src/DebugTools/Implementation/PointRenderer.cpp +++ b/src/DebugTools/Implementation/PointRenderer.cpp @@ -49,17 +49,17 @@ namespace { } template PointRenderer::PointRenderer(Physics::Point& point): AbstractShapeRenderer(meshKey(), vertexBufferKey(), {}), point(point) { - if(!this->mesh) this->createResources(meshData()); + if(!this->wireframeMesh) this->createResources(meshData()); } template void PointRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { /* Half scale, because the point is 2x2(x2) */ - this->shader->setTransformationProjectionMatrix(projectionMatrix* + this->wireframeShader->setTransformationProjectionMatrix(projectionMatrix* DimensionTraits::MatrixType::translation(point.transformedPosition())* DimensionTraits::MatrixType::scaling(typename DimensionTraits::VectorType(options->pointSize()/2))) ->setColor(options->color()) ->use(); - this->mesh->draw(); + this->wireframeMesh->draw(); } template class PointRenderer<2>; diff --git a/src/DebugTools/Implementation/SphereRenderer.cpp b/src/DebugTools/Implementation/SphereRenderer.cpp index 60b27c880..be6f8d2f5 100644 --- a/src/DebugTools/Implementation/SphereRenderer.cpp +++ b/src/DebugTools/Implementation/SphereRenderer.cpp @@ -34,18 +34,18 @@ namespace Magnum { namespace DebugTools { namespace Implementation { AbstractSphereRenderer<2>::AbstractSphereRenderer(): AbstractShapeRenderer<2>("sphere2d", "sphere2d-vertices", {}) { - if(!mesh) this->createResources(Primitives::Circle::wireframe(40)); + if(!wireframeMesh) 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* + this->wireframeShader->setTransformationProjectionMatrix(projectionMatrix* DimensionTraits::MatrixType::translation(sphere.transformedPosition())* DimensionTraits::MatrixType::scaling(typename DimensionTraits::VectorType(sphere.transformedRadius()))) ->setColor(options->color()) ->use(); - this->mesh->draw(); + this->wireframeMesh->draw(); } template class SphereRenderer<2>; diff --git a/src/DebugTools/ShapeRenderer.h b/src/DebugTools/ShapeRenderer.h index 675c0be21..35c062915 100644 --- a/src/DebugTools/ShapeRenderer.h +++ b/src/DebugTools/ShapeRenderer.h @@ -57,7 +57,31 @@ See ShapeRenderer documentation for more information. */ class ShapeRendererOptions { public: - inline constexpr ShapeRendererOptions(): _color(1.0f), _pointSize(0.25f) {} + /** + * @brief Shape rendering mode + * + * @see setRenderMode() + */ + enum class RenderMode: UnsignedByte { + Wireframe, + Solid + }; + + inline constexpr ShapeRendererOptions(): _color(1.0f), _pointSize(0.25f), _renderMode(RenderMode::Wireframe) {} + + /** @brief Shape rendering mode */ + inline constexpr RenderMode renderMode() const { return _renderMode; } + + /** + * @brief Set shape rendering mode + * @return Pointer to self (for method chaining) + * + * Default is @ref RenderMode "RenderMode::Wireframe". + */ + inline ShapeRendererOptions* setRenderMode(RenderMode mode) { + _renderMode = mode; + return this; + } /** @brief Color of rendered shape */ inline constexpr Color4<> color() const { return _color; } @@ -91,6 +115,7 @@ class ShapeRendererOptions { private: Color4<> _color; Float _pointSize; + RenderMode _renderMode; }; /**