Add script system
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
#include "inferno/script/nativescript.h"
|
#include "inferno/script/nativescript.h"
|
||||||
#include "inferno/systems/camera.h"
|
#include "inferno/systems/camera.h"
|
||||||
#include "inferno/systems/render.h"
|
#include "inferno/systems/render.h"
|
||||||
|
#include "inferno/systems/script.h"
|
||||||
#include "inferno/systems/transform.h"
|
#include "inferno/systems/transform.h"
|
||||||
|
|
||||||
namespace Inferno {
|
namespace Inferno {
|
||||||
@@ -34,6 +35,10 @@ namespace Inferno {
|
|||||||
renderSystem->initialize();
|
renderSystem->initialize();
|
||||||
RenderSystem::the().setRegistry(m_registry);
|
RenderSystem::the().setRegistry(m_registry);
|
||||||
|
|
||||||
|
ScriptSystem* scriptSystem = new ScriptSystem();
|
||||||
|
scriptSystem->initialize();
|
||||||
|
ScriptSystem::the().setScene(this);
|
||||||
|
|
||||||
// Load assets
|
// Load assets
|
||||||
// ---------------------------------
|
// ---------------------------------
|
||||||
|
|
||||||
@@ -61,7 +66,7 @@ namespace Inferno {
|
|||||||
|
|
||||||
void Scene::update(float deltaTime)
|
void Scene::update(float deltaTime)
|
||||||
{
|
{
|
||||||
(void)deltaTime;
|
ScriptSystem::the().update(deltaTime);
|
||||||
|
|
||||||
TransformSystem::the().update();
|
TransformSystem::the().update();
|
||||||
CameraSystem::the().update();
|
CameraSystem::the().update();
|
||||||
@@ -74,6 +79,7 @@ namespace Inferno {
|
|||||||
|
|
||||||
void Scene::destroy()
|
void Scene::destroy()
|
||||||
{
|
{
|
||||||
|
ScriptSystem::the().destroy();
|
||||||
RenderSystem::the().destroy();
|
RenderSystem::the().destroy();
|
||||||
CameraSystem::the().destroy();
|
CameraSystem::the().destroy();
|
||||||
TransformSystem::the().destroy();
|
TransformSystem::the().destroy();
|
||||||
@@ -88,14 +94,13 @@ namespace Inferno {
|
|||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity Scene::createEntity(entt::entity handle)
|
void Scene::destroyEntity(uint32_t entity)
|
||||||
{
|
{
|
||||||
return Entity(m_registry, handle);
|
if (hasComponent<NativeScript>(entity)) {
|
||||||
|
ScriptSystem::the().cleanup(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity Scene::createEntity(uint32_t handle)
|
m_registry->destroy(entt::entity { entity });
|
||||||
{
|
|
||||||
return Entity(m_registry, handle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::mat4 Scene::cameraProjectionView()
|
glm::mat4 Scene::cameraProjectionView()
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user