From 7d830a17aa28d196c26fddddb3a732bc406e06a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 25 Jan 2013 14:52:27 +0100 Subject: [PATCH] DebugTools: simplified and optimized internal shape rendering. All rendering code computed the transformation/projection matrix the same way, resulting in redundant calculations. Also the `transformationMatrix` parameter of internal draw() function was never used. --- src/DebugTools/Implementation/AbstractShapeRenderer.h | 2 +- src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp | 5 ++--- src/DebugTools/Implementation/AxisAlignedBoxRenderer.h | 2 +- src/DebugTools/Implementation/BoxRenderer.cpp | 5 ++--- src/DebugTools/Implementation/BoxRenderer.h | 2 +- src/DebugTools/ShapeRenderer.cpp | 6 ++++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/DebugTools/Implementation/AbstractShapeRenderer.h b/src/DebugTools/Implementation/AbstractShapeRenderer.h index 3d384f6e2..1f530a86f 100644 --- a/src/DebugTools/Implementation/AbstractShapeRenderer.h +++ b/src/DebugTools/Implementation/AbstractShapeRenderer.h @@ -34,7 +34,7 @@ template class AbstractShapeRenderer { AbstractShapeRenderer(ResourceKey mesh, ResourceKey vertexBuffer, ResourceKey indexBuffer); virtual ~AbstractShapeRenderer(); - virtual void draw(Resource& options, const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera* camera) = 0; + virtual void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) = 0; protected: /* Call only if the mesh resource isn't already present */ diff --git a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp index 629e12fd8..09d4af8b7 100644 --- a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp +++ b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp @@ -18,19 +18,18 @@ #include "Mesh.h" #include "DebugTools/ShapeRenderer.h" #include "Physics/AxisAlignedBox.h" -#include "SceneGraph/AbstractCamera.h" #include "Shaders/FlatShader.h" namespace Magnum { namespace DebugTools { namespace Implementation { template AxisAlignedBoxRenderer::AxisAlignedBoxRenderer(Physics::AxisAlignedBox& axisAlignedBox): axisAlignedBox(axisAlignedBox) {} -template void AxisAlignedBoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType&, typename SceneGraph::AbstractCamera* camera) { +template void AxisAlignedBoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { /* Half scale, because the box is 2x2(x2) */ typename DimensionTraits::MatrixType transformation = DimensionTraits::MatrixType::translation(axisAlignedBox.transformedPosition())* DimensionTraits::MatrixType::scaling(axisAlignedBox.transformedSize()/2); - this->shader->setTransformationProjectionMatrix(camera->projectionMatrix()*camera->cameraMatrix()*transformation) + this->shader->setTransformationProjectionMatrix(projectionMatrix*transformation) ->setColor(options->color()) ->use(); this->mesh->draw(); diff --git a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.h b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.h index 00034d75b..c826a24dc 100644 --- a/src/DebugTools/Implementation/AxisAlignedBoxRenderer.h +++ b/src/DebugTools/Implementation/AxisAlignedBoxRenderer.h @@ -27,7 +27,7 @@ template class AxisAlignedBoxRenderer: public AbstractB public: AxisAlignedBoxRenderer(Physics::AxisAlignedBox& axisAlignedBox); - void draw(Resource& options, const typename DimensionTraits::MatrixType& transformation, typename SceneGraph::AbstractCamera* camera) override; + void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; private: Physics::AxisAlignedBox& axisAlignedBox; diff --git a/src/DebugTools/Implementation/BoxRenderer.cpp b/src/DebugTools/Implementation/BoxRenderer.cpp index 3ed6493d9..57d7bf51c 100644 --- a/src/DebugTools/Implementation/BoxRenderer.cpp +++ b/src/DebugTools/Implementation/BoxRenderer.cpp @@ -18,15 +18,14 @@ #include "Mesh.h" #include "DebugTools/ShapeRenderer.h" #include "Physics/Box.h" -#include "SceneGraph/AbstractCamera.h" #include "Shaders/FlatShader.h" namespace Magnum { namespace DebugTools { namespace Implementation { template BoxRenderer::BoxRenderer(Physics::Box& box): box(box) {} -template void BoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType&, typename SceneGraph::AbstractCamera* camera) { - this->shader->setTransformationProjectionMatrix(camera->projectionMatrix()*camera->cameraMatrix()*box.transformedTransformation()* +template void BoxRenderer::draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) { + this->shader->setTransformationProjectionMatrix(projectionMatrix*box.transformedTransformation()* DimensionTraits::MatrixType::scaling(typename DimensionTraits::VectorType(0.5f))) ->setColor(options->color()) ->use(); diff --git a/src/DebugTools/Implementation/BoxRenderer.h b/src/DebugTools/Implementation/BoxRenderer.h index a97969090..6330ad519 100644 --- a/src/DebugTools/Implementation/BoxRenderer.h +++ b/src/DebugTools/Implementation/BoxRenderer.h @@ -27,7 +27,7 @@ template class BoxRenderer: public AbstractBoxRenderer< public: BoxRenderer(Physics::Box& box); - void draw(Resource& options, const typename DimensionTraits::MatrixType& transformation, typename SceneGraph::AbstractCamera* camera) override; + void draw(Resource& options, const typename DimensionTraits::MatrixType& projectionMatrix) override; private: Physics::Box& box; diff --git a/src/DebugTools/ShapeRenderer.cpp b/src/DebugTools/ShapeRenderer.cpp index 89895a6c1..698137893 100644 --- a/src/DebugTools/ShapeRenderer.cpp +++ b/src/DebugTools/ShapeRenderer.cpp @@ -21,6 +21,7 @@ #include "Physics/Box.h" #include "Physics/ObjectShape.h" #include "Physics/ShapeGroup.h" +#include "SceneGraph/AbstractCamera.h" #include "Implementation/AxisAlignedBoxRenderer.h" #include "Implementation/BoxRenderer.h" @@ -76,8 +77,9 @@ template ShapeRenderer::~ShapeRenderer() { for(auto i: renderers) delete i; } -template void ShapeRenderer::draw(const typename DimensionTraits::MatrixType& transformationMatrix, SceneGraph::AbstractCamera* camera) { - for(auto i: renderers) i->draw(options, transformationMatrix, camera); +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); } template class ShapeRenderer<2>;