hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/states
diff options
context:
space:
mode:
Diffstat (limited to 'src/states')
-rw-r--r--src/states/config_state.cpp54
-rw-r--r--src/states/simulation_state.cpp56
2 files changed, 104 insertions, 6 deletions
diff --git a/src/states/config_state.cpp b/src/states/config_state.cpp
index 8cf24ef..1f1ef16 100644
--- a/src/states/config_state.cpp
+++ b/src/states/config_state.cpp
@@ -2,6 +2,7 @@
#include "rendering/renderer.h"
#include "core/application.h"
#include "core/theme_manager.h"
+#include "core/settings_manager.h"
#include <imgui.h>
#include <imgui_internal.h>
@@ -13,8 +14,22 @@ namespace Donut
{
DONUT_INFO("Entering Config State");
- m_selected_api = Renderer::get_api();
- m_selected_theme = static_cast<int>(ThemeManager::get_current_theme());
+ const auto& settings = SettingsManager::get_settings_const();
+
+ m_selected_api = (settings.graphics.render_api == "Vulkan") ? RendererAPI::API::Vulkan : RendererAPI::API::OpenGL;
+ m_selected_theme = (settings.graphics.selected_theme == "Light") ? 1 :
+ (settings.graphics.selected_theme == "Blue") ? 2 : 0;
+ m_target_fps = settings.simulation.target_fps;
+ m_compute_height = settings.simulation.compute_height;
+ m_max_steps_moving = settings.simulation.max_steps_moving;
+ m_max_steps_static = settings.simulation.max_steps_static;
+ m_early_exit_distance = settings.simulation.early_exit_distance;
+ m_gravity_enabled = settings.simulation.gravity_enabled;
+ m_v_sync_enabled = settings.graphics.v_sync_enabled;
+ m_show_fps = settings.graphics.show_fps;
+ m_show_performance_metrics = settings.graphics.show_performance_metrics;
+ m_show_debug_info = settings.graphics.show_debug_info;
+ m_enable_anti_aliasing = settings.graphics.enable_anti_aliasing;
}
void ConfigState::on_exit()
@@ -200,7 +215,7 @@ namespace Donut
ImGui::Separator();
ImGui::Spacing();
- float button_width = (ImGui::GetWindowWidth() - 80) / 4.0f;
+ float button_width = (ImGui::GetWindowWidth() - 100) / 5.0f;
if (ImGui::Button("Start Simulation", ImVec2(button_width, 35)))
{
@@ -217,6 +232,13 @@ namespace Donut
apply_settings();
ImGui::SameLine();
+ if (ImGui::Button("Save Settings", ImVec2(button_width, 35)))
+ {
+ apply_settings();
+ DONUT_INFO("Settings saved manually");
+ }
+
+ ImGui::SameLine();
if (ImGui::Button("Exit", ImVec2(button_width, 35)))
Application::get().close();
@@ -237,8 +259,29 @@ namespace Donut
void ConfigState::apply_settings()
{
+ SimulationSettings sim_settings;
+ sim_settings.target_fps = m_target_fps;
+ sim_settings.compute_height = m_compute_height;
+ sim_settings.max_steps_moving = m_max_steps_moving;
+ sim_settings.max_steps_static = m_max_steps_static;
+ sim_settings.early_exit_distance = m_early_exit_distance;
+ sim_settings.gravity_enabled = m_gravity_enabled;
+
+ GraphicsSettings gfx_settings;
+ gfx_settings.render_api = (m_selected_api == RendererAPI::API::Vulkan) ? "Vulkan" : "OpenGL";
+ gfx_settings.v_sync_enabled = m_v_sync_enabled;
+ gfx_settings.show_fps = m_show_fps;
+ gfx_settings.show_performance_metrics = m_show_performance_metrics;
+ gfx_settings.show_debug_info = m_show_debug_info;
+ gfx_settings.enable_anti_aliasing = m_enable_anti_aliasing;
+ gfx_settings.selected_theme = (m_selected_theme == 1) ? "Light" :
+ (m_selected_theme == 2) ? "Blue" : "Dark";
+
+ SettingsManager::set_simulation_settings(sim_settings);
+ SettingsManager::set_graphics_settings(gfx_settings);
+
RendererAPI::set_api(m_selected_api);
- DONUT_INFO("Settings applied");
+ DONUT_INFO("Settings applied and saved");
}
void ConfigState::reset_to_defaults()
@@ -257,6 +300,7 @@ namespace Donut
m_enable_anti_aliasing = true;
m_selected_theme = 0;
- DONUT_INFO("Settings reset to defaults");
+ apply_settings();
+ DONUT_INFO("Settings reset to defaults and saved");
}
};
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();