1
0
Fork 0

Renderer2D: reverse the relationship between Renderer2D and Renderable.

Pass Renderer2D to Renderable and have each subclass of Renderable decide what the Renderer should do (like drawText(), drawRect() etc).

This makes the Renderable more flexible. right now, each renderable has a texture, vertices and indices. but what if some renderables does not use textures? or more than one? What if some renderables are just a group of other renderables? (Scene Graph's).

If we instead just make Renderables implement render(Renderer2D& r) interface. we can make each renderable pass the data it holds to the renderer without a hard defined interface.
This commit is contained in:
Henrik Hautakoski 2016-06-18 13:25:58 +02:00
parent b2dbee33fb
commit 84ffd0189e
8 changed files with 32 additions and 2 deletions

View file

@ -29,6 +29,9 @@ public :
void submit(const Renderable2D& renderable);
// Drawing
virtual void draw(const Renderable2D* renderable);
void render();
protected :

View file

@ -8,6 +8,7 @@
#include <Spectre/Math/Vector2.h>
#include <vector>
class Renderer2D;
class ShaderProgram;
class Texture;
@ -31,6 +32,8 @@ public :
virtual const Texture* getTexture() const { return NULL; };
virtual const RenderType getRenderType() const = 0;
virtual void render(Renderer2D& renderer) const = 0;
};
#endif /* SPECTRE_GRAPHCIS_RENDERABLE_H */

View file

@ -18,6 +18,9 @@ public :
virtual void submit(const Renderable2D& renderable) = 0;
// Drawing.
virtual void draw(const Renderable2D* renderable) = 0;
virtual void render() = 0;
protected :

View file

@ -33,6 +33,8 @@ public :
virtual const RenderType getRenderType() const { return RenderType_Scene; };
virtual void render(Renderer2D& renderer) const;
protected :
void updateGeometry();

View file

@ -60,6 +60,8 @@ public :
virtual const Texture* getTexture() const;
void render(Renderer2D& renderer) const;
private :
void updateGeometry() const;

View file

@ -104,7 +104,12 @@ void BatchRenderer2D::end()
void BatchRenderer2D::submit(const Renderable2D& renderable)
{
m_queue.push_back(&renderable);
renderable.render(*this);
}
void BatchRenderer2D::draw(const Renderable2D* renderable)
{
m_queue.push_back(renderable);
}
void BatchRenderer2D::render()
@ -126,7 +131,7 @@ void BatchRenderer2D::render()
// Setup position.
glEnableVertexAttribArray(VertexAttribPosition);
glVertexAttribPointer(VertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), (void*) 0);
// Setup color
glEnableVertexAttribArray(VertexAttribColor0);

View file

@ -1,4 +1,5 @@
#include <Spectre/Graphics/Renderer2D.h>
#include <Spectre/Graphics/Texture.h>
#include <Spectre/Graphics/Sprite.h>
@ -108,4 +109,9 @@ const std::vector<unsigned short>& Sprite::getIndices() const
void Sprite::updateGeometry()
{
}
void Sprite::render(Renderer2D& renderer) const
{
renderer.draw(this);
}

View file

@ -1,5 +1,6 @@
#include <Spectre/Math/Vector4.h>
#include <Spectre/Graphics/Renderer2D.h>
#include <Spectre/Graphics/Text.h>
Text::Text() :
@ -167,4 +168,9 @@ void Text::updateGeometry() const
int x = 0;
}
void Text::render(Renderer2D& renderer) const
{
renderer.draw(this);
}