From df60b84f65fd5bfd80af2287463714fd0fa4a1a3 Mon Sep 17 00:00:00 2001 From: hachem Date: Sat, 16 Aug 2025 22:00:16 +0200 Subject: feat: preferences and saving --- src/states/simulation_state.cpp | 56 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) (limited to 'src/states/simulation_state.cpp') 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 #include @@ -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(); -- cgit v1.3