From 558a7d99ffb281f413580c1347e297ce4df00304 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Mon, 27 Mar 2023 17:43:32 +0300 Subject: [PATCH 1/2] Add LateFixedUpdate event for scripts --- Source/Engine/Engine/Engine.cpp | 13 +++++++++++++ Source/Engine/Engine/Engine.h | 10 ++++++++++ Source/Engine/Engine/EngineService.cpp | 1 + Source/Engine/Engine/EngineService.h | 1 + Source/Engine/Scripting/Script.h | 7 +++++++ Source/Engine/Scripting/Scripting.cpp | 8 ++++++++ Source/Engine/Scripting/Scripting.cs | 16 +++++++++++++--- 7 files changed, 53 insertions(+), 3 deletions(-) diff --git a/Source/Engine/Engine/Engine.cpp b/Source/Engine/Engine/Engine.cpp index 07038f146..58a435cbb 100644 --- a/Source/Engine/Engine/Engine.cpp +++ b/Source/Engine/Engine/Engine.cpp @@ -65,6 +65,7 @@ Action Engine::FixedUpdate; Action Engine::Update; TaskGraph* Engine::UpdateGraph = nullptr; Action Engine::LateUpdate; +Action Engine::LateFixedUpdate; Action Engine::Draw; Action Engine::Pause; Action Engine::Unpause; @@ -198,6 +199,7 @@ int32 Engine::Main(const Char* cmdLine) if (Time::OnBeginPhysics()) { OnFixedUpdate(); + OnLateFixedUpdate(); Time::OnEndPhysics(); } @@ -273,6 +275,17 @@ void Engine::OnFixedUpdate() } } +void Engine::OnLateFixedUpdate() +{ + PROFILE_CPU_NAMED("Late Fixed Update"); + + // Call event + LateFixedUpdate(); + + // Update services + EngineService::OnLateFixedUpdate(); +} + void Engine::OnUpdate() { PROFILE_CPU_NAMED("Update"); diff --git a/Source/Engine/Engine/Engine.h b/Source/Engine/Engine/Engine.h index 6f8c5fe6e..31d1f6ea6 100644 --- a/Source/Engine/Engine/Engine.h +++ b/Source/Engine/Engine/Engine.h @@ -54,6 +54,11 @@ public: /// static Action LateUpdate; + /// + /// Event called after engine update. + /// + static Action LateFixedUpdate; + /// /// Event called during frame rendering and can be used to invoke custom rendering with GPUDevice. /// @@ -107,6 +112,11 @@ public: /// static void OnLateUpdate(); + /// + /// Late fixed update callback. + /// + static void OnLateFixedUpdate(); + /// /// Draw callback. /// diff --git a/Source/Engine/Engine/EngineService.cpp b/Source/Engine/Engine/EngineService.cpp index ac58ba40c..204e926f1 100644 --- a/Source/Engine/Engine/EngineService.cpp +++ b/Source/Engine/Engine/EngineService.cpp @@ -33,6 +33,7 @@ static bool CompareEngineServices(EngineService* const& a, EngineService* const& DEFINE_ENGINE_SERVICE_EVENT(FixedUpdate); DEFINE_ENGINE_SERVICE_EVENT(Update); DEFINE_ENGINE_SERVICE_EVENT(LateUpdate); +DEFINE_ENGINE_SERVICE_EVENT(LateFixedUpdate); DEFINE_ENGINE_SERVICE_EVENT(Draw); DEFINE_ENGINE_SERVICE_EVENT_INVERTED(BeforeExit); diff --git a/Source/Engine/Engine/EngineService.h b/Source/Engine/Engine/EngineService.h index f4ae1b271..a142455d0 100644 --- a/Source/Engine/Engine/EngineService.h +++ b/Source/Engine/Engine/EngineService.h @@ -44,6 +44,7 @@ public: DECLARE_ENGINE_SERVICE_EVENT(void, FixedUpdate); DECLARE_ENGINE_SERVICE_EVENT(void, Update); DECLARE_ENGINE_SERVICE_EVENT(void, LateUpdate); + DECLARE_ENGINE_SERVICE_EVENT(void, LateFixedUpdate); DECLARE_ENGINE_SERVICE_EVENT(void, Draw); DECLARE_ENGINE_SERVICE_EVENT(void, BeforeExit); DECLARE_ENGINE_SERVICE_EVENT(void, Dispose); diff --git a/Source/Engine/Scripting/Script.h b/Source/Engine/Scripting/Script.h index 2304ea57c..769771f46 100644 --- a/Source/Engine/Scripting/Script.h +++ b/Source/Engine/Scripting/Script.h @@ -108,6 +108,13 @@ public: { } + /// + /// Called every fixed framerate frame (after FixedUpdate) if object is enabled. + /// + API_FUNCTION(Attributes = "NoAnimate") virtual void OnLateFixedUpdate() + { + } + /// /// Called during drawing debug shapes in editor. Use to draw debug shapes and other visualization. /// diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index 8796c7587..bec0e6c20 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -46,6 +46,7 @@ public: void Update() override; void LateUpdate() override; void FixedUpdate() override; + void LateFixedUpdate() override; void Draw() override; void BeforeExit() override; void Dispose() override; @@ -100,6 +101,7 @@ namespace MMethod* _method_Update = nullptr; MMethod* _method_LateUpdate = nullptr; MMethod* _method_FixedUpdate = nullptr; + MMethod* _method_LateFixedUpdate = nullptr; MMethod* _method_Draw = nullptr; MMethod* _method_Exit = nullptr; Array> _nonNativeModules; @@ -210,6 +212,12 @@ void ScriptingService::FixedUpdate() INVOKE_EVENT(FixedUpdate); } +void ScriptingService::LateFixedUpdate() +{ + PROFILE_CPU_NAMED("Scripting::LateFixedUpdate"); + INVOKE_EVENT(LateFixedUpdate); +} + void ScriptingService::Draw() { PROFILE_CPU_NAMED("Scripting::Draw"); diff --git a/Source/Engine/Scripting/Scripting.cs b/Source/Engine/Scripting/Scripting.cs index 204401867..7a91b2d96 100644 --- a/Source/Engine/Scripting/Scripting.cs +++ b/Source/Engine/Scripting/Scripting.cs @@ -80,17 +80,22 @@ namespace FlaxEngine public static event Action Update; /// - /// Occurs on scripting 'late' update. + /// Occurs on scripting late update. /// public static event Action LateUpdate; /// - /// Occurs on scripting `fixed` update. + /// Occurs on scripting fixed update. /// public static event Action FixedUpdate; /// - /// Occurs on scripting `draw` update. Called during frame rendering and can be used to invoke custom rendering with GPUDevice. + /// Occurs on scripting late fixed update. + /// + public static event Action LateFixedUpdate; + + /// + /// Occurs on scripting draw update. Called during frame rendering and can be used to invoke custom rendering with GPUDevice. /// public static event Action Draw; @@ -302,6 +307,11 @@ namespace FlaxEngine FixedUpdate?.Invoke(); } + internal static void Internal_LateFixedUpdate() + { + LateFixedUpdate?.Invoke(); + } + internal static void Internal_Draw() { Draw?.Invoke(); From de7c6483e0236a7a15bd4fad97c079d17a6ecccc Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Thu, 11 May 2023 21:09:33 +0300 Subject: [PATCH 2/2] Add LateFixedUpdate event for C# scripts --- Source/Engine/Level/Scene/SceneTicking.cpp | 19 +++++++++++++++++++ Source/Engine/Level/Scene/SceneTicking.h | 12 ++++++++++++ Source/Engine/Scripting/Script.cpp | 2 ++ Source/Engine/Scripting/Script.h | 1 + 4 files changed, 34 insertions(+) diff --git a/Source/Engine/Level/Scene/SceneTicking.cpp b/Source/Engine/Level/Scene/SceneTicking.cpp index 8998a4b37..7aeee452b 100644 --- a/Source/Engine/Level/Scene/SceneTicking.cpp +++ b/Source/Engine/Level/Scene/SceneTicking.cpp @@ -121,6 +121,19 @@ void SceneTicking::LateUpdateTickData::TickScripts(const Array& scripts } } +SceneTicking::LateFixedUpdateTickData::LateFixedUpdateTickData() + : TickData(64) +{ +} + +void SceneTicking::LateFixedUpdateTickData::TickScripts(const Array& scripts) +{ + for (auto* script : scripts) + { + script->OnLateFixedUpdate(); + } +} + void SceneTicking::AddScript(Script* obj) { ASSERT_LOW_LAYER(obj && obj->GetParent() && obj->GetParent()->GetScene()); @@ -130,6 +143,9 @@ void SceneTicking::AddScript(Script* obj) Update.AddScript(obj); if (obj->_tickLateUpdate) LateUpdate.AddScript(obj); + if (obj->_tickLateFixedUpdate) + LateFixedUpdate.AddScript(obj); + } void SceneTicking::RemoveScript(Script* obj) @@ -141,6 +157,8 @@ void SceneTicking::RemoveScript(Script* obj) Update.RemoveScript(obj); if (obj->_tickLateUpdate) LateUpdate.RemoveScript(obj); + if (obj->_tickLateFixedUpdate) + LateFixedUpdate.RemoveScript(obj); } void SceneTicking::Clear() @@ -148,4 +166,5 @@ void SceneTicking::Clear() FixedUpdate.Clear(); Update.Clear(); LateUpdate.Clear(); + LateFixedUpdate.Clear(); } diff --git a/Source/Engine/Level/Scene/SceneTicking.h b/Source/Engine/Level/Scene/SceneTicking.h index 230861087..7d590c8e7 100644 --- a/Source/Engine/Level/Scene/SceneTicking.h +++ b/Source/Engine/Level/Scene/SceneTicking.h @@ -109,6 +109,13 @@ public: void TickScripts(const Array& scripts) override; }; + class FLAXENGINE_API LateFixedUpdateTickData : public TickData + { + public: + LateFixedUpdateTickData(); + void TickScripts(const Array& scripts) override; + }; + public: /// /// Adds the script to scene ticking system. @@ -142,4 +149,9 @@ public: /// The late update tick function. /// LateUpdateTickData LateUpdate; + + /// + /// The late fixed update tick function. + /// + LateFixedUpdateTickData LateFixedUpdate; }; diff --git a/Source/Engine/Scripting/Script.cpp b/Source/Engine/Scripting/Script.cpp index 3f8df354c..8eaff42de 100644 --- a/Source/Engine/Scripting/Script.cpp +++ b/Source/Engine/Scripting/Script.cpp @@ -26,6 +26,7 @@ Script::Script(const SpawnParams& params) , _tickFixedUpdate(false) , _tickUpdate(false) , _tickLateUpdate(false) + , _tickLateFixedUpdate(false) , _wasStartCalled(false) , _wasEnableCalled(false) { @@ -181,6 +182,7 @@ void Script::SetupType() _tickUpdate |= type.Script.ScriptVTable[8] != nullptr; _tickLateUpdate |= type.Script.ScriptVTable[9] != nullptr; _tickFixedUpdate |= type.Script.ScriptVTable[10] != nullptr; + _tickLateFixedUpdate |= type.Script.ScriptVTable[11] != nullptr; } typeHandle = type.GetBaseType(); } diff --git a/Source/Engine/Scripting/Script.h b/Source/Engine/Scripting/Script.h index 769771f46..49cba0ec4 100644 --- a/Source/Engine/Scripting/Script.h +++ b/Source/Engine/Scripting/Script.h @@ -19,6 +19,7 @@ protected: int32 _tickFixedUpdate : 1; int32 _tickUpdate : 1; int32 _tickLateUpdate : 1; + int32 _tickLateFixedUpdate : 1; int32 _wasStartCalled : 1; int32 _wasEnableCalled : 1; #if USE_EDITOR