diff --git a/SHADE_Engine/src/Events/SHEventDefines.h b/SHADE_Engine/src/Events/SHEventDefines.h index d7bbf5f0..bdc4c505 100644 --- a/SHADE_Engine/src/Events/SHEventDefines.h +++ b/SHADE_Engine/src/Events/SHEventDefines.h @@ -18,4 +18,8 @@ constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_REMOVED_EVENT { 9 }; constexpr SHEventIdentifier SH_EDITOR_ON_PLAY_EVENT { 10 }; constexpr SHEventIdentifier SH_EDITOR_ON_PAUSE_EVENT { 11 }; constexpr SHEventIdentifier SH_EDITOR_ON_STOP_EVENT { 12 }; +constexpr SHEventIdentifier SH_SCENE_INIT_PRE { 13 }; +constexpr SHEventIdentifier SH_SCENE_INIT_POST { 14 }; +constexpr SHEventIdentifier SH_SCENE_EXIT_PRE { 15 }; +constexpr SHEventIdentifier SH_SCENE_EXIT_POST { 16 }; diff --git a/SHADE_Engine/src/Scene/SHSceneEvents.h b/SHADE_Engine/src/Scene/SHSceneEvents.h index c0d7dbc1..5b4fded9 100644 --- a/SHADE_Engine/src/Scene/SHSceneEvents.h +++ b/SHADE_Engine/src/Scene/SHSceneEvents.h @@ -12,6 +12,7 @@ // Project Headers #include "SHSceneNode.h" +#include "Assets/SHAssetMacros.h" namespace SHADE { @@ -38,4 +39,10 @@ namespace SHADE SHSceneNode* childRemoved = nullptr; }; + + struct SHSceneInitExitEvent + { + AssetID sceneAssetID; + }; + } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Scene/SHSceneManager.cpp b/SHADE_Engine/src/Scene/SHSceneManager.cpp index 110aaea6..3614fa52 100644 --- a/SHADE_Engine/src/Scene/SHSceneManager.cpp +++ b/SHADE_Engine/src/Scene/SHSceneManager.cpp @@ -15,6 +15,8 @@ //#include "Rendering/Window/SHRenderingWindow.h" #include "ECS_Base/Managers/SHEntityManager.h" #include "ECS_Base/Managers/SHSystemManager.h" +#include "SHSceneEvents.h" +#include "Events/SHEventManager.hpp" //#include "FRC/SHFrameRateController.h" //#include "ECS_Base/System/SHApplication.h" @@ -54,9 +56,15 @@ namespace SHADE { if (currentScene) { + SHSceneInitExitEvent exitEvent; + exitEvent.sceneAssetID = currentScene->sceneAssetID; + SHEventManager::BroadcastEvent(exitEvent, SH_SCENE_EXIT_PRE); + currentScene->Free(); currentScene->Unload(); SHEntityManager::DestroyAllEntity(); + + SHEventManager::BroadcastEvent(exitEvent, SH_SCENE_EXIT_POST); delete currentScene; } @@ -82,27 +90,48 @@ namespace SHADE nextSceneID = UINT32_MAX; if (currentScene != nullptr) { + currentScene->Load(); + + SHSceneInitExitEvent initEvent; + initEvent.sceneAssetID = currentScene->sceneAssetID; + + SHEventManager::BroadcastEvent(initEvent, SH_SCENE_INIT_PRE); currentScene->Init(); + SHEventManager::BroadcastEvent(initEvent, SH_SCENE_INIT_POST); } } else // restarting scene { nextSceneID = UINT32_MAX; + SHSceneInitExitEvent exitEvent; + exitEvent.sceneAssetID = currentScene->sceneAssetID; + SHEventManager::BroadcastEvent(exitEvent, SH_SCENE_EXIT_PRE); + currentScene->Free(); if (cleanReload == true) { cleanReload = false; currentScene->Unload(); SHEntityManager::DestroyAllEntity(); + SHEventManager::BroadcastEvent(exitEvent, SH_SCENE_EXIT_POST); currentScene->sceneName = newSceneName; currentScene->Load(); } - else + else + { + SHEntityManager::DestroyAllEntity(); + SHEventManager::BroadcastEvent(exitEvent, SH_SCENE_EXIT_POST); + } + + SHSceneInitExitEvent initEvent; + initEvent.sceneAssetID = currentScene->sceneAssetID; + SHEventManager::BroadcastEvent(initEvent, SH_SCENE_INIT_PRE); currentScene->Init(); + SHEventManager::BroadcastEvent(initEvent, SH_SCENE_INIT_POST); } }