Implement lua script into script system
This commit is contained in:
@@ -24,12 +24,6 @@ namespace Inferno {
|
||||
cameraSystem->initialize();
|
||||
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->initialize();
|
||||
RenderSystem::the().setRegistry(m_registry);
|
||||
@@ -47,6 +41,14 @@ namespace Inferno {
|
||||
// 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");
|
||||
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)
|
||||
{
|
||||
if (hasComponent<NativeScriptComponent>(entity)) {
|
||||
ScriptSystem::the().cleanup(entity);
|
||||
}
|
||||
|
||||
m_registry->destroy(entt::entity { entity });
|
||||
}
|
||||
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
|
||||
#include "inferno/assertions.h"
|
||||
#include "inferno/scene/components.h"
|
||||
#include "inferno/scene/scene.h"
|
||||
#include "inferno/script/lua.h"
|
||||
#include "inferno/script/nativescript.h"
|
||||
#include "inferno/systems/script.h"
|
||||
#include <bits/stdint-uintn.h>
|
||||
|
||||
namespace Inferno {
|
||||
|
||||
@@ -20,11 +21,16 @@ namespace Inferno {
|
||||
|
||||
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 : view) {
|
||||
cleanup(static_cast<uint32_t>(entity));
|
||||
for (auto entity : nativeScriptView) {
|
||||
cleanup(nativeScriptView.get<NativeScriptComponent>(entity));
|
||||
}
|
||||
|
||||
auto luaScriptView = m_scene->registry()->view<LuaScriptComponent>();
|
||||
|
||||
for (auto entity : luaScriptView) {
|
||||
cleanup(luaScriptView.get<LuaScriptComponent>(entity));
|
||||
}
|
||||
|
||||
delete s_instance;
|
||||
@@ -34,11 +40,11 @@ namespace Inferno {
|
||||
void ScriptSystem::update(float deltaTime)
|
||||
{
|
||||
// @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) {
|
||||
nativeScript.instance = nativeScript.initialize();
|
||||
nativeScript.instance->transform = &transform;
|
||||
@@ -50,16 +56,53 @@ namespace Inferno {
|
||||
nativeScript.instance->transform = &transform;
|
||||
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)
|
||||
{
|
||||
if (m_scene->hasComponent<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) {
|
||||
nativeScript.instance->destroy();
|
||||
nativeScript.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptSystem::cleanup(LuaScriptComponent& luaScript)
|
||||
{
|
||||
if (luaScript.instance) {
|
||||
luaScript.instance->destroy();
|
||||
delete luaScript.instance;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
#ifndef SCRIPT_SYSTEM_H
|
||||
#define SCRIPT_SYSTEM_H
|
||||
|
||||
#include <memory> //std::shared_ptr
|
||||
#include <cstdint> // uint32_t
|
||||
|
||||
namespace Inferno {
|
||||
|
||||
struct NativeScriptComponent;
|
||||
struct LuaScriptComponent;
|
||||
|
||||
class Scene;
|
||||
|
||||
class ScriptSystem {
|
||||
@@ -14,6 +17,8 @@ namespace Inferno {
|
||||
void update(float deltaTime);
|
||||
|
||||
void cleanup(uint32_t entity);
|
||||
void cleanup(NativeScriptComponent& nativeScript);
|
||||
void cleanup(LuaScriptComponent& luaScript);
|
||||
|
||||
void setScene(Scene* scene) { m_scene = scene; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user