Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/scripting/StarLuaRoot.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/scripting/StarLuaRoot.hpp')
-rw-r--r--source/game/scripting/StarLuaRoot.hpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/source/game/scripting/StarLuaRoot.hpp b/source/game/scripting/StarLuaRoot.hpp
new file mode 100644
index 0000000..7335952
--- /dev/null
+++ b/source/game/scripting/StarLuaRoot.hpp
@@ -0,0 +1,68 @@
+#ifndef STAR_LUA_ROOT_HPP
+#define STAR_LUA_ROOT_HPP
+
+#include "StarThread.hpp"
+#include "StarLua.hpp"
+#include "StarRoot.hpp"
+
+namespace Star {
+
+STAR_CLASS(LuaRoot);
+
+// Loads and caches lua scripts from assets. Automatically clears cache on
+// root reload. Uses an internal LuaEngine, so this and all contexts are meant
+// for single threaded access and have no locking.
+class LuaRoot {
+public:
+ LuaRoot();
+ ~LuaRoot();
+
+ void loadScript(String const& assetPath);
+ bool scriptLoaded(String const& assetPath) const;
+ void unloadScript(String const& assetPath);
+
+ // A script context can be created from the combination of several scripts,
+ // the functions / data in each script will be loaded in order, so that later
+ // specified scripts will overwrite previous ones.
+ //
+ // The LuaContext that is returned will have its 'require' function
+ // overloaded to take absolute asset paths and load that asset path as a lua
+ // module, with protection from duplicate loading.
+ LuaContext createContext(String const& script);
+ LuaContext createContext(StringList const& scriptPaths = {});
+
+ void collectGarbage(Maybe<unsigned> steps = {});
+ void setAutoGarbageCollection(bool autoGarbageColleciton);
+ void tuneAutoGarbageCollection(float pause, float stepMultiplier);
+ size_t luaMemoryUsage() const;
+
+ size_t scriptCacheMemoryUsage() const;
+ void clearScriptCache() const;
+
+ LuaEngine& luaEngine() const;
+
+private:
+ class ScriptCache {
+ public:
+ void loadScript(LuaEngine& engine, String const& assetPath);
+ bool scriptLoaded(String const& assetPath) const;
+ void unloadScript(String const& assetPath);
+ void clear();
+ void loadContextScript(LuaContext& context, String const& assetPath);
+ size_t memoryUsage() const;
+
+ private:
+ mutable RecursiveMutex mutex;
+ StringMap<ByteArray> scripts;
+ };
+
+ LuaEnginePtr m_luaEngine;
+ shared_ptr<ScriptCache> m_scriptCache;
+ ListenerPtr m_rootReloadListener;
+
+ String m_storageDirectory;
+};
+
+}
+
+#endif