From 880473819381a81bfbd0a9b9cd6ba8dd8f6e2f0a Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 19 Jul 2024 07:42:57 -0500 Subject: [PATCH 1/4] Allow for Initializing children injected via scene loading. --- Source/Engine/Level/Level.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 95f3d7f0f..218d0677d 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -930,6 +930,9 @@ bool Level::loadScene(rapidjson_flax::Value& data, int32 engineBuild, Scene** ou // Fire event CallSceneEvent(SceneEventType::OnSceneLoading, scene, sceneId); + // Get any injected children of the scene. + Array injectedSceneChildren = scene->Children; + // Loaded scene objects list CollectionPoolCache::ScopeCache sceneObjects = ActorsCache::SceneObjectsListCache.Get(); const int32 dataCount = (int32)data.Size(); @@ -1031,6 +1034,18 @@ bool Level::loadScene(rapidjson_flax::Value& data, int32 engineBuild, Scene** ou // /\ all above this has to be done on multiple threads at once // \/ all below this has to be done on an any thread + // Add injected children of scene (via OnSceneLoading) into sceneObjects to be initialized + for (auto child : injectedSceneChildren) + { + sceneObjects->Add(child); + if (!child->IsRegistered()) + { + child->RegisterObject(); + } + LOG(Warning, "{}", child->GetName()); + } + sceneObjects->Resize(dataCount + injectedSceneChildren.Count()); + // Synchronize prefab instances (prefab may have objects removed or reordered so deserialized instances need to synchronize with it) // TODO: resave and force sync scenes during game cooking so this step could be skipped in game SceneObjectsFactory::SynchronizePrefabInstances(context, prefabSyncData); @@ -1047,7 +1062,7 @@ bool Level::loadScene(rapidjson_flax::Value& data, int32 engineBuild, Scene** ou PROFILE_CPU_NAMED("Initialize"); SceneObject** objects = sceneObjects->Get(); - for (int32 i = 0; i < dataCount; i++) + for (int32 i = 0; i < dataCount + injectedSceneChildren.Count(); i++) { SceneObject* obj = objects[i]; if (obj) From d717430256a52de9b997b10bcf75334c46821608 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 19 Jul 2024 07:48:01 -0500 Subject: [PATCH 2/4] Clean up code --- Source/Engine/Level/Level.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 218d0677d..63a79eb3a 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -1042,7 +1042,6 @@ bool Level::loadScene(rapidjson_flax::Value& data, int32 engineBuild, Scene** ou { child->RegisterObject(); } - LOG(Warning, "{}", child->GetName()); } sceneObjects->Resize(dataCount + injectedSceneChildren.Count()); From 8a297a6fd4d6978531d9162df6bdb078f12df5ba Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 19 Jul 2024 07:59:57 -0500 Subject: [PATCH 3/4] Clean up code more. --- Source/Engine/Level/Level.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 63a79eb3a..b1ac5f890 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -1043,7 +1043,6 @@ bool Level::loadScene(rapidjson_flax::Value& data, int32 engineBuild, Scene** ou child->RegisterObject(); } } - sceneObjects->Resize(dataCount + injectedSceneChildren.Count()); // Synchronize prefab instances (prefab may have objects removed or reordered so deserialized instances need to synchronize with it) // TODO: resave and force sync scenes during game cooking so this step could be skipped in game @@ -1061,7 +1060,7 @@ bool Level::loadScene(rapidjson_flax::Value& data, int32 engineBuild, Scene** ou PROFILE_CPU_NAMED("Initialize"); SceneObject** objects = sceneObjects->Get(); - for (int32 i = 0; i < dataCount + injectedSceneChildren.Count(); i++) + for (int32 i = 0; i < sceneObjects->Count(); i++) { SceneObject* obj = objects[i]; if (obj) From 305f725394d1fe9407b65b99eaa468f12e9284d9 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 19 Jul 2024 08:19:34 -0500 Subject: [PATCH 4/4] Ensure to add all scene objects of injected actors. --- Source/Engine/Level/Level.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index b1ac5f890..f24a853e3 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -1037,10 +1037,14 @@ bool Level::loadScene(rapidjson_flax::Value& data, int32 engineBuild, Scene** ou // Add injected children of scene (via OnSceneLoading) into sceneObjects to be initialized for (auto child : injectedSceneChildren) { - sceneObjects->Add(child); - if (!child->IsRegistered()) + Array injectedSceneObjects; + injectedSceneObjects.Add(child); + SceneQuery::GetAllSceneObjects(child, injectedSceneObjects); + for (auto o : injectedSceneObjects) { - child->RegisterObject(); + if (!o->IsRegistered()) + o->RegisterObject(); + sceneObjects->Add(o); } }