diff options
| author | hachem <im@hachem.wtf> | 2026-08-20 02:27:02 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-08-20 02:40:07 +0200 |
| commit | 5b361d81dbd2af0d0e99b9eb1adebea76ff05db0 (patch) | |
| tree | 34db1df17e8c7248aeeb92156d635d31c2484e3f /src/core/state_manager.cpp | |
| parent | e3abaaf59777258ba06705135a0cafcb5918ad12 (diff) | |
[chore]: MASSIVE refactor + more vulkan bs
Diffstat (limited to 'src/core/state_manager.cpp')
| -rw-r--r-- | src/core/state_manager.cpp | 88 |
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); + } +} |
