Skip to content
Snippets Groups Projects
Commit f9ada3d1 authored by BATON Theau's avatar BATON Theau
Browse files

Replace current rendering method by Type Erasure

parent 30b9fe9b
No related branches found
No related tags found
No related merge requests found
Showing
with 240 additions and 47 deletions
...@@ -20,3 +20,6 @@ Release Mode : ...@@ -20,3 +20,6 @@ Release Mode :
```shell ```shell
cmake --build ./build --config Release cmake --build ./build --config Release
``` ```
## Source
Type Erasure Inspiration : [Type Erasure - CppCon 2021 - Klaus Iglberger](https://www.youtube.com/watch?v=4eeESJQk-mw&ab_channel=CppCon)
\ No newline at end of file
#pragma once #pragma once
#include <any>
#include <engine/graphics/back/buffers/VertexArray.hpp> #include <engine/graphics/back/buffers/VertexArray.hpp>
#include <engine/graphics/back/buffers/VerticeBuffer.hpp> #include <engine/graphics/back/buffers/VerticeBuffer.hpp>
#include <engine/graphics/back/shaders/Program.hpp> #include <engine/graphics/back/shaders/Program.hpp>
...@@ -8,12 +10,12 @@ ...@@ -8,12 +10,12 @@
#include <engine/graphics/utility/module.hpp> #include <engine/graphics/utility/module.hpp>
namespace megu { namespace megu {
class Image_Module : public Module<Image> { class FrameBuffer_Module : public Module<std::any> {
public: public:
Image_Module(); FrameBuffer_Module();
~Image_Module() = default; ~FrameBuffer_Module() = default;
void render(const Window &, const Camera &, Image &, const TextureArray &) override; void render(const Window &, const Camera &, std::any &, const TextureArray &) override;
private: private:
VertexArray _vao; VertexArray _vao;
......
#include "ImageModule.hpp" #include "ImageModule.hpp"
#include <engine/graphics/front/object/Image.hpp>
#include <engine/graphics/utility/array_generator.hpp> #include <engine/graphics/utility/array_generator.hpp>
namespace megu { namespace megu {
Image_Module::Image_Module() ImageModule::ImageModule()
: _vbo(this->_vao, Quads::Layout(), Quads::Vertices().size(), megu::EditMode::STATIC) { : _vbo(this->_vao, Quads::Layout(), Quads::Vertices().size(), megu::EditMode::STATIC) {
Source vert("assets/shaders/Image-Instanced-Fat.vert", Source::Categorie::VERTEX); Source vert("assets/shaders/Image-Instanced-Fat.vert", Source::Categorie::VERTEX);
this->_program.attach(vert); this->_program.attach(vert);
...@@ -19,26 +20,7 @@ namespace megu { ...@@ -19,26 +20,7 @@ namespace megu {
frag.release(); frag.release();
} }
void Image_Module::render(const Window &, const Camera & camera, Image & image, const TextureArray &) { void ImageModule::render(Image & image) {
this->_vao.bind(); std::cout << "Image !" << std::endl;
this->_program.use();
image.texture().bind();
this->_program.setUniform("uProj", camera.projection());
this->_program.setUniform("uView", camera.view());
static auto uSampler = array_generator<GLint, 32>().array;
this->_program.setUniform("uSampler", uSampler);
std::vector<glm::mat4> uModels;
std::vector<GLint> uTextures;
uModels.push_back(image.transformation().model());
uTextures.push_back(0);
this->_program.setUniform("uModel", uModels);
this->_program.setUniform("uTextures", uTextures);
glDrawArraysInstanced(Quads::Primitive(), 0, static_cast<GLsizei>(this->_vbo.size()), 1);
} }
} }
\ No newline at end of file
#pragma once
#include "QuadGraphicModule.hpp"
#include <engine/graphics/back/buffers/VertexArray.hpp>
#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
#include <engine/graphics/back/shaders/Program.hpp>
namespace megu {
class ImageModule : public virtual QuadGraphicModule {
public:
ImageModule();
~ImageModule() = default;
virtual void render(Image &) override;
private:
VertexArray _vao;
VerticeBuffer _vbo;
Program _program;
};
}
\ No newline at end of file
#include "SpriteModule.hpp"
#include <engine/graphics/utility/array_generator.hpp>
#include <engine/graphics/front/object/Sprite.hpp>
#include <iostream>
namespace megu {
SpriteModule::SpriteModule() {
}
void SpriteModule::render(Sprite & sprite) {
std::cout << "Sprite !" << std::endl;
}
}
\ No newline at end of file
#pragma once
#include "QuadGraphicModule.hpp"
#include <engine/graphics/back/buffers/VertexArray.hpp>
#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
#include <engine/graphics/back/shaders/Program.hpp>
namespace megu {
class SpriteModule : public virtual QuadGraphicModule {
public:
SpriteModule();
~SpriteModule() = default;
virtual void render(Sprite &) override;
};
}
\ No newline at end of file
...@@ -17,9 +17,9 @@ namespace megu { ...@@ -17,9 +17,9 @@ namespace megu {
this->_layers[priority] = std::make_unique<Layer>(renderer); this->_layers[priority] = std::make_unique<Layer>(renderer);
} }
void GraphicEngine::push(Priority layer_priority, Priority object_priority, Renderable & object) { //void GraphicEngine::push(Priority layer_priority, Priority object_priority, GraphicObject & object) {
this->_layers[layer_priority].get()->push(object_priority, object); // this->_layers[layer_priority].get()->push(object_priority, object);
} //}
void GraphicEngine::remove(Priority priority) { void GraphicEngine::remove(Priority priority) {
auto it = this->_layers.find(priority); auto it = this->_layers.find(priority);
...@@ -51,7 +51,7 @@ namespace megu { ...@@ -51,7 +51,7 @@ namespace megu {
glViewport(0, 0, static_cast<GLsizei>(this->_window.width()), static_cast<GLsizei>(this->_window.height())); glViewport(0, 0, static_cast<GLsizei>(this->_window.width()), static_cast<GLsizei>(this->_window.height()));
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
std::any any = 1; std::any any = 1;
this->_module.render(this->_window, this->_view, any, textures); this->_module.render(textures);
this->_window.swapBuffers(); this->_window.swapBuffers();
} }
} }
......
...@@ -17,7 +17,11 @@ namespace megu { ...@@ -17,7 +17,11 @@ namespace megu {
~GraphicEngine() = default; ~GraphicEngine() = default;
void push(Priority, Renderer &); void push(Priority, Renderer &);
void push(Priority, Priority, Renderable &);
template <class T>
void push(Priority layer_priority, Priority object_priority, T & object) {
this->_layers[layer_priority].get()->push<T>(object_priority, object);
}
void remove(Priority); void remove(Priority);
...@@ -31,7 +35,7 @@ namespace megu { ...@@ -31,7 +35,7 @@ namespace megu {
private: private:
std::map<Priority, std::unique_ptr<Layer>> _layers; std::map<Priority, std::unique_ptr<Layer>> _layers;
FrameBuffer_Module _module; FrameBufferModule _module;
Window & _window; Window & _window;
View _view; View _view;
......
...@@ -5,8 +5,4 @@ ...@@ -5,8 +5,4 @@
namespace megu { namespace megu {
Layer::Layer(Renderer & renderer) Layer::Layer(Renderer & renderer)
: _renderer(renderer), _frameBuffer(static_cast<GLuint>(renderer.dimension().x), static_cast<GLuint>(renderer.dimension().y)) {} : _renderer(renderer), _frameBuffer(static_cast<GLuint>(renderer.dimension().x), static_cast<GLuint>(renderer.dimension().y)) {}
void Layer::push(Priority priority, Renderable & object) {
this->_objects[typeid(object)].insert(object);
}
} }
\ No newline at end of file
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
#include <engine/graphics/front/object/Renderable.hpp> #include <engine/graphics/front/object/Renderable.hpp>
#include <engine/graphics/utility/reference_sorter.hpp> #include <engine/graphics/utility/reference_sorter.hpp>
#include <engine/graphics/front/object/Renderable.hpp>
#include <engine/graphics/front/module/QuadGraphicModule.hpp>
#include "Priority.hpp" #include "Priority.hpp"
#include "Renderer.hpp" #include "Renderer.hpp"
...@@ -22,15 +25,15 @@ namespace megu { ...@@ -22,15 +25,15 @@ namespace megu {
inline const Renderer & renderer() const {return this->_renderer;} inline const Renderer & renderer() const {return this->_renderer;}
void push(Priority, Renderable &); template <class T>
void push(Priority priority, T & object) {
this->_objects.insert({priority, Renderable(object, this->_module)});
}
const Texture & draw(const Window & w, const TextureArray & a) { const Texture & draw(const Window & w, const TextureArray & a) {
this->_frameBuffer.bind(); this->_frameBuffer.bind();
for(const auto & [type, objects] : this->_objects) { for(auto & [type, object] : this->_objects) {
if(!objects.empty()) { this->_renderer.render(w, object, a);
//std::cout << typeid((*objects.begin()).get()).name() << std::endl;
this->_renderer.render(w, (*objects.begin()).get(), a);
}
} }
return this->_frameBuffer.texture(); return this->_frameBuffer.texture();
...@@ -39,6 +42,7 @@ namespace megu { ...@@ -39,6 +42,7 @@ namespace megu {
private: private:
Renderer & _renderer; Renderer & _renderer;
FrameBuffer _frameBuffer; FrameBuffer _frameBuffer;
std::map<std::type_index, std::set<std::reference_wrapper<Renderable>>> _objects; QuadGraphicModule _module;
std::map<Priority, Renderable> _objects;
}; };
} }
\ No newline at end of file
...@@ -6,7 +6,11 @@ ...@@ -6,7 +6,11 @@
#include <engine/graphics/back/buffers/FrameBuffer.hpp> #include <engine/graphics/back/buffers/FrameBuffer.hpp>
#include <engine/graphics/back/cameras/View.hpp> #include <engine/graphics/back/cameras/View.hpp>
#include <engine/graphics/front/module/ImageModule.hpp> #include <engine/io/Window.hpp>
#include <engine/graphics/front/object/Renderable.hpp>
#include <engine/graphics/front/engine/TextureArray.hpp>
#include <engine/graphics/front/object/Renderable.hpp>
namespace megu { namespace megu {
class Renderer { class Renderer {
...@@ -17,7 +21,7 @@ namespace megu { ...@@ -17,7 +21,7 @@ namespace megu {
void render(const Window & w, Renderable & r, const TextureArray & a) { void render(const Window & w, Renderable & r, const TextureArray & a) {
this->clear(); this->clear();
r.accept(w, this->_view, this->_module, a); render_ext(r, w, this->_view, a);
} }
const glm::vec2 dimension() const {return this->_view.dimension();} const glm::vec2 dimension() const {return this->_view.dimension();}
...@@ -29,6 +33,5 @@ namespace megu { ...@@ -29,6 +33,5 @@ namespace megu {
private: private:
View _view; View _view;
Image_Module _module;
}; };
} }
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include <engine/graphics/utility/array_generator.hpp> #include <engine/graphics/utility/array_generator.hpp>
namespace megu { namespace megu {
FrameBuffer_Module::FrameBuffer_Module() FrameBufferModule::FrameBufferModule()
: _vbo(this->_vao, Plane::Layout(), Plane::Vertices(), megu::EditMode::STATIC) { : _vbo(this->_vao, Plane::Layout(), Plane::Vertices(), megu::EditMode::STATIC) {
megu::Source vert("assets/shaders/FrameBuffer-Instanced.vert", Source::Categorie::VERTEX); megu::Source vert("assets/shaders/FrameBuffer-Instanced.vert", Source::Categorie::VERTEX);
this->_program.attach(vert); this->_program.attach(vert);
...@@ -18,7 +18,7 @@ namespace megu { ...@@ -18,7 +18,7 @@ namespace megu {
frag.release(); frag.release();
} }
void FrameBuffer_Module::render(const Window & window, const Camera & camera, std::any & any, const TextureArray & textures) { void FrameBufferModule::render(const TextureArray & textures) {
this->_program.use(); this->_program.use();
this->_vao.bind(); this->_vao.bind();
......
...@@ -7,15 +7,16 @@ ...@@ -7,15 +7,16 @@
#include <engine/graphics/back/shaders/Program.hpp> #include <engine/graphics/back/shaders/Program.hpp>
#include <engine/graphics/front/object/Image.hpp> #include <engine/graphics/front/object/Image.hpp>
#include <engine/graphics/utility/module.hpp>
#include "Module.hpp"
namespace megu { namespace megu {
class FrameBuffer_Module : public Module<std::any> { class FrameBufferModule {
public: public:
FrameBuffer_Module(); FrameBufferModule();
~FrameBuffer_Module() = default; ~FrameBufferModule() = default;
void render(const Window &, const Camera &, std::any &, const TextureArray &) override; void render(const TextureArray &);
private: private:
VertexArray _vao; VertexArray _vao;
......
...@@ -2,15 +2,25 @@ ...@@ -2,15 +2,25 @@
#include <engine/graphics/back/cameras/Camera.hpp> #include <engine/graphics/back/cameras/Camera.hpp>
#include <engine/graphics/front/engine/TextureArray.hpp> #include <engine/graphics/front/engine/TextureArray.hpp>
#include <engine/graphics/utility/reference_sorter.hpp>
#include <engine/io/Window.hpp> #include <engine/io/Window.hpp>
namespace megu { namespace megu {
template <class T> template <class T>
class Module { class Module {
public: public:
virtual void render(const Window &, const Camera &, T &, const TextureArray &) = 0; virtual void draw(T &, const Window &, const Camera &, const TextureArray &) const = 0;
}; };
template <class ... Ts> template <class ... Ts>
class Multi_Module : public Module<Ts> ... {}; class Multy_Module : public Module<Ts> ... {};
template <class T>
using ref_set = std::set<std::reference_wrapper<T>, reference_sorter<T>>;
template <class T>
using Module_Array = Module<ref_set<T>>;
template <class ... Ts>
class Multy_Module_Array : public Module_Array<Ts> ... {};
} }
\ No newline at end of file
#include "QuadGraphicModule.hpp"
#include <engine/graphics/front/object/Image.hpp>
#include <engine/graphics/front/object/Sprite.hpp>
#include <iostream>
namespace megu {
void QuadGraphicModule::draw(Image &, const Window &, const Camera &, const TextureArray &) const {
std::cout << "Image !" << std::endl;
}
void QuadGraphicModule::draw(Sprite &, const Window &, const Camera &, const TextureArray &) const {
std::cout << "Sprite !" << std::endl;
}
}
\ No newline at end of file
#pragma once
#include "Module.hpp"
namespace megu {
class Image;
class Sprite;
class QuadGraphicModule : public Module<Image>, public Module<Sprite> {
public:
void draw(Image &, const Window &, const Camera &, const TextureArray &) const override;
void draw(Sprite &, const Window &, const Camera &, const TextureArray &) const override;
};
}
\ No newline at end of file
#pragma once #pragma once
#include "Renderable.hpp"
#include <filesystem> #include <filesystem>
#include <glm/vec2.hpp> #include <glm/vec2.hpp>
#include <engine/graphics/back/geometry/Transformable.hpp> #include <engine/graphics/back/geometry/Transformable.hpp>
#include <engine/graphics/back/textures/Texture.hpp> #include <engine/graphics/back/textures/Texture.hpp>
#include <engine/graphics/front/geometry/Quads.hpp> #include <engine/graphics/front/geometry/Quads.hpp>
#include <engine/graphics/utility/type.hpp> #include <engine/graphics/utility/type.hpp>
namespace megu { namespace megu {
class Image : public Renderable { class Image {
public: public:
Image() = default; Image() = default;
Image(const std::filesystem::path &); Image(const std::filesystem::path &);
......
#pragma once #pragma once
#include <engine/io/Window.hpp> #include <memory>
#include <engine/graphics/utility/module.hpp> #include <iostream>
#include <engine/graphics/front/engine/TextureArray.hpp>
#include <engine/graphics/front/module/Module.hpp>
namespace megu { namespace megu {
class Renderable { class Renderable {
public: public:
template <class T> Renderable() = delete;
void accept(const Window & window, const Camera & camera, Module<T> & modul, const TextureArray & array) {
modul.render(window, camera, *static_cast<T *>(this), array); template <class T, class M>
Renderable(T & object, M & module)
: _pimpl(std::make_unique<RenderableModel<T, M>>(object, module)) {}
Renderable(const Renderable & src) {
this->_pimpl = src._pimpl->clone();
}
Renderable & operator=(const Renderable & src) {
this->_pimpl = src._pimpl->clone();
return *this;
}
Renderable(Renderable &&) = default;
Renderable & operator=(Renderable &&) = default;
private:
struct RenderableConcept {
virtual ~RenderableConcept() {};
virtual void render(const Window &, const Camera &, const TextureArray &) const = 0;
virtual std::unique_ptr<RenderableConcept> clone() const = 0;
};
template <class T, class M>
struct RenderableModel : public RenderableConcept {
RenderableModel(T & v, M & m)
: _object{ v }, _module{ m } {}
void render(const Window & window, const Camera & camera, const TextureArray & array) const override {
this->_module.draw(this->_object, window, camera, array);
}
std::unique_ptr<RenderableConcept> clone() const override {
return std::make_unique<RenderableModel>(*this);
} }
T & _object;
M & _module;
};
friend void render_ext(Renderable & renderable, const Window & window, const Camera & camera, const TextureArray & array) {
renderable._pimpl->render(window, camera, array);
}
std::unique_ptr<RenderableConcept> _pimpl;
}; };
} }
\ No newline at end of file
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include <engine/graphics/back/textures/Texture.hpp> #include <engine/graphics/back/textures/Texture.hpp>
#include <engine/graphics/front/geometry/Quads.hpp> #include <engine/graphics/front/geometry/Quads.hpp>
namespace megu { namespace megu {
class Sprite { class Sprite {
public: public:
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include <engine/graphics/back/geometry/Transformable.hpp> #include <engine/graphics/back/geometry/Transformable.hpp>
#include <engine/graphics/back/textures/Texture.hpp> #include <engine/graphics/back/textures/Texture.hpp>
#include <engine/graphics/front/geometry/Quads.hpp> #include <engine/graphics/front/geometry/Quads.hpp>
#include <engine/graphics/front/geometry/Vertex.hpp> #include <engine/graphics/front/geometry/Vertex.hpp>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment