Implement lua script into script system
This commit is contained in:
@@ -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 });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user