#pragma once #include "angelscript.h" #include "scriptbuilder.h" #include #include class ScriptEngine { public: ScriptEngine(); ~ScriptEngine(); bool Initialize(); void Shutdown(); bool CompileScript(const std::string& filename); bool CompileModule(const std::string& moduleName, const std::string& filename, asIScriptModule** outModule); bool CallModuleFunction(asIScriptModule* module, const std::string& decl); void CallScriptFunction(asIScriptFunction* func, float dt = 0.0f); void CallScriptFunction(asIScriptFunction* func, unsigned int entityId, float dt); void GarbageCollect(); // Add a path used to resolve #include directives in scripts void AddIncludePath(const std::string& path); // Try to preserve script state across hot-reloads by calling optional // __SerializeState()/__DeserializeState() hooks in the script module. std::string CaptureScriptState(); void RestoreScriptState(const std::string &state); asIScriptEngine* GetEngine() const { return engine; } asIScriptModule* GetCurrentModule() const { return currentModule; } asIScriptFunction* GetUpdateFunction() const { return updateFunc; } asIScriptFunction* GetInitFunction() const { return initFunc; } asIScriptFunction* GetShutdownFunction() const { return shutdownFunc; } // Create and release script object instances for entity scripts asIScriptObject* CreateObjectInstance(asIScriptModule* module, const std::string& className); void ReleaseObjectInstance(asIScriptObject* obj); // Retrieve an object's method by declaration (e.g. "void Update(uint, float)") asIScriptFunction* GetObjectMethod(asIScriptModule* module, const std::string& className, const std::string& methodDecl); // Call an object method; method must be an object method (use GetObjectMethod) void CallObjectMethod(asIScriptFunction* method, asIScriptObject* object, unsigned int entityId, float dt); // Call a scene object method (Init/Update/Shutdown) without entity id void CallSceneObjectMethod(asIScriptFunction* method, asIScriptObject* object, float dt = 0.0f); private: asIScriptEngine* engine; asIScriptFunction* updateFunc; asIScriptFunction* initFunc; asIScriptFunction* shutdownFunc; asIScriptModule* currentModule; bool hasValidScript; std::vector includePaths; static void MessageCallback(const asSMessageInfo* msg, void* param); static int IncludeCallback(const char* include, const char* from, CScriptBuilder* builder, void* userParam); std::string ReadFile(const std::string& filename); void ClearCachedFunctions(); };