From 6fd4ef735ed71d9c35f1c296e9b4bc72b3b997af Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 12 Aug 2025 23:35:12 +0200 Subject: [PATCH] Add `InvokeOnUpdate` to C++ scripting api --- Source/Engine/Scripting/Scripting.cpp | 29 +++++++++++++++++++++++++++ Source/Engine/Scripting/Scripting.h | 5 +++++ 2 files changed, 34 insertions(+) diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index 593092b8f..db6867d34 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -106,6 +106,7 @@ namespace MMethod* _method_LateFixedUpdate = nullptr; MMethod* _method_Draw = nullptr; MMethod* _method_Exit = nullptr; + Array> UpdateActions; Dictionary> _nonNativeModules; #if USE_EDITOR bool LastBinariesLoadTriggeredCompilation = false; @@ -242,6 +243,27 @@ void ScriptingService::Update() PROFILE_CPU_NAMED("Scripting::Update"); INVOKE_EVENT(Update); + // Flush update actions + _objectsLocker.Lock(); + int32 count = UpdateActions.Count(); + for (int32 i = 0; i < count; i++) + { + UpdateActions[i](); + } + int32 newlyAdded = UpdateActions.Count() - count; + if (newlyAdded == 0) + UpdateActions.Clear(); + else + { + // Someone added another action within current callback + Array> tmp; + for (int32 i = newlyAdded; i < UpdateActions.Count(); i++) + tmp.Add(UpdateActions[i]); + UpdateActions.Clear(); + UpdateActions.Add(tmp); + } + _objectsLocker.Unlock(); + #ifdef USE_NETCORE // Force GC to run in background periodically to avoid large blocking collections causing hitches if (Time::Update.TicksCount % 60 == 0) @@ -303,6 +325,13 @@ void Scripting::ProcessBuildInfoPath(String& path, const String& projectFolderPa path = projectFolderPath / path; } +void Scripting::InvokeOnUpdate(const Function& action) +{ + _objectsLocker.Lock(); + UpdateActions.Add(action); + _objectsLocker.Unlock(); +} + bool Scripting::LoadBinaryModules(const String& path, const String& projectFolderPath) { PROFILE_CPU_NAMED("LoadBinaryModules"); diff --git a/Source/Engine/Scripting/Scripting.h b/Source/Engine/Scripting/Scripting.h index be5e9ca34..1e7daf6f0 100644 --- a/Source/Engine/Scripting/Scripting.h +++ b/Source/Engine/Scripting/Scripting.h @@ -230,6 +230,11 @@ public: static void ProcessBuildInfoPath(String& path, const String& projectFolderPath); + /// + /// Calls the given action on the next scripting update. + /// + /// The action to invoke. + static void InvokeOnUpdate(const Function& action); private: static bool LoadBinaryModules(const String& path, const String& projectFolderPath);