hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine/engine.cpp22
-rw-r--r--src/engine/engine.h15
-rw-r--r--src/states/simulation_state.cpp13
3 files changed, 49 insertions, 1 deletions
diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp
index c2a84a8..c9a23ca 100644
--- a/src/engine/engine.cpp
+++ b/src/engine/engine.cpp
@@ -39,6 +39,8 @@ namespace Donut
+ 16 * (sizeof(glm::vec4) + sizeof(glm::vec4))
+ 16 * sizeof(float);
m_objects_ubo = UniformBuffer::create(obj_ubo_size, 3);
+
+ m_simulation_ubo = UniformBuffer::create(sizeof(int) * 2 + sizeof(float) * 2, 4);
auto result = quad_vao();
m_quad_vao = result.first;
@@ -97,6 +99,7 @@ namespace Donut
upload_camera_ubo(cam);
upload_disk_ubo();
upload_objects_ubo(m_objects);
+ upload_simulation_ubo();
m_texture->bind_as_image(0, false);
uint32_t groups_x = static_cast<uint32_t>(std::ceil(cw / 16.0f));
@@ -173,6 +176,25 @@ namespace Donut
m_disk_ubo->bind(2);
}
+ void Engine::upload_simulation_ubo()
+ {
+ struct UBOData
+ {
+ int max_steps_moving;
+ int max_steps_static;
+ float early_exit_distance;
+ int padding;
+ } 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;
+
+ m_simulation_ubo->set_data(&data, sizeof(data));
+ m_simulation_ubo->bind(4);
+ }
+
void Engine::update_physics(float delta_time)
{
for (auto& obj : m_objects)
diff --git a/src/engine/engine.h b/src/engine/engine.h
index 39791c1..0d0fb1b 100644
--- a/src/engine/engine.h
+++ b/src/engine/engine.h
@@ -73,6 +73,7 @@ namespace Donut
void upload_camera_ubo(const Camera& cam);
void upload_objects_ubo(const std::vector<ObjectData>& objs);
void upload_disk_ubo();
+ void upload_simulation_ubo();
void render_scene();
void update_physics(float delta_time);
void update_window_dimensions();
@@ -93,6 +94,13 @@ namespace Donut
int get_compute_height() const { return m_compute_height; }
int get_compute_width() const { return (m_width * m_compute_height) / m_height; }
void update_compute_dimensions();
+
+ int get_max_steps_moving() const { return m_max_steps_moving; }
+ int get_max_steps_static() const { return m_max_steps_static; }
+ float get_early_exit_distance() const { return m_early_exit_distance; }
+ void set_max_steps_moving(int steps) { m_max_steps_moving = steps; }
+ void set_max_steps_static(int steps) { m_max_steps_static = steps; }
+ void set_early_exit_distance(float distance) { m_early_exit_distance = distance; }
private:
Ref<Shader> create_compute_program(const char* path);
std::pair<Ref<VertexArray>, Ref<Texture2D>> quad_vao();
@@ -104,6 +112,7 @@ namespace Donut
Ref<UniformBuffer> m_camera_ubo;
Ref<UniformBuffer> m_disk_ubo;
Ref<UniformBuffer> m_objects_ubo;
+ Ref<UniformBuffer> m_simulation_ubo;
int m_width;
int m_height;
@@ -113,11 +122,15 @@ namespace Donut
int m_target_fps = 60;
float m_current_fps = 60.0f;
float m_last_frame_time = 0.0f;
- int m_compute_height = 320;
+ int m_compute_height = 150;
std::vector<ObjectData> m_objects;
BlackHole m_sag_a;
Camera m_camera;
bool m_gravity = false;
+
+ int m_max_steps_moving = 60000;
+ int m_max_steps_static = 30000;
+ float m_early_exit_distance = 5e11f;
};
};
diff --git a/src/states/simulation_state.cpp b/src/states/simulation_state.cpp
index e59f1fa..ecb2898 100644
--- a/src/states/simulation_state.cpp
+++ b/src/states/simulation_state.cpp
@@ -124,6 +124,19 @@ namespace Donut
ImGui::Separator();
+ ImGui::Text("Simulation Quality:");
+ int max_steps_moving = m_engine.get_max_steps_moving();
+ if (ImGui::SliderInt("Max Steps (Moving)", &max_steps_moving, 1000, 60000))
+ m_engine.set_max_steps_moving(max_steps_moving);
+ int max_steps_static = m_engine.get_max_steps_static();
+ if (ImGui::SliderInt("Max Steps (Static)", &max_steps_static, 1000, 30000))
+ m_engine.set_max_steps_static(max_steps_static);
+ float early_exit_distance = m_engine.get_early_exit_distance();
+ if (ImGui::SliderFloat("Early Exit Distance", &early_exit_distance, 1e11f, 1e13f, "%.2e"))
+ m_engine.set_early_exit_distance(early_exit_distance);
+
+ ImGui::Separator();
+
ImGui::Text("Controls:");
ImGui::Text("Left Mouse: Orbit camera");
ImGui::Text("Scroll: Zoom in/out");