← Back to file list Raw

src/COpenGL430Renderer.h

#pragma once
#include "CRendererBase.h"
#include "GL/glew.h"
#include "CGL430Material.h"
#include "CGL430SSBO.h"
#include <vector>
#include <mutex>
#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<CDrawable> CreateAnimatedDrawable() const override;
//std::shared_ptr<CDrawable> 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<CCamera> camera) override;
void DrawModel(std::shared_ptr<CModelBase> 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<CGL430Material*> m_Materials;
std::vector<CGL430Material*> m_PendingMaterials;
mutable std::mutex m_MaterialMutex;
std::vector<CGL430Material*> m_materialsToUpload;
};