#pragma once #include "Common.h" #include "SceneObject.h" #include "../include/Shaders/Shader.h" #include "../include/Textures/Texture.h" #include "../include/Skybox/Skybox.h" #include // Cube vertex data (position + normal + texcoord) extern float vertices[]; // Primitive generation functions std::vector generateSphere(int segments = 32, int rings = 16); std::vector generateCapsule(int segments = 16, int rings = 8); class Mesh { private: unsigned int VAO, VBO; int vertexCount; public: Mesh(const float* vertexData, size_t dataSizeBytes); ~Mesh(); void draw() const; int getVertexCount() const { return vertexCount; } }; class OBJLoader { public: struct LoadedMesh { std::string path; std::unique_ptr mesh; std::string name; int vertexCount = 0; int faceCount = 0; bool hasNormals = false; bool hasTexCoords = false; glm::vec3 boundsMin = glm::vec3(FLT_MAX); glm::vec3 boundsMax = glm::vec3(-FLT_MAX); }; private: std::vector loadedMeshes; public: int loadOBJ(const std::string& filepath, std::string& errorMsg); Mesh* getMesh(int index); const LoadedMesh* getMeshInfo(int index) const; const std::vector& getAllMeshes() const { return loadedMeshes; } void clear() { loadedMeshes.clear(); } size_t getMeshCount() const { return loadedMeshes.size(); } }; class Camera; class Renderer { private: unsigned int framebuffer = 0, viewportTexture = 0, rbo = 0; int currentWidth = 800, currentHeight = 600; Shader* shader = nullptr; Texture* texture1 = nullptr; Texture* texture2 = nullptr; std::unordered_map> textureCache; Mesh* cubeMesh = nullptr; Mesh* sphereMesh = nullptr; Mesh* capsuleMesh = nullptr; Skybox* skybox = nullptr; void setupFBO(); public: Renderer() = default; ~Renderer(); void initialize(); Texture* getTexture(const std::string& path); void resize(int w, int h); int getWidth() const { return currentWidth; } int getHeight() const { return currentHeight; } void beginRender(const glm::mat4& view, const glm::mat4& proj, const glm::vec3& cameraPos); void renderSkybox(const glm::mat4& view, const glm::mat4& proj); void renderObject(const SceneObject& obj); void renderScene(const Camera& camera, const std::vector& sceneObjects); void endRender(); Skybox* getSkybox() { return skybox; } unsigned int getViewportTexture() const { return viewportTexture; } };