Files
2026-06-08 17:07:34 -04:00

89 lines
3.1 KiB
C++

#ifndef RENDER_SYSTEM
#define RENDER_SYSTEM
#include <iostream>
#include <vector>
#include <map>
const float skyboxVertices[] = {
-1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f,
1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f
};
class Camera;
class Shader;
class FBO;
class VBO;
class VAO;
class Cubemap;
class Lighting;
class Renderable {
public:
enum ShaderType {
RigShader,
MeshShader,
ImageBoxShader,
BoxShader,
TextShader,
ParticleShader
};
ShaderType shadertype = ShaderType::MeshShader;
bool opaque = true;
bool castshadow = false;
Renderable();
~Renderable();
void BindToRenderSystem();
virtual void Render(Shader& ShaderProgram) {}
virtual glm::vec3 GetWorldPosition() const { return glm::vec3(0.0f); }
};
class RenderSystem {
public:
Lighting* lighting = nullptr;
FBO* screenfbo = nullptr;
FBO* shadowdepthmapfbo = nullptr;
unsigned int depthMaptexture = 0;
unsigned int textureColorbuffer = 0;
unsigned int rbo = 0;
unsigned int SHADOW_RESOLUTION = 0;
VAO* quadVAO = nullptr; VBO* quadVBO = nullptr;
VAO* skyboxVAO = nullptr; VBO* skyboxVBO = nullptr;
Shader* MeshShadowShader = nullptr;
Shader* RigShadowShader = nullptr;
Shader* SkyboxShader = nullptr;
Shader* ScreenShader = nullptr;
Shader* RigShader = nullptr;
Shader* MeshShader = nullptr;
Shader* ImageBoxShader = nullptr;
Shader* BoxShader = nullptr;
Shader* Text2DShader = nullptr;
Shader* ParticleShader = nullptr;
Cubemap* skybox = nullptr;
RenderSystem() {}
void Initialize();
void Render(Camera& camera);
void AddRenderable(Renderable* r) { renderables.push_back(r); }
void RemoveRenderable(Renderable* r) {
for (int i = 0; i < (int)renderables.size(); i++) {
if (renderables[i] == r) { renderables.erase(renderables.begin() + i); return; }
}
std::cout << "didn't find renderable to remove\n";
}
void RenderRenderable(Renderable* renderable, Camera& camera);
std::vector<Renderable*> renderables;
private:
void PrepareRigShader(Camera& camera);
void PrepareMeshShader(Camera& camera);
void PrepareParticleShader(Camera& camera);
void PrepareBoxShader(Camera& camera);
void PrepareImageBoxShader(Camera& camera);
void PrepareTextShader(Camera& camera);
void RenderTranslucent(Camera& camera, const glm::mat4& lightSpaceMatrix, const glm::vec3& camPos);
};
#endif