diff --git a/Source/Scripting/Scripting/LuaManager.cpp b/Source/Scripting/Scripting/LuaManager.cpp index 92ec264f..3157cedb 100644 --- a/Source/Scripting/Scripting/LuaManager.cpp +++ b/Source/Scripting/Scripting/LuaManager.cpp @@ -381,6 +381,9 @@ namespace Scripting if (StringUtils::BeginsWith(relativePathAsString, "API/") || StringUtils::BeginsWith(relativePathAsString, "Bootstrap/")) continue; + if (!_developerMode && StringUtils::BeginsWith(relativePathAsString, "Editor/")) + continue; + std::string pathStr = path.string(); u32 depth = GetPathDepth(scriptBootstrapDirectoryAsString, pathStr); paths.push_back({ depth, path }); diff --git a/Source/Scripting/Scripting/LuaManager.h b/Source/Scripting/Scripting/LuaManager.h index edf8ba33..01a3ec8e 100644 --- a/Source/Scripting/Scripting/LuaManager.h +++ b/Source/Scripting/Scripting/LuaManager.h @@ -30,6 +30,16 @@ namespace Scripting void SetDirty() { _isDirty = true; } void ClearDirty() { _isDirty = false; } + // When false, scripts under {scriptDir}/Editor/ are excluded from the load. + bool IsDeveloperMode() const { return _developerMode; } + void SetDeveloperMode(bool enabled) + { + if (enabled == _developerMode) + return; + _developerMode = enabled; + SetDirty(); + } + ZenithStateManager& GetZenithStateManager() { return _zenithStateManager; @@ -57,6 +67,7 @@ namespace Scripting private: bool _isDirty = false; + bool _developerMode = true; u64 _currentTick = 0; u64 _lastRecompiledTick = 0; diff --git a/Source/Scripting/Scripting/LuaMethodTable.h b/Source/Scripting/Scripting/LuaMethodTable.h index 4a6cf6a8..2a7cf62f 100644 --- a/Source/Scripting/Scripting/LuaMethodTable.h +++ b/Source/Scripting/Scripting/LuaMethodTable.h @@ -12,12 +12,33 @@ namespace Scripting { + // Per-entry filter for LuaMethodTable::Set: entries overlapping excludeFlags are skipped. + enum class LuaMethodFlags : u32 + { + None = 0, + DeveloperOnly = 1 << 0, + }; + + inline constexpr LuaMethodFlags operator|(LuaMethodFlags a, LuaMethodFlags b) + { + return static_cast(static_cast(a) | static_cast(b)); + } + inline constexpr LuaMethodFlags operator&(LuaMethodFlags a, LuaMethodFlags b) + { + return static_cast(static_cast(a) & static_cast(b)); + } + inline constexpr bool HasAnyFlag(LuaMethodFlags value, LuaMethodFlags mask) + { + return (value & mask) != LuaMethodFlags::None; + } + template struct LuaRegister { public: const char* name; typename std::conditional, i32(*)(Zenith*), i32(*)(Zenith*, UserDataType*)>::type func; + LuaMethodFlags flags = LuaMethodFlags::None; }; template @@ -112,7 +133,7 @@ namespace Scripting } template - static void Set(Zenith* zenith, const LuaRegister (&methodTable)[N], const char* globalName = nullptr) + static void Set(Zenith* zenith, const LuaRegister (&methodTable)[N], const char* globalName = nullptr, LuaMethodFlags excludeFlags = LuaMethodFlags::None) { static_assert(std::is_same_v || std::is_same_v || std::is_base_of_v, "LuaMetaTable::Set - LuaRegister's UserDataType must either match LuaMetaTable's UserDataType, be derived from it or be void"); constexpr bool isGlobal = std::is_same_v; @@ -147,6 +168,9 @@ namespace Scripting { const auto& method = methodTable[i]; + if (HasAnyFlag(method.flags, excludeFlags)) + continue; + lua_pushstring(zenith->state, method.name); lua_pushlightuserdata(zenith->state, (void*)&method);