#pragma once #include #include #include #include #include #include "shader.hpp" #include "model.hpp" #include "shader.hpp" #include "model.hpp" #include "camera.hpp" #include "components.hpp" #include "framebuffer.hpp" #include #include struct Thing { std::string name; Model& model; Material& material; components::Position position; components::Rotation rotation; float scale; float distance = 0; }; struct Scene { Shader shader; Screen screen; FrameBuffer framebuffer; std::unordered_map materials; Camera camera; components::Lighting light; std::unordered_map models; std::vector things; float deltaTime = 0.0f; float lastFrame = 0.0f; Scene(components::Scene& config): shader{config.shader.vertex_path, config.shader.frag_path}, screen{.shader={config.screen_shader.vertex_path, config.screen_shader.frag_path}}, materials{config.materials}, camera{ .position=config.camera.position, .front=config.camera.front, .up=config.camera.up, .direction=config.camera.direction, .movement_speed=config.camera.movement_speed, }, light{config.light} { for(auto& [name, model] : config.models) { models.try_emplace(name, model.directory, model.model_path); } for(auto& thing : config.things) { things.emplace_back( thing.model, models.at(thing.model), materials.at(thing.material), thing.position, thing.rotation, thing.scale); } shader.use(); shader.setInt("texture1", 0); shader.apply_lighting(light); framebuffer.init(); screen.init(); } void update(); void draw_thing(Shader& with_shader, Thing& thing); void render(GLFWwindow* window); void cleanup(); void spawn(const std::string& name, components::Position& position, components::Rotation& rotation); };