Browse Source

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.
pull/7/head
Vladimír Vondruš 13 years ago
parent
commit
7d830a17aa
  1. 2
      src/DebugTools/Implementation/AbstractShapeRenderer.h
  2. 5
      src/DebugTools/Implementation/AxisAlignedBoxRenderer.cpp
  3. 2
      src/DebugTools/Implementation/AxisAlignedBoxRenderer.h
  4. 5
      src/DebugTools/Implementation/BoxRenderer.cpp
  5. 2
      src/DebugTools/Implementation/BoxRenderer.h
  6. 6
      src/DebugTools/ShapeRenderer.cpp

2
src/DebugTools/Implementation/AbstractShapeRenderer.h

@ -34,7 +34,7 @@ template<std::uint8_t dimensions> class AbstractShapeRenderer {
AbstractShapeRenderer(ResourceKey mesh, ResourceKey vertexBuffer, ResourceKey indexBuffer);
virtual ~AbstractShapeRenderer();
virtual void draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& transformationMatrix, SceneGraph::AbstractCamera<dimensions>* camera) = 0;
virtual void draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& projectionMatrix) = 0;
protected:
/* Call only if the mesh resource isn't already present */

5
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<std::uint8_t dimensions> AxisAlignedBoxRenderer<dimensions>::AxisAlignedBoxRenderer(Physics::AxisAlignedBox<dimensions>& axisAlignedBox): axisAlignedBox(axisAlignedBox) {}
template<std::uint8_t dimensions> void AxisAlignedBoxRenderer<dimensions>::draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType&, typename SceneGraph::AbstractCamera<dimensions>* camera) {
template<std::uint8_t dimensions> void AxisAlignedBoxRenderer<dimensions>::draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& projectionMatrix) {
/* Half scale, because the box is 2x2(x2) */
typename DimensionTraits<dimensions>::MatrixType transformation =
DimensionTraits<dimensions>::MatrixType::translation(axisAlignedBox.transformedPosition())*
DimensionTraits<dimensions>::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();

2
src/DebugTools/Implementation/AxisAlignedBoxRenderer.h

@ -27,7 +27,7 @@ template<std::uint8_t dimensions> class AxisAlignedBoxRenderer: public AbstractB
public:
AxisAlignedBoxRenderer(Physics::AxisAlignedBox<dimensions>& axisAlignedBox);
void draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& transformation, typename SceneGraph::AbstractCamera<dimensions>* camera) override;
void draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& projectionMatrix) override;
private:
Physics::AxisAlignedBox<dimensions>& axisAlignedBox;

5
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<std::uint8_t dimensions> BoxRenderer<dimensions>::BoxRenderer(Physics::Box<dimensions>& box): box(box) {}
template<std::uint8_t dimensions> void BoxRenderer<dimensions>::draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType&, typename SceneGraph::AbstractCamera<dimensions>* camera) {
this->shader->setTransformationProjectionMatrix(camera->projectionMatrix()*camera->cameraMatrix()*box.transformedTransformation()*
template<std::uint8_t dimensions> void BoxRenderer<dimensions>::draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& projectionMatrix) {
this->shader->setTransformationProjectionMatrix(projectionMatrix*box.transformedTransformation()*
DimensionTraits<dimensions>::MatrixType::scaling(typename DimensionTraits<dimensions>::VectorType(0.5f)))
->setColor(options->color())
->use();

2
src/DebugTools/Implementation/BoxRenderer.h

@ -27,7 +27,7 @@ template<std::uint8_t dimensions> class BoxRenderer: public AbstractBoxRenderer<
public:
BoxRenderer(Physics::Box<dimensions>& box);
void draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& transformation, typename SceneGraph::AbstractCamera<dimensions>* camera) override;
void draw(Resource<ShapeRendererOptions>& options, const typename DimensionTraits<dimensions>::MatrixType& projectionMatrix) override;
private:
Physics::Box<dimensions>& box;

6
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<std::uint8_t dimensions> ShapeRenderer<dimensions>::~ShapeRenderer() {
for(auto i: renderers) delete i;
}
template<std::uint8_t dimensions> void ShapeRenderer<dimensions>::draw(const typename DimensionTraits<dimensions>::MatrixType& transformationMatrix, SceneGraph::AbstractCamera<dimensions>* camera) {
for(auto i: renderers) i->draw(options, transformationMatrix, camera);
template<std::uint8_t dimensions> void ShapeRenderer<dimensions>::draw(const typename DimensionTraits<dimensions>::MatrixType&, SceneGraph::AbstractCamera<dimensions>* camera) {
typename DimensionTraits<dimensions>::MatrixType projectionMatrix = camera->projectionMatrix()*camera->cameraMatrix();
for(auto i: renderers) i->draw(options, projectionMatrix);
}
template class ShapeRenderer<2>;

Loading…
Cancel
Save