#ifndef _H_RENDERER_H #define _H_RENDERER_H #include #include #include #include #include "graphics/quad.h" #include "graphics/drawable.h" #include "graphics/postprocess.h" class ResourceManager; class Shader; enum class RenderLayer { Background, Map, GameObjects, Effects, HUD, Menu }; class Renderer { public: Renderer(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; void initFrameBuffers(); void initUniformBuffers(); std::unique_ptr postProcessor; void sortLayerPool(auto& layerPool); void renderPool(auto& layerPool); }; #endif