From c081469a498c44967d6cbc2f2bf374996ca355f7 Mon Sep 17 00:00:00 2001 From: maelstrom Date: Thu, 24 Apr 2025 17:08:22 +0200 Subject: [PATCH] feat(lua): added basis for lua scripting --- core/CMakeLists.txt | 8 +++- core/src/lua.h | 7 ++++ core/src/objects/base/instance.h | 6 ++- core/src/objects/base/service.cpp | 3 ++ core/src/objects/base/service.h | 1 + core/src/objects/datamodel.cpp | 8 +++- core/src/objects/datamodel.h | 2 +- core/src/objects/jointsservice.cpp | 2 +- core/src/objects/meta.cpp | 14 +++++-- core/src/objects/script.cpp | 8 ++++ core/src/objects/script.h | 2 + core/src/objects/script/scriptcontext.cpp | 29 +++++++++++++++ core/src/objects/script/scriptcontext.h | 22 +++++++++++ .../objects/script/serverscriptservice.cpp | 37 +++++++++++++++++++ core/src/objects/script/serverscriptservice.h | 22 +++++++++++ editor/panes/explorermodel.cpp | 4 +- editor/placedocument.cpp | 3 +- 17 files changed, 164 insertions(+), 14 deletions(-) create mode 100644 core/src/lua.h create mode 100644 core/src/objects/script/scriptcontext.cpp create mode 100644 core/src/objects/script/scriptcontext.h create mode 100644 core/src/objects/script/serverscriptservice.cpp create mode 100644 core/src/objects/script/serverscriptservice.h diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b13d854..d9efe80 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -11,11 +11,15 @@ find_package(pugixml 1.15 REQUIRED) find_package(Stb REQUIRED) include_directories(${Stb_INCLUDE_DIR}) +# PkgConfig packages +find_package(PkgConfig REQUIRED) +pkg_check_modules(LUAJIT REQUIRED luajit) + file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h") add_library(openblocks STATIC ${SOURCES}) set_target_properties(openblocks PROPERTIES OUTPUT_NAME "openblocks") -target_link_libraries(openblocks ${GLEW_LIBRARIES} OpenGL::GL ReactPhysics3D::ReactPhysics3D pugixml::pugixml) -target_include_directories(openblocks PUBLIC "src" "../include") +target_link_libraries(openblocks ${GLEW_LIBRARIES} ${LUAJIT_LIBRARIES} OpenGL::GL ReactPhysics3D::ReactPhysics3D pugixml::pugixml) +target_include_directories(openblocks PUBLIC "src" "../include" ${LUAJIT_INCLUDE_DIR}) # Windows-specific dependencies if(WIN32) diff --git a/core/src/lua.h b/core/src/lua.h new file mode 100644 index 0000000..73131b5 --- /dev/null +++ b/core/src/lua.h @@ -0,0 +1,7 @@ +#pragma once +extern "C" { + #include + #include + #include + #include +} \ No newline at end of file diff --git a/core/src/objects/base/instance.h b/core/src/objects/base/instance.h index 5177126..d4de5f3 100644 --- a/core/src/objects/base/instance.h +++ b/core/src/objects/base/instance.h @@ -25,9 +25,11 @@ class Workspace; typedef int InstanceFlags; // This instance should only be instantiated in special circumstances (i.e. by DataModel) and should be creatable directly via any API -const InstanceFlags INSTANCE_NOTCREATABLE = (InstanceFlags)0x1; +const InstanceFlags INSTANCE_NOTCREATABLE = (InstanceFlags)1<<0; // This instance is a service -const InstanceFlags INSTANCE_SERVICE = (InstanceFlags)0x2; +const InstanceFlags INSTANCE_SERVICE = (InstanceFlags)1<<1; +// This instance should be hidden from the explorer +const InstanceFlags INSTANCE_HIDDEN = (InstanceFlags)1<<2; // Struct describing information about an instance struct InstanceType { diff --git a/core/src/objects/base/service.cpp b/core/src/objects/base/service.cpp index 3343569..d1ae37a 100644 --- a/core/src/objects/base/service.cpp +++ b/core/src/objects/base/service.cpp @@ -17,4 +17,7 @@ void Service::OnParentUpdated(std::optional> oldParent } void Service::InitService() { +} + +void Service::OnRun() { } \ No newline at end of file diff --git a/core/src/objects/base/service.h b/core/src/objects/base/service.h index 2b7f5ac..50da1d2 100644 --- a/core/src/objects/base/service.h +++ b/core/src/objects/base/service.h @@ -8,6 +8,7 @@ class Service : public Instance { protected: Service(const InstanceType* type); virtual void InitService(); + virtual void OnRun(); void OnParentUpdated(std::optional> oldParent, std::optional> newParent) override; diff --git a/core/src/objects/datamodel.cpp b/core/src/objects/datamodel.cpp index d7cd6ce..ef09d1b 100644 --- a/core/src/objects/datamodel.cpp +++ b/core/src/objects/datamodel.cpp @@ -4,6 +4,7 @@ #include "objects/base/refstate.h" #include "objects/base/service.h" #include "objects/meta.h" +#include "objects/script/serverscriptservice.h" #include "workspace.h" #include "logger.h" #include "panic.h" @@ -27,16 +28,19 @@ DataModel::DataModel() this->name = "Place"; } -void DataModel::Init() { +void DataModel::Init(bool runMode) { // Create the workspace if it doesn't exist if (this->services.count("Workspace") == 0) { this->services["Workspace"] = std::make_shared(); AddChild(this->services["Workspace"]); } + + GetService(); // Init all services for (auto [_, service] : this->services) { service->InitService(); + if (runMode) service->OnRun(); } } @@ -128,7 +132,7 @@ result, NoSuchService> DataModel::GetService(std::strin if (services.count(className) != 0) return std::dynamic_pointer_cast(services[className]); - if (!INSTANCE_MAP[className] || (INSTANCE_MAP[className]->flags ^ (INSTANCE_NOTCREATABLE | INSTANCE_SERVICE)) != 0) { + if (!INSTANCE_MAP[className] || ~(INSTANCE_MAP[className]->flags & (INSTANCE_NOTCREATABLE | INSTANCE_SERVICE)) == 0) { return NoSuchService(className); } diff --git a/core/src/objects/datamodel.h b/core/src/objects/datamodel.h index 35ea7f3..3ff6eac 100644 --- a/core/src/objects/datamodel.h +++ b/core/src/objects/datamodel.h @@ -24,7 +24,7 @@ public: std::optional currentFile; DataModel(); - void Init(); + void Init(bool runMode = false); static inline std::shared_ptr New() { return std::make_shared(); }; virtual const InstanceType* GetClass() override; diff --git a/core/src/objects/jointsservice.cpp b/core/src/objects/jointsservice.cpp index d13d489..1ba1734 100644 --- a/core/src/objects/jointsservice.cpp +++ b/core/src/objects/jointsservice.cpp @@ -6,7 +6,7 @@ const InstanceType JointsService::TYPE = { .super = &Instance::TYPE, .className = "JointsService", .constructor = &JointsService::Create, - .flags = INSTANCE_NOTCREATABLE | INSTANCE_SERVICE, + .flags = INSTANCE_NOTCREATABLE | INSTANCE_SERVICE | INSTANCE_HIDDEN, }; const InstanceType* JointsService::GetClass() { diff --git a/core/src/objects/meta.cpp b/core/src/objects/meta.cpp index a74fd78..8b3a473 100644 --- a/core/src/objects/meta.cpp +++ b/core/src/objects/meta.cpp @@ -4,15 +4,23 @@ #include "objects/part.h" #include "objects/joint/snap.h" #include "objects/script.h" +#include "objects/script/scriptcontext.h" +#include "objects/script/serverscriptservice.h" #include "objects/workspace.h" std::map INSTANCE_MAP = { { "Instance", &Instance::TYPE }, - { "Part", &Part::TYPE }, - { "Workspace", &Workspace::TYPE }, { "DataModel", &DataModel::TYPE }, + + { "Part", &Part::TYPE }, { "Snap", &Snap::TYPE }, { "JointInstance", &JointInstance::TYPE }, - { "JointsService", &JointsService::TYPE }, { "Script", &Script::TYPE }, + + // Services + + { "Workspace", &Workspace::TYPE }, + { "JointsService", &JointsService::TYPE }, + { "ScriptContext", &ScriptContext::TYPE }, + { "ServerScriptService", &ServerScriptService::TYPE }, }; \ No newline at end of file diff --git a/core/src/objects/script.cpp b/core/src/objects/script.cpp index a86b67e..c062949 100644 --- a/core/src/objects/script.cpp +++ b/core/src/objects/script.cpp @@ -28,4 +28,12 @@ Script::Script(): Instance(&TYPE) { } Script::~Script() { +} + +void Script::Run() { + +} + +void Script::Stop() { + // TODO: } \ No newline at end of file diff --git a/core/src/objects/script.h b/core/src/objects/script.h index 25c0e47..9d941c9 100644 --- a/core/src/objects/script.h +++ b/core/src/objects/script.h @@ -11,6 +11,8 @@ public: ~Script(); std::string source; + void Run(); + void Stop(); static inline std::shared_ptr