/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* Scene.hpp :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/23 18:30:18 by ycontre #+# #+# */ /* Updated: 2025/02/25 01:44:31 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ #pragma once # include "RT.hpp" struct GPUObject { glm::mat4 transform; alignas(16) glm::vec3 position; alignas(16) glm::vec3 normal; // plane triangle alignas(16) glm::vec3 vertex1;//quad triangle alignas(16) glm::vec3 vertex2;//quad triangle float radius; // sphere int mat_index; int type; }; struct GPUTriangle { alignas(16) glm::vec3 position; alignas(16) glm::vec3 vertex1; alignas(16) glm::vec3 vertex2; alignas(16) glm::vec3 normal; alignas(8) glm::vec2 texture_vertex1; alignas(8) glm::vec2 texture_vertex2; alignas(8) glm::vec2 texture_vertex3; int mat_index; }; struct GPUMaterial { alignas(16) glm::vec3 color; float emission; float roughness; float metallic; float refraction; int type; int texture_index; int emission_texture_index; }; struct GPUVolume { alignas(16) glm::vec3 sigma_a; alignas(16) glm::vec3 sigma_s; alignas(16) glm::vec3 sigma_t; float g; int enabled; }; struct GPUDebug { int enabled; int mode; int triangle_treshold; int box_treshold; }; struct GPUBvh { alignas(16) glm::vec3 min; alignas(16) glm::vec3 max; int index; int primitive_count; }; struct GPUBvhData { glm::mat4 transform; glm::mat4 inv_transform; alignas(16) glm::vec3 offset; float scale; int bvh_start_index; int triangle_start_index; }; class Sphere; class Camera; class Scene { public: Scene(std::string &name); ~Scene(); void addObject(Object *object); void addMaterial(Material *material); void addTexture(std::string path); void addEmissionTexture(std::string path); bool loadTextures(); void updateLightAndObjects(int mat_id); std::set getGPULights(); void addBvh(std::vector &triangles, glm::vec3 offset, float scale, glm::mat4 transform); const std::vector &getObjectData() const; const std::vector &getTriangleData() const; std::vector &getMaterialData(); std::vector &getTextureIDs(); std::vector &getEmissionTextureIDs(); std::vector &getTextures(); std::vector &getEmissionTextures(); std::vector &getBvhData(); std::vector &getBvh(); GPUVolume &getVolume(); GPUDebug &getDebug(); GPUDenoise &getDenoise(); Camera *getCamera(void) const; GPUMaterial getMaterial(int material_index); bool fail(void) const; private: bool _fail; std::vector _gpu_bvh_data; std::vector _gpu_bvh; std::vector _gpu_objects; std::vector _gpu_triangles; std::vector _gpu_materials; std::vector _textures; std::vector _emissive_textures; std::vector _gpu_textures; std::vector _gpu_emissive_textures; std::set _gpu_lights; GPUVolume _gpu_volume; GPUDebug _gpu_debug; GPUDenoise _gpu_denoise; Camera *_camera; };