Riyyi
4 years ago
3 changed files with 107 additions and 7 deletions
@ -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 <bits/stdint-uintn.h> |
||||
|
||||
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<NativeScriptComponent>(); |
||||
|
||||
// @Todo change the getComponent() call to retrieve from the view for more performance
|
||||
for (auto entity : view) { |
||||
cleanup(static_cast<uint32_t>(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<TransformComponent, NativeScriptComponent>(); |
||||
|
||||
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<uint32_t>(entity); |
||||
nativeScript.instance->initialize(); |
||||
} |
||||
|
||||
nativeScript.instance->transform = &transform; |
||||
nativeScript.instance->update(deltaTime); |
||||
} |
||||
} |
||||
|
||||
void ScriptSystem::cleanup(uint32_t entity) |
||||
{ |
||||
auto& nativeScript = m_scene->getComponent<NativeScriptComponent>(entity); |
||||
|
||||
if (!nativeScript.instance) { |
||||
nativeScript.instance->destroy(); |
||||
nativeScript.destroy(); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,30 @@
|
||||
#ifndef SCRIPT_SYSTEM_H |
||||
#define SCRIPT_SYSTEM_H |
||||
|
||||
#include <memory> //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
|
Loading…
Reference in new issue