diff --git a/includes/RT/Object.hpp b/includes/RT/Object.hpp index 1bb5ad4..9e94d89 100644 --- a/includes/RT/Object.hpp +++ b/includes/RT/Object.hpp @@ -25,15 +25,15 @@ typedef struct s_Material class Object { protected: - glm::vec3 _position; - Material _material; + glm::vec3 _position; + const Material *_material; public: - Object(const glm::vec3& position, const Material& material) : _position(position), _material(material) {} + Object(const glm::vec3& position, const Material *material) : _position(position), _material(material) {} virtual ~Object() = default; - const glm::vec3& getPosition() const { return (_position); } - const Material& getMaterial() const { return (_material); } + const glm::vec3 &getPosition() const { return (_position); } + const Material *getMaterial() const { return (_material); } enum class Type { SPHERE, diff --git a/includes/RT/Scene.hpp b/includes/RT/Scene.hpp index bdeaea9..ca134af 100644 --- a/includes/RT/Scene.hpp +++ b/includes/RT/Scene.hpp @@ -37,13 +37,13 @@ class Scene ~Scene(); Camera *getCamera(void) const; - void addObject(std::unique_ptr object); + void addObject(Object *object); void updateGPUData(); const std::vector& getGPUData() const; private: - std::vector> _objects; + std::vector _objects; std::vector _gpuObjects; Camera *_camera; diff --git a/includes/RT/objects/Sphere.hpp b/includes/RT/objects/Sphere.hpp index b248392..28d5d4e 100644 --- a/includes/RT/objects/Sphere.hpp +++ b/includes/RT/objects/Sphere.hpp @@ -18,7 +18,7 @@ class Sphere : public Object { public: - Sphere(const glm::vec3& position, float radius, const Material& material) + Sphere(const glm::vec3& position, float radius, const Material *material) : Object(position, material), _radius(radius) {} float getRadius() const { return (_radius); } diff --git a/srcs/RT.cpp b/srcs/RT.cpp index 4d65757..49d85dc 100644 --- a/srcs/RT.cpp +++ b/srcs/RT.cpp @@ -30,7 +30,7 @@ int main(void) glm::vec3 position(x, y, z); float sphereSize = 0.8f + 0.4f * sin(angle * 2.0f); - window.getScene()->addObject(std::make_unique(position, sphereSize, redMaterial)); + window.getScene()->addObject(new Sphere(position, sphereSize, &redMaterial)); } GLuint objectSSBO; @@ -48,7 +48,9 @@ int main(void) glUseProgram(shader.getProgramCompute()); const std::vector &gpu_data = window.getScene()->getGPUData(); - + + window.getScene()->updateGPUData(); + // Update SSBO with latest object data glBindBuffer(GL_SHADER_STORAGE_BUFFER, objectSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, gpu_data.size() * sizeof(GPUObject), gpu_data.data(), GL_DYNAMIC_DRAW); diff --git a/srcs/class/Scene.cpp b/srcs/class/Scene.cpp index 0a0a2b4..d692a59 100644 --- a/srcs/class/Scene.cpp +++ b/srcs/class/Scene.cpp @@ -27,9 +27,9 @@ Camera *Scene::getCamera(void) const return (_camera); } -void Scene::addObject(std::unique_ptr object) +void Scene::addObject(Object *object) { - _objects.push_back(std::move(object)); + _objects.push_back(object); this->updateGPUData(); } @@ -41,13 +41,13 @@ void Scene::updateGPUData() { GPUObject gpuObj; gpuObj.position = obj->getPosition(); - gpuObj.color = obj->getMaterial().color; - gpuObj.roughness = obj->getMaterial().roughness; - gpuObj.specular = obj->getMaterial().specular; + gpuObj.color = obj->getMaterial()->color; + gpuObj.roughness = obj->getMaterial()->roughness; + gpuObj.specular = obj->getMaterial()->specular; gpuObj.type = static_cast(obj->getType()); if (obj->getType() == Object::Type::SPHERE) { - auto sphere = static_cast(obj.get()); + auto sphere = static_cast(obj); gpuObj.radius = sphere->getRadius(); }