#ifndef _H_RENDERER_H #define _H_RENDERER_H #include #include #include #include #include "graphics/drawable.h" #include "graphics/glwindow.h" #include "graphics/postprocess.h" #include "graphics/quad.h" class ResourceManager; class Shader; enum class RenderLayer { Background, Map, GameObjects, Effects, HUD, Menu }; class Renderer { public: Renderer(const std::shared_ptr &, const std::shared_ptr &); void clear(); void hookEventManager(const std::weak_ptr eventManager); void setProjAndViewMatrix(const glm::mat4 &proj, const glm::mat4 &view); void addDrawable(RenderLayer renderLayer, Drawable *drawable); void removeDrawable(RenderLayer renderLayer, Drawable *drawable); void render(); private: std::unordered_map> worldLayerPool; std::unordered_map> HUDLayerPool; std::vector renderingOrder = { RenderLayer::Background, RenderLayer::Map, RenderLayer::GameObjects, RenderLayer::Effects, RenderLayer::HUD, RenderLayer::Menu}; void uploadUniforms(const unsigned shaderID, const std::vector &uniforms); unsigned uboMatrices; union FrameBuffer { unsigned int frame; unsigned int texture; } worldBuffer, hudBuffer; std::unique_ptr screenQuad; std::shared_ptr resourceManager; std::shared_ptr glWindow; void initFrameBuffers(); void initUniformBuffers(); std::unique_ptr postProcessor; void sortLayerPool(auto &layerPool); void renderPool(auto &layerPool); }; #endif