aboutsummaryrefslogtreecommitdiff
path: root/src/core/state_manager.cpp
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-20 02:27:02 +0200
committerhachem <im@hachem.wtf>2026-08-20 02:40:07 +0200
commit5b361d81dbd2af0d0e99b9eb1adebea76ff05db0 (patch)
tree34db1df17e8c7248aeeb92156d635d31c2484e3f /src/core/state_manager.cpp
parente3abaaf59777258ba06705135a0cafcb5918ad12 (diff)
[chore]: MASSIVE refactor + more vulkan bs
Diffstat (limited to 'src/core/state_manager.cpp')
-rw-r--r--src/core/state_manager.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/core/state_manager.cpp b/src/core/state_manager.cpp
new file mode 100644
index 0000000..8018401
--- /dev/null
+++ b/src/core/state_manager.cpp
@@ -0,0 +1,88 @@
+#include "state_manager.h"
+#include "log.h"
+
+namespace Donut
+{
+ auto StateManager::shutdown() -> void
+ {
+ if (m_current_state)
+ m_current_state->on_exit();
+
+ destroy_states();
+ DONUT_INFO("StateManager shutdown");
+ }
+
+ auto StateManager::destroy_states() -> void
+ {
+ m_states.clear();
+ m_current_state = nullptr;
+ m_current_state_name = "";
+ }
+
+ auto StateManager::register_state(const std::string& state_name, Scope<State> state) -> void
+ {
+ if (m_states.find(state_name) != m_states.end())
+ DONUT_WARN("State '{}' already exists, overwriting", state_name);
+ m_states[state_name] = std::move(state);
+ DONUT_INFO("Registered state: {}", state_name);
+ }
+
+ auto StateManager::switch_to_state(const std::string& state_name) -> void
+ {
+ auto it = m_states.find(state_name);
+ if (it == m_states.end())
+ {
+ DONUT_ERROR("Attempted to switch to unknown state: {}", state_name);
+ return;
+ }
+
+ State* new_state = it->second.get();
+ if (new_state == m_current_state)
+ return;
+
+ if (m_current_state)
+ m_current_state->on_exit();
+
+ m_current_state = new_state;
+ m_current_state_name = state_name;
+ m_current_state->on_enter();
+ DONUT_INFO("Switched to state: {}", state_name);
+ }
+
+ auto StateManager::get_state(const std::string& state_name) -> State*
+ {
+ auto it = m_states.find(state_name);
+ if (it != m_states.end())
+ return it->second.get();
+ return nullptr;
+ }
+
+ auto StateManager::has_state(const std::string& state_name) const -> bool
+ {
+ return m_states.find(state_name) != m_states.end();
+ }
+
+ auto StateManager::update(float delta_time) -> void
+ {
+ if (m_current_state)
+ m_current_state->on_update(delta_time);
+ }
+
+ auto StateManager::render() -> void
+ {
+ if (m_current_state)
+ m_current_state->on_render();
+ }
+
+ auto StateManager::on_im_ui_render() -> void
+ {
+ if (m_current_state)
+ m_current_state->on_im_ui_render();
+ }
+
+ auto StateManager::on_event(Event& event) -> void
+ {
+ if (m_current_state)
+ m_current_state->on_event(event);
+ }
+}