#ifndef _H_RENDERER_H #define _H_RENDERER_H #include #include #include #include #include #include #include "graphics/quad.h" #include "graphics/postprocess.h" class ResourceManager; class Shader; enum class RenderLayer { Background, Map, GameObjects, Effects, HUD, Menu }; using UniformValue = std::variant< int, bool, float, double, glm::mat4, glm::vec2 >; struct Uniform { std::string name; UniformValue value; }; class Drawable { public: virtual void draw() = 0; const unsigned getShaderID() const { return shaderID; } const std::vector& getUniforms() { return uniforms; } const std::vector& getOneShotUniforms() { return oneShotUniforms; } void clearOneShot() { oneShotUniforms.clear(); } void clearUniforms() { uniforms.clear(); } protected: unsigned shaderID; template void editUniform(const std::string& name, T value) { uniforms.emplace_back(Uniform {name, value}); } template void editUniformOnce(const std::string& name, T value) { oneShotUniforms.emplace_back(Uniform {name, value}); } private: std::vector uniforms; std::vector oneShotUniforms; }; 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, std::shared_ptr drawable); void removeDrawable(RenderLayer renderLayer, std::shared_ptr 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); glm::mat4 projMat; glm::mat4 viewMat; union FrameBuffer { unsigned int frame; unsigned int texture; }worldBuffer, hudBuffer; std::unique_ptr screenQuad; std::shared_ptr resourceManager; void initFrameBuffers(); std::unique_ptr postProcessor; void sortLayerPool(auto& layerPool); void renderPool(auto& layerPool); }; #endif