diff --git a/Source/Editor/Utilities/EditorScene.cpp b/Source/Editor/Utilities/EditorScene.cpp index 764b79184..7060baac5 100644 --- a/Source/Editor/Utilities/EditorScene.cpp +++ b/Source/Editor/Utilities/EditorScene.cpp @@ -20,4 +20,6 @@ void EditorScene::Update() e.Call(); for (auto& e : Ticking.FixedUpdate.Ticks) e.Call(); + for (auto& e : Ticking.LateFixedUpdate.Ticks) + e.Call(); } diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 9e3bc1915..124a415cd 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -138,6 +138,7 @@ public: void Update() override; void LateUpdate() override; void FixedUpdate() override; + void LateFixedUpdate() override; void Dispose() override; }; @@ -242,96 +243,60 @@ void LayersAndTagsSettings::Apply() } } -void LevelService::Update() -{ - PROFILE_CPU_NAMED("Level::Update"); - - ScopeLock lock(Level::ScenesLock); - auto& scenes = Level::Scenes; - - // Update all actors - if (!Time::GetGamePaused() && Level::TickEnabled) - { - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.Update.Tick(); - } +#define TICK_LEVEL(tickingStage, name) \ + PROFILE_CPU_NAMED(name); \ + ScopeLock lock(Level::ScenesLock); \ + auto& scenes = Level::Scenes; \ + if (!Time::GetGamePaused() && Level::TickEnabled) \ + { \ + for (int32 i = 0; i < scenes.Count(); i++) \ + { \ + if (scenes[i]->GetIsActive()) \ + scenes[i]->Ticking.tickingStage.Tick(); \ + } \ } #if USE_EDITOR - else if (!Editor::IsPlayMode) - { - // Run event for script executed in editor - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.Update.TickExecuteInEditor(); - } +#define TICK_LEVEL_EDITOR(tickingStage) \ + else if (!Editor::IsPlayMode) \ + { \ + for (int32 i = 0; i < scenes.Count(); i++) \ + { \ + if (scenes[i]->GetIsActive()) \ + scenes[i]->Ticking.tickingStage.TickExecuteInEditor(); \ + } \ } +#else +#define TICK_LEVEL_EDITOR(tickingStage) #endif + +void LevelService::Update() +{ + TICK_LEVEL(Update, "Level::Update") + TICK_LEVEL_EDITOR(Update) } void LevelService::LateUpdate() { - PROFILE_CPU_NAMED("Level::LateUpdate"); - - ScopeLock lock(Level::ScenesLock); - auto& scenes = Level::Scenes; - - // Update all actors - if (!Time::GetGamePaused() && Level::TickEnabled) - { - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.LateUpdate.Tick(); - } - } -#if USE_EDITOR - else if (!Editor::IsPlayMode) - { - // Run event for script executed in editor - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.LateUpdate.TickExecuteInEditor(); - } - } -#endif - - // Flush actions + TICK_LEVEL(LateUpdate, "Level::LateUpdate") + TICK_LEVEL_EDITOR(LateUpdate) flushActions(); } void LevelService::FixedUpdate() { - PROFILE_CPU_NAMED("Level::FixedUpdate"); - - ScopeLock lock(Level::ScenesLock); - auto& scenes = Level::Scenes; - - // Update all actors - if (!Time::GetGamePaused() && Level::TickEnabled) - { - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.FixedUpdate.Tick(); - } - } -#if USE_EDITOR - else if (!Editor::IsPlayMode) - { - // Run event for script executed in editor - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.FixedUpdate.TickExecuteInEditor(); - } - } -#endif + TICK_LEVEL(FixedUpdate, "Level::FixedUpdate") + TICK_LEVEL_EDITOR(FixedUpdate) } +void LevelService::LateFixedUpdate() +{ + TICK_LEVEL(LateFixedUpdate, "Level::LateFixedUpdate") + TICK_LEVEL_EDITOR(LateFixedUpdate) +} + +#undef TICK_LEVEL +#undef TICK_LEVEL_EDITOR + void LevelService::Dispose() { ScopeLock lock(_sceneActionsLocker); diff --git a/Source/Engine/Level/Scene/SceneTicking.cpp b/Source/Engine/Level/Scene/SceneTicking.cpp index 7aeee452b..235d7bbab 100644 --- a/Source/Engine/Level/Scene/SceneTicking.cpp +++ b/Source/Engine/Level/Scene/SceneTicking.cpp @@ -145,7 +145,6 @@ void SceneTicking::AddScript(Script* obj) LateUpdate.AddScript(obj); if (obj->_tickLateFixedUpdate) LateFixedUpdate.AddScript(obj); - } void SceneTicking::RemoveScript(Script* obj)