aboutsummaryrefslogtreecommitdiff
path: root/src/States
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
commitdf98427825234b24cfa87ad9f9d8a0d738b3ea13 (patch)
treee9c2f7387e476c84e7de043404d771e0c3eacf63 /src/States
parent279e2378c1ef02e3917c29f8fafb39c058971577 (diff)
[add]: preferences and saving
Diffstat (limited to 'src/States')
-rw-r--r--src/States/ConfigState.cpp56
-rw-r--r--src/States/SimulationState.cpp56
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();