From 2c8002d30f291cba832a5750212009d48238c308 Mon Sep 17 00:00:00 2001 From: hachem Date: Fri, 22 Aug 2025 12:24:05 +0200 Subject: feat: add HDRI --- src/engine/engine.cpp | 20 +++++++++++++++++++- src/engine/engine.h | 28 ++++++++++++++++------------ 2 files changed, 35 insertions(+), 13 deletions(-) (limited to 'src/engine') diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 9a88e9e..451684b 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -10,6 +10,7 @@ #include "engine.h" #include "core/log.h" +#include "core/hdri_manager.h" #include "rendering/vertex_buffer.h" #include "rendering/index_buffer.h" @@ -36,6 +37,16 @@ namespace Donut m_compute_program = create_compute_program("assets/shaders/geodesic.glsl"); m_blur_shader = Ref(Shader::create("assets/shaders/blur.glsl")); + auto& hdri_manager = HDRIManager::get(); + m_hdri_environment = hdri_manager.get_current_hdri(); + if (!m_hdri_environment) + { + hdri_manager.set_current_hdri("assets/hdri/hdr_blue_nebulae_1.hdr"); + m_hdri_environment = hdri_manager.get_current_hdri(); + if (!m_hdri_environment) + DONUT_WARN("Failed to load default HDRI, using fallback"); + } + m_camera_ubo = UniformBuffer::create(128, 1); m_disk_ubo = UniformBuffer::create(sizeof(float) * 5, 2); @@ -117,6 +128,9 @@ namespace Donut void Engine::dispatch_compute(const Camera& cam) { + auto& hdri_manager = HDRIManager::get(); + m_hdri_environment = hdri_manager.get_current_hdri(); + int cw = get_compute_width(); int ch = m_compute_height; @@ -128,7 +142,10 @@ namespace Donut upload_objects_ubo(m_objects); upload_simulation_ubo(); m_texture->bind_as_image(0, false); - + + if (m_hdri_environment) + m_hdri_environment->bind(5); + uint32_t groups_x = static_cast(std::ceil(cw / 16.0f)); uint32_t groups_y = static_cast(std::ceil(ch / 16.0f)); m_compute_program->dispatch(groups_x, groups_y, 1); @@ -508,4 +525,5 @@ namespace Donut RenderCommand::set_viewport(0, 0, original_width, original_height); } + } diff --git a/src/engine/engine.h b/src/engine/engine.h index 95cd1f0..88e0058 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -101,30 +101,34 @@ namespace Donut void set_max_steps_static(int steps) { m_max_steps_static = steps; } void set_early_exit_distance(float distance) { m_early_exit_distance = distance; } - float get_disk_thickness() const { return m_disk_thickness; } + float get_disk_thickness() const { return m_disk_thickness; } void set_disk_thickness(float thickness) { m_disk_thickness = thickness; } - float get_disk_density() const { return m_disk_density; } - void set_disk_density(float density) { m_disk_density = density; } + float get_disk_density() const { return m_disk_density; } + void set_disk_density(float density) { m_disk_density = density; } - float get_rotation_speed() const { return m_rotation_speed; } - void set_rotation_speed(float speed) { m_rotation_speed = speed; } + float get_rotation_speed() const { return m_rotation_speed; } + void set_rotation_speed(float speed) { m_rotation_speed = speed; } - float get_blur_strength() const { return m_blur_strength; } - void set_blur_strength(float strength) { m_blur_strength = strength; } + float get_blur_strength() const { return m_blur_strength; } + void set_blur_strength(float strength) { m_blur_strength = strength; } - float get_glow_intensity() const { return m_glow_intensity; } + float get_glow_intensity() const { return m_glow_intensity; } void set_glow_intensity(float intensity) { m_glow_intensity = intensity; } void load_objects_from_scene(const std::vector& objects); void export_high_res_frame(const std::string& filename, int width = 4096, int height = 3072); void print_object_info() const; + + void set_hdri_environment(Ref hdri) { m_hdri_environment = hdri; } + Ref get_hdri_environment() const { return m_hdri_environment; } private: Ref create_compute_program(const char* path); std::pair, Ref> quad_vao(); private: Ref m_quad_vao; Ref m_texture; + Ref m_hdri_environment; Ref m_shader_program; Ref m_compute_program; Ref m_blur_shader; @@ -135,8 +139,8 @@ namespace Donut int m_width; int m_height; - float m_width_f = 100*10e10f; - float m_height_f = 75*10e10f; + float m_width_f = 100.0f*1e10f; + float m_height_f = 75.0f*1e10f; int m_target_fps = 60; float m_current_fps = 60.0f; @@ -150,9 +154,9 @@ namespace Donut int m_max_steps_moving = 60000; int m_max_steps_static = 30000; - float m_early_exit_distance = 5e11f; + float m_early_exit_distance = 5.0e11f; - float m_disk_thickness = 0.1; + float m_disk_thickness = 0.1f; float m_disk_density = 0.1f; float m_rotation_speed = 1.0f; float m_blur_strength = 2.0f; -- cgit v1.3