#pragma once #include "CRendererBase.h" #include "GL/glew.h" #include "CGL430Material.h" #include "CGL430SSBO.h" #include #include #include "CDrawable.h" #include "CShaderGL.h" class COpenGL430Renderer : public virtual CRendererBase //TODO COpenGLRendererBase { public: COpenGL430Renderer(); ~COpenGL430Renderer(); void Init(SDL_Window* window) override; size_t GetGenericFlag() const override; void ClearWindow() override; void Display() override; void V_Update() override; std::string GetModelType() const override; std::string GetMaterialType() const override; std::shared_ptr CreateAnimatedDrawable() const override; //std::shared_ptr CreateNonAnimatedDrawable() const override; DEFINE_RENDERER(); SDL_GLContext Context = nullptr; void RegisterMaterial(CGL430Material* material); void UnregisterMaterial(CGL430Material* material); void BindMaterialsSSBO(GLuint binding = 3); void SetupCamera(std::shared_ptr camera) override; void DrawModel(std::shared_ptr model, const CTransform& transform) override; int GetMaterialIndex(CGL430Material* material); CShaderGL S_Default; //TODO temporary private: /*struct alignas(16) CMaterialGPU { alignas(8) glm::uvec2 diffuse; alignas(8) glm::uvec2 specular; alignas(8) glm::uvec2 reflection_map; alignas(4) float shininess; alignas(4) int use_specular_map; alignas(4) float reflectivity; alignas(4) int reflection_type; };*/ #pragma pack(push, 1) struct CMaterialGPU { glm::uvec2 diffuse; //8 glm::uvec2 specular; //8 glm::uvec2 reflection_map; //8 float shininess; //4 int use_specular_map; //4 float reflectivity; //4 int reflection_type; //4 }; //8 + 8 + 8 + 4 + 4 + 4 + 4 = 40 bytes #pragma pack(pop) int GetFreeMaterialIndex(); void ReuploadMaterial(CGL430Material* material); CMaterialGPU BuildMaterialForGPU(CGL430Material* material); SDL_Window* Window = nullptr; //don't destroy it in renderer, CWindowManager does that CGL430SSBO m_MaterialsSSBO; std::vector m_Materials; std::vector m_PendingMaterials; mutable std::mutex m_MaterialMutex; std::vector m_materialsToUpload; };