hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine/engine.cpp10
-rw-r--r--src/engine/engine.h17
-rw-r--r--src/states/simulation_state.cpp26
3 files changed, 46 insertions, 7 deletions
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<float>(m_sag_a.m_rs * 2.2);
float r2 = static_cast<float>(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<float>(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<float>(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<Donut::Object>& 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();