aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2025-08-22 04:31:37 +0200
committerhachem <im@hachem.wtf>2025-08-22 04:31:37 +0200
commitf469a1d1e8413e07f3e3033e719161ffd17fe463 (patch)
tree7cae9d4df3ee1fa7e16e9db5ca926c3527e549b9 /src
parent01fadbecbed89afffb18b2cf5cf3972845a7a169 (diff)
[add]: volumetric cloud rendering
Diffstat (limited to 'src')
-rw-r--r--src/Engine/Engine.cpp12
-rw-r--r--src/Engine/Engine.h17
-rw-r--r--src/States/SimulationState.cpp26
3 files changed, 47 insertions, 8 deletions
diff --git a/src/Engine/Engine.cpp b/src/Engine/Engine.cpp
index 245f6fd..37cafd8 100644
--- a/src/Engine/Engine.cpp
+++ b/src/Engine/Engine.cpp
@@ -36,14 +36,14 @@ namespace Donut
m_ComputeProgram = CreateComputeProgram("Assets/Shaders/Geodesic.glsl");
m_CameraUBO = UniformBuffer::Create(128, 1);
- m_DiskUBO = UniformBuffer::Create(sizeof(float) * 4, 2);
+ m_DiskUBO = UniformBuffer::Create(sizeof(float) * 5, 2); // Added density parameter
uint32_t objUBOSize = sizeof(int) + 3 * sizeof(float)
+ 16 * (sizeof(glm::vec4) + sizeof(glm::vec4))
+ 16 * sizeof(float);
m_ObjectsUBO = UniformBuffer::Create(objUBOSize, 3);
- m_SimulationUBO = UniformBuffer::Create(sizeof(int) * 2 + sizeof(float) * 2, 4);
+ m_SimulationUBO = UniformBuffer::Create(sizeof(int) * 2 + sizeof(float) * 2, 4); // time added to existing float
auto result = QuadVAO();
m_QuadVAO = result.first;
@@ -177,8 +177,8 @@ namespace Donut
float r1 = static_cast<float>(m_SagA.m_Rs * 2.2);
float r2 = static_cast<float>(m_SagA.m_Rs * 5.2);
float num = 2.0f;
- float thickness = 1e9f;
- float diskData[4] = { r1, r2, num, thickness };
+ float thickness = static_cast<float>(m_SagA.m_Rs * m_DiskThickness);
+ float diskData[5] = { r1, r2, num, thickness, m_DiskDensity };
m_DiskUBO->SetData(diskData, sizeof(diskData));
m_DiskUBO->Bind(2);
@@ -191,13 +191,13 @@ namespace Donut
int maxStepsMoving;
int maxStepsStatic;
float earlyExitDistance;
- int padding;
+ float time;
} data;
data.maxStepsMoving = m_MaxStepsMoving;
data.maxStepsStatic = m_MaxStepsStatic;
data.earlyExitDistance = m_EarlyExitDistance;
- data.padding = 0;
+ data.time = static_cast<float>(glfwGetTime()) * m_RotationSpeed;
m_SimulationUBO->SetData(&data, sizeof(data));
m_SimulationUBO->Bind(4);
diff --git a/src/Engine/Engine.h b/src/Engine/Engine.h
index 328435a..a0b25b5 100644
--- a/src/Engine/Engine.h
+++ b/src/Engine/Engine.h
@@ -100,6 +100,15 @@ namespace Donut
void SetMaxStepsStatic(int steps) { m_MaxStepsStatic = steps; }
void SetEarlyExitDistance(float distance) { m_EarlyExitDistance = distance; }
+ float GetDiskThickness() const { return m_DiskThickness; }
+ void SetDiskThickness(float thickness) { m_DiskThickness = thickness; }
+
+ float GetDiskDensity() const { return m_DiskDensity; }
+ void SetDiskDensity(float density) { m_DiskDensity = density; }
+
+ float GetRotationSpeed() const { return m_RotationSpeed; }
+ void SetRotationSpeed(float speed) { m_RotationSpeed = speed; }
+
void LoadObjectsFromScene(const std::vector<Donut::Object>& objects);
void ExportHighResFrame(const std::string& filename, int width = 4096, int height = 3072);
void PrintObjectInfo() const;
@@ -131,8 +140,12 @@ namespace Donut
Camera m_Camera;
bool m_Gravity = false;
- int m_MaxStepsMoving = 60000;
- int m_MaxStepsStatic = 30000;
+ int m_MaxStepsMoving = 60000;
+ int m_MaxStepsStatic = 30000;
float m_EarlyExitDistance = 5e11f;
+
+ float m_DiskThickness = 0.1;
+ float m_DiskDensity = 1.2f;
+ float m_RotationSpeed = 1.0f;
};
};
diff --git a/src/States/SimulationState.cpp b/src/States/SimulationState.cpp
index d961f9e..28504e6 100644
--- a/src/States/SimulationState.cpp
+++ b/src/States/SimulationState.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 diskThickness = engine.GetDiskThickness();
+ if (ImGui::SliderFloat("Cloud Thickness", &diskThickness, 0.1f, 2.0f, "%.2f"))
+ {
+ engine.SetDiskThickness(diskThickness);
+ }
+ ImGui::TextDisabled("Thickness relative to Schwarzschild radius");
+
+ float diskDensity = engine.GetDiskDensity();
+ if (ImGui::SliderFloat("Cloud Density", &diskDensity, 0.1f, 3.0f, "%.2f"))
+ {
+ engine.SetDiskDensity(diskDensity);
+ }
+ ImGui::TextDisabled("Overall density multiplier");
+
+ float rotationSpeed = engine.GetRotationSpeed();
+ if (ImGui::SliderFloat("Rotation Speed", &rotationSpeed, 0.0f, 3.0f, "%.2f"))
+ {
+ engine.SetRotationSpeed(rotationSpeed);
+ }
+ ImGui::TextDisabled("Rotation speed multiplier (0 = no rotation)");
+
+ ImGui::Spacing();
+
ImGui::TextColored(ImVec4(0.9f, 0.9f, 1.0f, 1.0f), "Camera");
ImGui::Separator();