diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp index 21dea845..67ab45fe 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp @@ -383,6 +383,13 @@ namespace SHADE return eventData->handle; } + SHEventHandle SHScriptEngine::onScenePlayStart(SHEventPtr eventPtr) + { + auto eventData = reinterpret_cast*>(eventPtr.get()); + csResetStaticData(); + return eventData->handle; + } + SHEventHandle SHScriptEngine::onSceneDestroyed(SHEventPtr eventPtr) { auto eventData = reinterpret_cast*>(eventPtr.get()); @@ -556,6 +563,12 @@ namespace SHADE DEFAULT_CSHARP_NAMESPACE + ".Editor", "Redo" ); + csResetStaticData = dotNet.GetFunctionPtr + ( + DEFAULT_CSHARP_LIB_NAME, + DEFAULT_CSHARP_NAMESPACE + ".EngineInterface", + "ResetStaticDataInLoadedAssembly" + ); } void SHScriptEngine::registerEvents() @@ -569,7 +582,12 @@ namespace SHADE SHEventManager::SubscribeTo(SH_ENTITY_DESTROYED_EVENT, std::dynamic_pointer_cast(destroyedEventReceiver)); /* Editor */ - // Register for editor state change event + // Register for editor state change events + std::shared_ptr> startSceneEventReceiver + { + std::make_shared>(this, &SHScriptEngine::onScenePlayStart) + }; + SHEventManager::SubscribeTo(SH_EDITOR_ON_PLAY_EVENT, std::dynamic_pointer_cast(startSceneEventReceiver)); std::shared_ptr> destroyedSceneEventReceiver { std::make_shared>(this, &SHScriptEngine::onSceneDestroyed) diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.h b/SHADE_Engine/src/Scripting/SHScriptEngine.h index fd88a283..1470fda7 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.h +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.h @@ -233,6 +233,10 @@ namespace SHADE /// /// void OpenFile(const std::filesystem::path& path); + /// + /// Resets all static data in the loaded assemblies to their default values. + /// + static void ResetStaticDataInLoadedAssembly(); private: /*-----------------------------------------------------------------------------*/ @@ -292,6 +296,8 @@ namespace SHADE CsScriptEditorFuncPtr csEditorRenderScripts = nullptr; CsFuncPtr csEditorUndo = nullptr; CsFuncPtr csEditorRedo = nullptr; + // - Other + CsFuncPtr csResetStaticData = nullptr; /*-----------------------------------------------------------------------------*/ /* Event Handler Functions */ @@ -304,6 +310,7 @@ namespace SHADE SHEventHandle onUIElementClicked(SHEventPtr eventPtr); SHEventHandle onSceneNodeChildrenAdded(SHEventPtr eventPtr); SHEventHandle onSceneNodeChildrenRemoved(SHEventPtr eventPtr); + SHEventHandle onScenePlayStart(SHEventPtr eventPtr); SHEventHandle onSceneDestroyed(SHEventPtr eventPtr); /*-----------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Engine/EngineInterface.cxx b/SHADE_Managed/src/Engine/EngineInterface.cxx index 2009b2e5..98039d2d 100644 --- a/SHADE_Managed/src/Engine/EngineInterface.cxx +++ b/SHADE_Managed/src/Engine/EngineInterface.cxx @@ -78,6 +78,21 @@ namespace SHADE LoadScriptAssembly(); SAFE_NATIVE_CALL_END_N("SHADE_Managed.EngineInterface") } + void EngineInterface::ResetStaticDataInLoadedAssembly() + { + SAFE_NATIVE_CALL_BEGIN + System::Reflection::Assembly^ assembly = System::Linq::Enumerable::FirstOrDefault(scriptContext->Assemblies); + for each (System::Type ^ type in assembly->ExportedTypes) + { + if (type->TypeInitializer) + { + type->TypeInitializer->Invoke(nullptr, nullptr); + Debug::LogWarning("Called Static Constructor for: " + type->Name); + } + } + + SAFE_NATIVE_CALL_END_N("SHADE_Managed.EngineInterface") + } void EngineInterface::Exit() { SAFE_NATIVE_CALL_BEGIN diff --git a/SHADE_Managed/src/Engine/EngineInterface.hxx b/SHADE_Managed/src/Engine/EngineInterface.hxx index 37ded4eb..3477a670 100644 --- a/SHADE_Managed/src/Engine/EngineInterface.hxx +++ b/SHADE_Managed/src/Engine/EngineInterface.hxx @@ -59,6 +59,10 @@ namespace SHADE /// static void ReloadScriptAssembly(); /// + /// Resets all static data in the loaded assemblies to their default values. + /// + static void ResetStaticDataInLoadedAssembly(); + /// /// Cleans up all required components for managed code. /// static void Exit();