hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/states/simulation_state.cpp
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2025-08-16 22:00:16 +0200
committerhachem <im@hachem.wtf>2025-08-16 22:00:16 +0200
commitdf60b84f65fd5bfd80af2287463714fd0fa4a1a3 (patch)
tree466b027d57d9250684ae66ac6c7ede159130f170 /src/states/simulation_state.cpp
parentf7334b82e8ab8b4a36847d7f9dd2a56f29dd0cbf (diff)
feat: preferences and saving
Diffstat (limited to 'src/states/simulation_state.cpp')
-rw-r--r--src/states/simulation_state.cpp56
1 files changed, 55 insertions, 1 deletions
diff --git a/src/states/simulation_state.cpp b/src/states/simulation_state.cpp
index ff7f658..e71d498 100644
--- a/src/states/simulation_state.cpp
+++ b/src/states/simulation_state.cpp
@@ -3,6 +3,7 @@
#include "core/application.h"
#include "core/window.h"
#include "core/event.h"
+#include "core/settings_manager.h"
#include <imgui.h>
#include <GLFW/glfw3.h>
@@ -12,6 +13,17 @@ namespace Donut
void SimulationState::on_enter()
{
DONUT_INFO("Entering Simulation State");
+
+ const auto& settings = SettingsManager::get_settings_const();
+
+ m_engine.set_target_fps(settings.simulation.target_fps);
+ m_engine.set_compute_height(settings.simulation.compute_height);
+ m_engine.set_max_steps_moving(settings.simulation.max_steps_moving);
+ m_engine.set_max_steps_static(settings.simulation.max_steps_static);
+ m_engine.set_early_exit_distance(settings.simulation.early_exit_distance);
+ m_engine.get_gravity() = settings.simulation.gravity_enabled;
+
+ m_engine.update_compute_dimensions();
m_initialized = true;
}
@@ -92,8 +104,22 @@ namespace Donut
ImGui::Begin("Simulation Controls", nullptr, ImGuiWindowFlags_NoCollapse);
ImGui::TextColored(ImVec4(0.8f, 0.8f, 1.0f, 1.0f), "Black Hole Simulation");
+ ImGui::SameLine();
if (ImGui::Button("Back to Config"))
Application::get().get_state_manager().switch_to_state("Config");
+ ImGui::SameLine();
+ if (ImGui::Button("Save Settings"))
+ {
+ SimulationSettings settings = SettingsManager::get_settings_const().simulation;
+ settings.target_fps = m_engine.get_target_fps();
+ settings.compute_height = m_engine.get_compute_height();
+ settings.max_steps_moving = m_engine.get_max_steps_moving();
+ settings.max_steps_static = m_engine.get_max_steps_static();
+ settings.early_exit_distance = m_engine.get_early_exit_distance();
+ settings.gravity_enabled = m_engine.get_gravity();
+ SettingsManager::set_simulation_settings(settings);
+ DONUT_INFO("Simulation settings saved manually");
+ }
ImGui::Separator();
@@ -106,7 +132,12 @@ namespace Donut
int target_fps = m_engine.get_target_fps();
if (ImGui::SliderInt("Target FPS", &target_fps, 30, 120))
+ {
m_engine.set_target_fps(target_fps);
+ SimulationSettings settings = SettingsManager::get_settings_const().simulation;
+ settings.target_fps = target_fps;
+ SettingsManager::set_simulation_settings(settings);
+ }
ImGui::Spacing();
@@ -122,6 +153,9 @@ namespace Donut
{
m_engine.set_compute_height(compute_height);
m_engine.update_compute_dimensions();
+ SimulationSettings settings = SettingsManager::get_settings_const().simulation;
+ settings.compute_height = compute_height;
+ SettingsManager::set_simulation_settings(settings);
}
ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "Compute Width: %d (auto-calculated)", m_engine.get_compute_width());
@@ -133,13 +167,28 @@ namespace Donut
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);
+ SimulationSettings settings = SettingsManager::get_settings_const().simulation;
+ settings.max_steps_moving = max_steps_moving;
+ SettingsManager::set_simulation_settings(settings);
+ }
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);
+ SimulationSettings settings = SettingsManager::get_settings_const().simulation;
+ settings.max_steps_static = max_steps_static;
+ SettingsManager::set_simulation_settings(settings);
+ }
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);
+ SimulationSettings settings = SettingsManager::get_settings_const().simulation;
+ settings.early_exit_distance = early_exit_distance;
+ SettingsManager::set_simulation_settings(settings);
+ }
ImGui::Spacing();
@@ -147,7 +196,12 @@ namespace Donut
ImGui::Separator();
bool& gravity = m_engine.get_gravity();
- ImGui::Checkbox("Gravity Enabled", &gravity);
+ if (ImGui::Checkbox("Gravity Enabled", &gravity))
+ {
+ SimulationSettings settings = SettingsManager::get_settings_const().simulation;
+ settings.gravity_enabled = gravity;
+ SettingsManager::set_simulation_settings(settings);
+ }
ImGui::Spacing();