fix: alot of stuff changed. Mostly bugfixxes / architechture changes

This commit is contained in:
2026-08-09 02:24:17 +02:00
parent 4b6f773c0c
commit 05384debbf
98 changed files with 5461 additions and 1751 deletions
+76 -11
View File
@@ -1,27 +1,57 @@
#include <destrum/Scene/SceneManager.h>
#include <algorithm>
#include <iterator>
#include <stdexcept>
#include <destrum/Scene/Scene.h>
#include <destrum/Util/DeltaTime.h>
void SceneManager::Update() {
m_scenes[m_ActiveSceneIndex]->Update();
Scene& SceneManager::GetCurrentScene() const {
if (m_scenes.empty()) {
throw std::out_of_range("No scenes are available");
}
if (m_ActiveSceneIndex < 0 || m_ActiveSceneIndex >= static_cast<int>(m_scenes.size())) {
throw std::out_of_range("Active scene index is invalid");
}
return *m_scenes[static_cast<std::size_t>(m_ActiveSceneIndex)];
}
void SceneManager::Update(float dt) {
if (m_scenes.empty()) return;
(void)GetCurrentScene();
const auto scene = m_scenes.at(static_cast<std::size_t>(m_ActiveSceneIndex));
scene->Update(dt);
}
void SceneManager::FixedUpdate(float dt) {
m_scenes[m_ActiveSceneIndex]->FixedUpdate(dt);
if (m_scenes.empty()) return;
(void)GetCurrentScene();
const auto scene = m_scenes.at(static_cast<std::size_t>(m_ActiveSceneIndex));
scene->FixedUpdate(dt);
}
void SceneManager::LateUpdate() {
m_scenes[m_ActiveSceneIndex]->LateUpdate();
void SceneManager::LateUpdate(float dt) {
if (m_scenes.empty()) return;
(void)GetCurrentScene();
const auto scene = m_scenes.at(static_cast<std::size_t>(m_ActiveSceneIndex));
scene->LateUpdate(dt);
}
void SceneManager::Render(const RenderContext& ctx) {
m_scenes[m_ActiveSceneIndex]->Render(ctx);
if (m_scenes.empty()) return;
(void)GetCurrentScene();
const auto scene = m_scenes.at(static_cast<std::size_t>(m_ActiveSceneIndex));
scene->Render(ctx);
}
void SceneManager::RenderImgui() {
m_scenes[m_ActiveSceneIndex]->RenderImgui();
if (m_scenes.empty()) return;
(void)GetCurrentScene();
const auto scene = m_scenes.at(static_cast<std::size_t>(m_ActiveSceneIndex));
scene->RenderImgui();
}
void SceneManager::HandleGameObjectDestroy() {
@@ -43,6 +73,12 @@ void SceneManager::UnloadAllScenes() {
}
void SceneManager::HandleSceneDestroy() {
const std::shared_ptr<Scene> activeScene =
m_ActiveSceneIndex >= 0 &&
m_ActiveSceneIndex < static_cast<int>(m_scenes.size())
? m_scenes[static_cast<std::size_t>(m_ActiveSceneIndex)]
: nullptr;
for (auto it = m_scenes.begin(); it != m_scenes.end();) {
if ((*it)->IsBeingUnloaded()) {
it = m_scenes.erase(it);
@@ -50,15 +86,37 @@ void SceneManager::HandleSceneDestroy() {
++it;
}
}
if (m_scenes.empty()) {
m_ActiveSceneIndex = 0;
return;
}
if (activeScene != nullptr) {
const auto activeIt = std::find(m_scenes.begin(), m_scenes.end(), activeScene);
if (activeIt != m_scenes.end()) {
m_ActiveSceneIndex = static_cast<int>(std::distance(m_scenes.begin(), activeIt));
return;
}
}
m_ActiveSceneIndex = std::clamp(
m_ActiveSceneIndex,
0,
static_cast<int>(m_scenes.size()) - 1);
}
void SceneManager::HandleScene() {
DestroyGameObjects();
HandleGameObjectDestroy();
HandleSceneDestroy();
}
void SceneManager::Destroy() {
if (m_scenes.empty()) {
m_ActiveSceneIndex = 0;
return;
}
UnloadAllScenes();
DestroyGameObjects();
HandleGameObjectDestroy();
@@ -71,13 +129,20 @@ void SceneManager::SwitchScene(int index) {
if (index < 0 || index >= static_cast<int>(m_scenes.size())) {
throw std::out_of_range("Scene index out of range");
}
m_scenes[m_ActiveSceneIndex]->UnloadBindings();
if (index == m_ActiveSceneIndex) {
return;
}
m_scenes[static_cast<std::size_t>(m_ActiveSceneIndex)]->UnloadBindings();
m_ActiveSceneIndex = index;
m_scenes[m_ActiveSceneIndex]->LoadBindings();
m_scenes[static_cast<std::size_t>(m_ActiveSceneIndex)]->LoadBindings();
}
Scene &SceneManager::CreateScene(const std::string &name) {
const auto &scene = std::shared_ptr<Scene>(new Scene(name));
const auto scene = std::shared_ptr<Scene>(new Scene(name));
m_scenes.push_back(scene);
if (m_scenes.size() == 1) {
m_ActiveSceneIndex = 0;
}
return *scene;
}