#ifndef _H_RENDERER_H #define _H_RENDERER_H #include #include #include #include #include #include class ResourceManager; 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 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>> layerPool; 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; std::shared_ptr resourceManager; }; #endif