diff options
| author | hachem <im@hachem.wtf> | 2025-08-16 22:00:16 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2025-08-16 22:00:16 +0200 |
| commit | df98427825234b24cfa87ad9f9d8a0d738b3ea13 (patch) | |
| tree | e9c2f7387e476c84e7de043404d771e0c3eacf63 /src/States | |
| parent | 279e2378c1ef02e3917c29f8fafb39c058971577 (diff) | |
[add]: preferences and saving
Diffstat (limited to 'src/States')
| -rw-r--r-- | src/States/ConfigState.cpp | 56 | ||||
| -rw-r--r-- | src/States/SimulationState.cpp | 56 |
2 files changed, 105 insertions, 7 deletions
diff --git a/src/States/ConfigState.cpp b/src/States/ConfigState.cpp index 688c48a..1470c6d 100644 --- a/src/States/ConfigState.cpp +++ b/src/States/ConfigState.cpp @@ -2,6 +2,7 @@ #include "Rendering/Renderer.h" #include "Core/Application.h" #include "Core/ThemeManager.h" +#include "Core/SettingsManager.h" #include <imgui.h> #include <imgui_internal.h> @@ -13,8 +14,22 @@ namespace Donut { DONUT_INFO("Entering Config State"); - m_SelectedAPI = Renderer::GetAPI(); - m_SelectedTheme = static_cast<int>(ThemeManager::GetCurrentTheme()); + const auto& settings = SettingsManager::GetSettingsConst(); + + m_SelectedAPI = (settings.graphics.renderAPI == "Vulkan") ? RendererAPI::API::Vulkan : RendererAPI::API::OpenGL; + m_SelectedTheme = (settings.graphics.selectedTheme == "Light") ? 1 : + (settings.graphics.selectedTheme == "Blue") ? 2 : 0; + m_TargetFPS = settings.simulation.targetFPS; + m_ComputeHeight = settings.simulation.computeHeight; + m_MaxStepsMoving = settings.simulation.maxStepsMoving; + m_MaxStepsStatic = settings.simulation.maxStepsStatic; + m_EarlyExitDistance = settings.simulation.earlyExitDistance; + m_GravityEnabled = settings.simulation.gravityEnabled; + m_VSyncEnabled = settings.graphics.vSyncEnabled; + m_ShowFPS = settings.graphics.showFPS; + m_ShowPerformanceMetrics = settings.graphics.showPerformanceMetrics; + m_ShowDebugInfo = settings.graphics.showDebugInfo; + m_EnableAntiAliasing = settings.graphics.enableAntiAliasing; } void ConfigState::OnExit() @@ -60,7 +75,7 @@ namespace Donut ImGui::Columns(2, "ConfigColumns", true); - float availableHeight = ImGui::GetWindowHeight() - 140; // Reserve space for header, separator, buttons, and footer + float availableHeight = ImGui::GetWindowHeight() - 140; ImGui::BeginChild("GraphicsSettings", ImVec2(0, availableHeight), true, ImGuiWindowFlags_AlwaysVerticalScrollbar); ImGui::TextColored(ImVec4(0.9f, 0.9f, 1.0f, 1.0f), "Graphics Settings"); @@ -200,7 +215,7 @@ namespace Donut ImGui::Separator(); ImGui::Spacing(); - float buttonWidth = (ImGui::GetWindowWidth() - 80) / 4.0f; + float buttonWidth = (ImGui::GetWindowWidth() - 100) / 5.0f; if (ImGui::Button("Start Simulation", ImVec2(buttonWidth, 35))) { @@ -217,6 +232,13 @@ namespace Donut ApplySettings(); ImGui::SameLine(); + if (ImGui::Button("Save Settings", ImVec2(buttonWidth, 35))) + { + ApplySettings(); + DONUT_INFO("Settings saved manually"); + } + + ImGui::SameLine(); if (ImGui::Button("Exit", ImVec2(buttonWidth, 35))) Application::Get().Close(); @@ -237,8 +259,29 @@ namespace Donut void ConfigState::ApplySettings() { + SimulationSettings simSettings; + simSettings.targetFPS = m_TargetFPS; + simSettings.computeHeight = m_ComputeHeight; + simSettings.maxStepsMoving = m_MaxStepsMoving; + simSettings.maxStepsStatic = m_MaxStepsStatic; + simSettings.earlyExitDistance = m_EarlyExitDistance; + simSettings.gravityEnabled = m_GravityEnabled; + + GraphicsSettings gfxSettings; + gfxSettings.renderAPI = (m_SelectedAPI == RendererAPI::API::Vulkan) ? "Vulkan" : "OpenGL"; + gfxSettings.vSyncEnabled = m_VSyncEnabled; + gfxSettings.showFPS = m_ShowFPS; + gfxSettings.showPerformanceMetrics = m_ShowPerformanceMetrics; + gfxSettings.showDebugInfo = m_ShowDebugInfo; + gfxSettings.enableAntiAliasing = m_EnableAntiAliasing; + gfxSettings.selectedTheme = (m_SelectedTheme == 1) ? "Light" : + (m_SelectedTheme == 2) ? "Blue" : "Dark"; + + SettingsManager::SetSimulationSettings(simSettings); + SettingsManager::SetGraphicsSettings(gfxSettings); + RendererAPI::SetAPI(m_SelectedAPI); - DONUT_INFO("Settings applied"); + DONUT_INFO("Settings applied and saved"); } void ConfigState::ResetToDefaults() @@ -257,6 +300,7 @@ namespace Donut m_EnableAntiAliasing = true; m_SelectedTheme = 0; - DONUT_INFO("Settings reset to defaults"); + ApplySettings(); + DONUT_INFO("Settings reset to defaults and saved"); } }; diff --git a/src/States/SimulationState.cpp b/src/States/SimulationState.cpp index 87bf1ec..b4ed204 100644 --- a/src/States/SimulationState.cpp +++ b/src/States/SimulationState.cpp @@ -3,6 +3,7 @@ #include "Core/Application.h" #include "Core/Window.h" #include "Core/Event.h" +#include "Core/SettingsManager.h" #include <imgui.h> #include <GLFW/glfw3.h> @@ -12,6 +13,17 @@ namespace Donut void SimulationState::OnEnter() { DONUT_INFO("Entering Simulation State"); + + const auto& settings = SettingsManager::GetSettingsConst(); + + m_Engine.SetTargetFPS(settings.simulation.targetFPS); + m_Engine.SetComputeHeight(settings.simulation.computeHeight); + m_Engine.SetMaxStepsMoving(settings.simulation.maxStepsMoving); + m_Engine.SetMaxStepsStatic(settings.simulation.maxStepsStatic); + m_Engine.SetEarlyExitDistance(settings.simulation.earlyExitDistance); + m_Engine.GetGravity() = settings.simulation.gravityEnabled; + + m_Engine.UpdateComputeDimensions(); 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().GetStateManager().SwitchToState("Config"); + ImGui::SameLine(); + if (ImGui::Button("Save Settings")) + { + SimulationSettings settings = SettingsManager::GetSettingsConst().simulation; + settings.targetFPS = m_Engine.GetTargetFPS(); + settings.computeHeight = m_Engine.GetComputeHeight(); + settings.maxStepsMoving = m_Engine.GetMaxStepsMoving(); + settings.maxStepsStatic = m_Engine.GetMaxStepsStatic(); + settings.earlyExitDistance = m_Engine.GetEarlyExitDistance(); + settings.gravityEnabled = m_Engine.GetGravity(); + SettingsManager::SetSimulationSettings(settings); + DONUT_INFO("Simulation settings saved manually"); + } ImGui::Separator(); @@ -106,7 +132,12 @@ namespace Donut int targetFPS = m_Engine.GetTargetFPS(); if (ImGui::SliderInt("Target FPS", &targetFPS, 30, 120)) + { m_Engine.SetTargetFPS(targetFPS); + SimulationSettings settings = SettingsManager::GetSettingsConst().simulation; + settings.targetFPS = targetFPS; + SettingsManager::SetSimulationSettings(settings); + } ImGui::Spacing(); @@ -122,6 +153,9 @@ namespace Donut { m_Engine.SetComputeHeight(computeHeight); m_Engine.UpdateComputeDimensions(); + SimulationSettings settings = SettingsManager::GetSettingsConst().simulation; + settings.computeHeight = computeHeight; + SettingsManager::SetSimulationSettings(settings); } ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "Compute Width: %d (auto-calculated)", m_Engine.GetComputeWidth()); @@ -133,13 +167,28 @@ namespace Donut int maxStepsMoving = m_Engine.GetMaxStepsMoving(); if (ImGui::SliderInt("Max Steps (Moving)", &maxStepsMoving, 1000, 60000)) + { m_Engine.SetMaxStepsMoving(maxStepsMoving); + SimulationSettings settings = SettingsManager::GetSettingsConst().simulation; + settings.maxStepsMoving = maxStepsMoving; + SettingsManager::SetSimulationSettings(settings); + } int maxStepsStatic = m_Engine.GetMaxStepsStatic(); if (ImGui::SliderInt("Max Steps (Static)", &maxStepsStatic, 1000, 30000)) + { m_Engine.SetMaxStepsStatic(maxStepsStatic); + SimulationSettings settings = SettingsManager::GetSettingsConst().simulation; + settings.maxStepsStatic = maxStepsStatic; + SettingsManager::SetSimulationSettings(settings); + } float earlyExitDistance = m_Engine.GetEarlyExitDistance(); if (ImGui::SliderFloat("Early Exit Distance", &earlyExitDistance, 1e11f, 1e13f, "%.2e")) + { m_Engine.SetEarlyExitDistance(earlyExitDistance); + SimulationSettings settings = SettingsManager::GetSettingsConst().simulation; + settings.earlyExitDistance = earlyExitDistance; + SettingsManager::SetSimulationSettings(settings); + } ImGui::Spacing(); @@ -147,7 +196,12 @@ namespace Donut ImGui::Separator(); bool& gravity = m_Engine.GetGravity(); - ImGui::Checkbox("Gravity Enabled", &gravity); + if (ImGui::Checkbox("Gravity Enabled", &gravity)) + { + SimulationSettings settings = SettingsManager::GetSettingsConst().simulation; + settings.gravityEnabled = gravity; + SettingsManager::SetSimulationSettings(settings); + } ImGui::Spacing(); |
