From a41f8467b421730c7f03dc70e4ea2211ee7b5627 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Tue, 19 Jan 2021 00:44:23 +0100 Subject: [PATCH] Fix instantiating multiple native scripts and their cleanup --- inferno/src/inferno/scene/components.h | 14 +++++++++----- inferno/src/inferno/scene/scene.cpp | 2 +- inferno/src/inferno/systems/script.cpp | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/inferno/src/inferno/scene/components.h b/inferno/src/inferno/scene/components.h index a27276b..3358cfe 100644 --- a/inferno/src/inferno/scene/components.h +++ b/inferno/src/inferno/scene/components.h @@ -61,8 +61,7 @@ namespace Inferno { struct NativeScriptComponent { NativeScript* instance = nullptr; - std::function initialize = nullptr; - std::function destroy = nullptr; + NativeScript* (*initialize)(); // Dont allow manually setting instance during construction NativeScriptComponent() {} @@ -70,9 +69,14 @@ namespace Inferno { template void bind() { - ASSERT(initialize == nullptr && destroy == nullptr, "NativeScript already bound"); - initialize = [&]() { instance = static_cast(new T()); }; - destroy = [&]() { delete instance; instance = nullptr; initialize = nullptr; destroy = nullptr; }; + ASSERT(instance == nullptr, "NativeScript already bound"); + initialize = []() { return static_cast(new T()); }; + } + + void destroy() { + ASSERT(instance, "Attempting to destroy an uninitialized NativeScript"); + delete instance; + instance = nullptr; } }; diff --git a/inferno/src/inferno/scene/scene.cpp b/inferno/src/inferno/scene/scene.cpp index f077e7c..f562cd2 100644 --- a/inferno/src/inferno/scene/scene.cpp +++ b/inferno/src/inferno/scene/scene.cpp @@ -95,7 +95,7 @@ namespace Inferno { void Scene::destroyEntity(uint32_t entity) { - if (hasComponent(entity)) { + if (hasComponent(entity)) { ScriptSystem::the().cleanup(entity); } diff --git a/inferno/src/inferno/systems/script.cpp b/inferno/src/inferno/systems/script.cpp index cdc948e..f98d3f1 100644 --- a/inferno/src/inferno/systems/script.cpp +++ b/inferno/src/inferno/systems/script.cpp @@ -40,7 +40,7 @@ namespace Inferno { // Create script if not initialized if (!nativeScript.instance) { - nativeScript.initialize(); + nativeScript.instance = nativeScript.initialize(); nativeScript.instance->transform = &transform; nativeScript.instance->m_scene = m_scene; nativeScript.instance->m_entity = static_cast(entity); @@ -56,7 +56,7 @@ namespace Inferno { { auto& nativeScript = m_scene->getComponent(entity); - if (!nativeScript.instance) { + if (nativeScript.instance) { nativeScript.instance->destroy(); nativeScript.destroy(); }