From 2dd07499241638e66ee0df97cba91219f5599151 Mon Sep 17 00:00:00 2001 From: hachem Date: Fri, 22 Aug 2025 04:31:37 +0200 Subject: feat: volumetric cloud rendering --- src/engine/engine.cpp | 10 +++++----- src/engine/engine.h | 17 +++++++++++++++-- src/states/simulation_state.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 3b5e320..435b3e0 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -36,7 +36,7 @@ namespace Donut m_compute_program = create_compute_program("assets/shaders/geodesic.glsl"); m_camera_ubo = UniformBuffer::create(128, 1); - m_disk_ubo = UniformBuffer::create(sizeof(float) * 4, 2); + m_disk_ubo = UniformBuffer::create(sizeof(float) * 5, 2); uint32_t obj_ubo_size = sizeof(int) + 3 * sizeof(float) + 16 * (sizeof(glm::vec4) + sizeof(glm::vec4)) @@ -177,8 +177,8 @@ namespace Donut float r1 = static_cast(m_sag_a.m_rs * 2.2); float r2 = static_cast(m_sag_a.m_rs * 5.2); float num = 2.0f; - float thickness = 1e9f; - float disk_data[4] = { r1, r2, num, thickness }; + float thickness = static_cast(m_sag_a.m_rs * m_disk_thickness); + float disk_data[5] = { r1, r2, num, thickness, m_disk_density }; m_disk_ubo->set_data(disk_data, sizeof(disk_data)); m_disk_ubo->bind(2); @@ -191,13 +191,13 @@ namespace Donut int max_steps_moving; int max_steps_static; float early_exit_distance; - int padding; + float time; } data; data.max_steps_moving = m_max_steps_moving; data.max_steps_static = m_max_steps_static; data.early_exit_distance = m_early_exit_distance; - data.padding = 0; + data.time = static_cast(glfwGetTime()) * m_rotation_speed; m_simulation_ubo->set_data(&data, sizeof(data)); m_simulation_ubo->bind(4); diff --git a/src/engine/engine.h b/src/engine/engine.h index fab895e..524f1a7 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -100,6 +100,15 @@ 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; } + 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_rotation_speed() const { return m_rotation_speed; } + void set_rotation_speed(float speed) { m_rotation_speed = speed; } + 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; @@ -131,8 +140,12 @@ namespace Donut Camera m_camera; bool m_gravity = false; - int m_max_steps_moving = 60000; - int m_max_steps_static = 30000; + int m_max_steps_moving = 60000; + int m_max_steps_static = 30000; float m_early_exit_distance = 5e11f; + + float m_disk_thickness = 0.1; + float m_disk_density = 1.2f; + float m_rotation_speed = 1.0f; }; }; diff --git a/src/states/simulation_state.cpp b/src/states/simulation_state.cpp index 41f7b36..5c75569 100644 --- a/src/states/simulation_state.cpp +++ b/src/states/simulation_state.cpp @@ -220,6 +220,32 @@ namespace Donut ImGui::Spacing(); + ImGui::TextColored(ImVec4(0.9f, 0.9f, 1.0f, 1.0f), "Accretion Disk"); + ImGui::Separator(); + + float disk_thickness = engine.get_disk_thickness(); + if (ImGui::SliderFloat("Cloud Thickness", &disk_thickness, 0.1f, 2.0f, "%.2f")) + { + engine.set_disk_thickness(disk_thickness); + } + ImGui::TextDisabled("Thickness relative to Schwarzschild radius"); + + float disk_density = engine.get_disk_density(); + if (ImGui::SliderFloat("Cloud Density", &disk_density, 0.1f, 3.0f, "%.2f")) + { + engine.set_disk_density(disk_density); + } + ImGui::TextDisabled("Overall density multiplier"); + + float rotation_speed = engine.get_rotation_speed(); + if (ImGui::SliderFloat("Rotation Speed", &rotation_speed, 0.0f, 3.0f, "%.2f")) + { + engine.set_rotation_speed(rotation_speed); + } + ImGui::TextDisabled("Rotation speed multiplier (0 = no rotation)"); + + ImGui::Spacing(); + ImGui::TextColored(ImVec4(0.9f, 0.9f, 1.0f, 1.0f), "Camera"); ImGui::Separator(); -- cgit v1.3