Browse Source

Implement lua script into script system

master
Riyyi 4 years ago
parent
commit
2cf42c7dea
  1. 17
      inferno/src/inferno/scene/scene.cpp
  2. 59
      inferno/src/inferno/systems/script.cpp
  3. 7
      inferno/src/inferno/systems/script.h

17
inferno/src/inferno/scene/scene.cpp

@ -24,12 +24,6 @@ namespace Inferno {
cameraSystem->initialize(); cameraSystem->initialize();
CameraSystem::the().setRegistry(m_registry); CameraSystem::the().setRegistry(m_registry);
uint32_t camera = createEntity("Camera Entity");
auto& cameraTransform = getComponent<TransformComponent>(camera);
cameraTransform.translate.z = 1.0f;
addComponent<CameraComponent>(camera, CameraType::Perspective);
addComponent<NativeScriptComponent>(camera).bind<CameraController>();
RenderSystem* renderSystem = new RenderSystem(); RenderSystem* renderSystem = new RenderSystem();
renderSystem->initialize(); renderSystem->initialize();
RenderSystem::the().setRegistry(m_registry); RenderSystem::the().setRegistry(m_registry);
@ -47,6 +41,14 @@ namespace Inferno {
// Construct entities // Construct entities
// --------------------------------- // ---------------------------------
uint32_t camera = createEntity("Camera Entity");
auto& cameraTransform = getComponent<TransformComponent>(camera);
cameraTransform.rotate.z = -1.0f;
cameraTransform.translate.z = 1.0f;
addComponent<CameraComponent>(camera, CameraType::Perspective);
addComponent<NativeScriptComponent>(camera).bind<CameraController>();
// addComponent<LuaScriptComponent>(camera, "assets/lua/cameracontroller.lua");
uint32_t quad = createEntity("Quad"); uint32_t quad = createEntity("Quad");
addComponent<SpriteComponent>(quad, glm::vec4 { 1.0f, 1.0f, 1.0f, 1.0f }, m_texture); addComponent<SpriteComponent>(quad, glm::vec4 { 1.0f, 1.0f, 1.0f, 1.0f }, m_texture);
@ -95,10 +97,7 @@ namespace Inferno {
void Scene::destroyEntity(uint32_t entity) void Scene::destroyEntity(uint32_t entity)
{ {
if (hasComponent<NativeScriptComponent>(entity)) {
ScriptSystem::the().cleanup(entity); ScriptSystem::the().cleanup(entity);
}
m_registry->destroy(entt::entity { entity }); m_registry->destroy(entt::entity { entity });
} }

59
inferno/src/inferno/systems/script.cpp

@ -2,9 +2,10 @@
#include "inferno/assertions.h" #include "inferno/assertions.h"
#include "inferno/scene/components.h" #include "inferno/scene/components.h"
#include "inferno/scene/scene.h"
#include "inferno/script/lua.h"
#include "inferno/script/nativescript.h" #include "inferno/script/nativescript.h"
#include "inferno/systems/script.h" #include "inferno/systems/script.h"
#include <bits/stdint-uintn.h>
namespace Inferno { namespace Inferno {
@ -20,11 +21,16 @@ namespace Inferno {
void ScriptSystem::destroy() void ScriptSystem::destroy()
{ {
auto view = m_scene->registry()->view<NativeScriptComponent>(); auto nativeScriptView = m_scene->registry()->view<NativeScriptComponent>();
// @Todo change the getComponent() call to retrieve from the view for more performance for (auto entity : nativeScriptView) {
for (auto entity : view) { cleanup(nativeScriptView.get<NativeScriptComponent>(entity));
cleanup(static_cast<uint32_t>(entity)); }
auto luaScriptView = m_scene->registry()->view<LuaScriptComponent>();
for (auto entity : luaScriptView) {
cleanup(luaScriptView.get<LuaScriptComponent>(entity));
} }
delete s_instance; delete s_instance;
@ -34,11 +40,11 @@ namespace Inferno {
void ScriptSystem::update(float deltaTime) void ScriptSystem::update(float deltaTime)
{ {
// @Todo figure out why group doesn't work here // @Todo figure out why group doesn't work here
auto view = m_scene->registry()->view<TransformComponent, NativeScriptComponent>(); auto nativeScriptView = m_scene->registry()->view<TransformComponent, NativeScriptComponent>();
for (auto [entity, transform, nativeScript] : view.each()) { for (auto [entity, transform, nativeScript] : nativeScriptView.each()) {
// Create script if not initialized // Create native script if not initialized
if (!nativeScript.instance) { if (!nativeScript.instance) {
nativeScript.instance = nativeScript.initialize(); nativeScript.instance = nativeScript.initialize();
nativeScript.instance->transform = &transform; nativeScript.instance->transform = &transform;
@ -50,16 +56,53 @@ namespace Inferno {
nativeScript.instance->transform = &transform; nativeScript.instance->transform = &transform;
nativeScript.instance->update(deltaTime); nativeScript.instance->update(deltaTime);
} }
auto luaScriptView = m_scene->registry()->view<TransformComponent, LuaScriptComponent>();
for (auto [entity, transform, luaScript] : luaScriptView.each()) {
// Create Lua script if not initialized
if (!luaScript.instance) {
luaScript.instance = new Lua();
luaScript.instance->transform = &transform;
luaScript.instance->m_scene = m_scene;
luaScript.instance->m_entity = static_cast<uint32_t>(entity);
luaScript.instance->m_path = luaScript.path;
luaScript.instance->initialize();
}
luaScript.instance->update(deltaTime);
}
} }
void ScriptSystem::cleanup(uint32_t entity) void ScriptSystem::cleanup(uint32_t entity)
{ {
if (m_scene->hasComponent<NativeScriptComponent>(entity)) {
auto& nativeScript = m_scene->getComponent<NativeScriptComponent>(entity); auto& nativeScript = m_scene->getComponent<NativeScriptComponent>(entity);
cleanup(nativeScript);
}
if (m_scene->hasComponent<LuaScriptComponent>(entity)) {
auto& luaScript = m_scene->getComponent<LuaScriptComponent>(entity);
cleanup(luaScript);
}
}
void ScriptSystem::cleanup(NativeScriptComponent& nativeScript)
{
if (nativeScript.instance) { if (nativeScript.instance) {
nativeScript.instance->destroy(); nativeScript.instance->destroy();
nativeScript.destroy(); nativeScript.destroy();
} }
} }
void ScriptSystem::cleanup(LuaScriptComponent& luaScript)
{
if (luaScript.instance) {
luaScript.instance->destroy();
delete luaScript.instance;
}
}
} }

7
inferno/src/inferno/systems/script.h

@ -1,10 +1,13 @@
#ifndef SCRIPT_SYSTEM_H #ifndef SCRIPT_SYSTEM_H
#define SCRIPT_SYSTEM_H #define SCRIPT_SYSTEM_H
#include <memory> //std::shared_ptr #include <cstdint> // uint32_t
namespace Inferno { namespace Inferno {
struct NativeScriptComponent;
struct LuaScriptComponent;
class Scene; class Scene;
class ScriptSystem { class ScriptSystem {
@ -14,6 +17,8 @@ namespace Inferno {
void update(float deltaTime); void update(float deltaTime);
void cleanup(uint32_t entity); void cleanup(uint32_t entity);
void cleanup(NativeScriptComponent& nativeScript);
void cleanup(LuaScriptComponent& luaScript);
void setScene(Scene* scene) { m_scene = scene; } void setScene(Scene* scene) { m_scene = scene; }

Loading…
Cancel
Save