From f09e998d526a3c2804e24bdb17b13adbbc740fc4 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Mon, 18 Jan 2021 17:20:50 +0100 Subject: [PATCH] Add script system --- inferno/src/inferno/scene/scene.cpp | 19 +++++--- inferno/src/inferno/systems/script.cpp | 65 ++++++++++++++++++++++++++ inferno/src/inferno/systems/script.h | 30 ++++++++++++ 3 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 inferno/src/inferno/systems/script.cpp create mode 100644 inferno/src/inferno/systems/script.h diff --git a/inferno/src/inferno/scene/scene.cpp b/inferno/src/inferno/scene/scene.cpp index 1aaa584..fd222ea 100644 --- a/inferno/src/inferno/scene/scene.cpp +++ b/inferno/src/inferno/scene/scene.cpp @@ -5,6 +5,7 @@ #include "inferno/script/nativescript.h" #include "inferno/systems/camera.h" #include "inferno/systems/render.h" +#include "inferno/systems/script.h" #include "inferno/systems/transform.h" namespace Inferno { @@ -34,6 +35,10 @@ namespace Inferno { renderSystem->initialize(); RenderSystem::the().setRegistry(m_registry); + ScriptSystem* scriptSystem = new ScriptSystem(); + scriptSystem->initialize(); + ScriptSystem::the().setScene(this); + // Load assets // --------------------------------- @@ -61,7 +66,7 @@ namespace Inferno { void Scene::update(float deltaTime) { - (void)deltaTime; + ScriptSystem::the().update(deltaTime); TransformSystem::the().update(); CameraSystem::the().update(); @@ -74,6 +79,7 @@ namespace Inferno { void Scene::destroy() { + ScriptSystem::the().destroy(); RenderSystem::the().destroy(); CameraSystem::the().destroy(); TransformSystem::the().destroy(); @@ -88,14 +94,13 @@ namespace Inferno { return entity; } - Entity Scene::createEntity(entt::entity handle) + void Scene::destroyEntity(uint32_t entity) { - return Entity(m_registry, handle); - } + if (hasComponent(entity)) { + ScriptSystem::the().cleanup(entity); + } - Entity Scene::createEntity(uint32_t handle) - { - return Entity(m_registry, handle); + m_registry->destroy(entt::entity { entity }); } glm::mat4 Scene::cameraProjectionView() diff --git a/inferno/src/inferno/systems/script.cpp b/inferno/src/inferno/systems/script.cpp new file mode 100644 index 0000000..cdc948e --- /dev/null +++ b/inferno/src/inferno/systems/script.cpp @@ -0,0 +1,65 @@ +#include "entt/entity/registry.hpp" // entt::entity, entt::registry + +#include "inferno/assertions.h" +#include "inferno/scene/components.h" +#include "inferno/script/nativescript.h" +#include "inferno/systems/script.h" +#include + +namespace Inferno { + + ScriptSystem* ScriptSystem::s_instance = nullptr; + + void ScriptSystem::initialize() + { + ASSERT(!s_instance, "ScriptSystem already exists!"); + s_instance = this; + + dbg(Log::Info) << "ScriptSystem initialized"; + } + + void ScriptSystem::destroy() + { + auto view = m_scene->registry()->view(); + + // @Todo change the getComponent() call to retrieve from the view for more performance + for (auto entity : view) { + cleanup(static_cast(entity)); + } + + delete s_instance; + s_instance = nullptr; + } + + void ScriptSystem::update(float deltaTime) + { + // @Todo figure out why group doesn't work here + auto view = m_scene->registry()->view(); + + for (auto [entity, transform, nativeScript] : view.each()) { + + // Create script if not initialized + if (!nativeScript.instance) { + nativeScript.initialize(); + nativeScript.instance->transform = &transform; + nativeScript.instance->m_scene = m_scene; + nativeScript.instance->m_entity = static_cast(entity); + nativeScript.instance->initialize(); + } + + nativeScript.instance->transform = &transform; + nativeScript.instance->update(deltaTime); + } + } + + void ScriptSystem::cleanup(uint32_t entity) + { + auto& nativeScript = m_scene->getComponent(entity); + + if (!nativeScript.instance) { + nativeScript.instance->destroy(); + nativeScript.destroy(); + } + } + +} diff --git a/inferno/src/inferno/systems/script.h b/inferno/src/inferno/systems/script.h new file mode 100644 index 0000000..c61a5c7 --- /dev/null +++ b/inferno/src/inferno/systems/script.h @@ -0,0 +1,30 @@ +#ifndef SCRIPT_SYSTEM_H +#define SCRIPT_SYSTEM_H + +#include //std::shared_ptr + +namespace Inferno { + + class Scene; + + class ScriptSystem { + public: + void initialize(); + void destroy(); + void update(float deltaTime); + + void cleanup(uint32_t entity); + + void setScene(Scene* scene) { m_scene = scene; } + + static inline ScriptSystem& the() { return *s_instance; } + + private: + Scene* m_scene; + + static ScriptSystem* s_instance; + }; + +} + +#endif // SCRIPT_SYSTEM_H