diff --git a/Source/Engine/Level/Prefabs/Prefab.Apply.cpp b/Source/Engine/Level/Prefabs/Prefab.Apply.cpp index c0029aa93..c9d94dfe8 100644 --- a/Source/Engine/Level/Prefabs/Prefab.Apply.cpp +++ b/Source/Engine/Level/Prefabs/Prefab.Apply.cpp @@ -367,6 +367,17 @@ bool PrefabInstanceData::SynchronizePrefabInstances(Array& p Level::callActorEvent(Level::ActorEventType::OnActorActiveChanged, actor, nullptr); Level::callActorEvent(Level::ActorEventType::OnActorOrderInParentChanged, actor, nullptr); } + + // Preserve order in parent (values from prefab are used) + if (i != 0) + { + auto prefab = Content::Load(prefabId); + const auto defaultInstance = prefab ? prefab->GetDefaultInstance(obj->GetPrefabObjectID()) : nullptr; + if (defaultInstance) + { + obj->SetOrderInParent(defaultInstance->GetOrderInParent()); + } + } } } @@ -784,6 +795,20 @@ bool Prefab::ApplyAllInternal(Actor* targetActor, bool linkTargetActorObjectToPr obj->Deserialize(diffDataDocument[dataIndex], modifier.Value); sceneObjects->Add(obj); + + // Synchronize order of the scene objects with the serialized data (eg. user reordered actors in prefab editor and applied changes) + if (i != 0) + { + for (int32 j = 0; j < targetObjects->Count(); j++) + { + SceneObject* targetObject = targetObjects->At(j); + if (targetObject->GetPrefabObjectID() == obj->GetID()) + { + obj->SetOrderInParent(targetObject->GetOrderInParent()); + break; + } + } + } } else { diff --git a/Source/Engine/Level/SceneObjectsFactory.cpp b/Source/Engine/Level/SceneObjectsFactory.cpp index a5cb27712..a140b103c 100644 --- a/Source/Engine/Level/SceneObjectsFactory.cpp +++ b/Source/Engine/Level/SceneObjectsFactory.cpp @@ -257,6 +257,16 @@ void SceneObjectsFactory::SynchronizePrefabInstances(Array& sceneO // Reparent obj->SetParent(actualParent, false); } + + // Preserve order in parent (values from prefab are used) + if (i != 0) + { + const auto defaultInstance = prefab ? prefab->GetDefaultInstance(obj->GetPrefabObjectID()) : nullptr; + if (defaultInstance) + { + obj->SetOrderInParent(defaultInstance->GetOrderInParent()); + } + } } // Check all actors with prefab linkage for adding missing objects diff --git a/Source/Engine/Serialization/JsonTools.cpp b/Source/Engine/Serialization/JsonTools.cpp index fad907f45..1a8da00eb 100644 --- a/Source/Engine/Serialization/JsonTools.cpp +++ b/Source/Engine/Serialization/JsonTools.cpp @@ -100,6 +100,8 @@ void ChangeIds(rapidjson_flax::Value& obj, rapidjson_flax::Document& document, c void JsonTools::ChangeIds(Document& doc, const Dictionary& mapping) { + if (mapping.IsEmpty()) + return; ::ChangeIds(doc, doc, mapping); }