From 06803040ac03828cd72449dcdd52dd73111a4184 Mon Sep 17 00:00:00 2001 From: srikappa Date: Tue, 27 Apr 2021 15:36:44 -0700 Subject: [PATCH 1/2] Fixed an assert during loading a level with prefabs --- .../AzToolsFramework/Prefab/Link/Link.cpp | 6 ++---- .../AzToolsFramework/Prefab/Link/Link.h | 2 +- .../Prefab/PrefabSystemComponent.cpp | 21 +++++++++---------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp index 621a00b0bf..9e88ecf444 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp @@ -108,11 +108,9 @@ namespace AzToolsFramework m_targetTemplateId = id; } - void Link::SetTemplatePatches(const PrefabDomValue& patches) + void Link::SetLinkDom(const PrefabDomValue& linkDom) { - PrefabDom newPatches; - newPatches.CopyFrom(patches, newPatches.GetAllocator()); - m_linkDom.Swap(newPatches); + m_linkDom.CopyFrom(linkDom, m_linkDom.GetAllocator()); } void Link::SetInstanceName(const char* instanceName) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.h index c36dd75b1b..073e619f20 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.h @@ -47,7 +47,7 @@ namespace AzToolsFramework void SetSourceTemplateId(TemplateId id); void SetTargetTemplateId(TemplateId id); - void SetTemplatePatches(const PrefabDomValue& patches); + void SetLinkDom(const PrefabDomValue& linkDom); void SetInstanceName(const char* instanceName); bool IsValid() const; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index d89a388e91..f2f743337f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -760,21 +760,20 @@ namespace AzToolsFramework PrefabDomValue& instance = instanceIterator->value; + PrefabDomValueReference sourceTemplateName = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::SourceName); + AZ_Assert(sourceTemplateName, "Couldn't find source template name in the DOM of the nested instance while creating a link."); + AZ_Assert( + sourceTemplateName->get() == sourceTemplate.GetFilePath().c_str(), + "The name of the source template in the nested instance DOM does not match the name of the source template already loaded"); + PrefabDomValueReference patchesReference = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::PatchesName); - if (!patchesReference.has_value()) + if (patchesReference.has_value()) { - PrefabDom& newLinkDom = link.GetLinkDom(); - - newLinkDom.SetObject(); - - newLinkDom.AddMember(rapidjson::StringRef(PrefabDomUtils::SourceName), - rapidjson::StringRef(sourceTemplate.GetFilePath().c_str()), newLinkDom.GetAllocator()); - } - else - { - link.SetTemplatePatches(patchesReference->get()); + AZ_Assert(patchesReference->get().IsArray(), "Patches in the nested instance DOM are not represented as an array."); } + link.SetLinkDom(instance); + if (!link.UpdateTarget()) { AZ_Error("Prefab", false, From 6947e8fe29c229fe6fba263d510c8d4fffa0b812 Mon Sep 17 00:00:00 2001 From: srikappa Date: Wed, 28 Apr 2021 12:14:55 -0700 Subject: [PATCH 2/2] Added an IsObject check for nested instance DOM during link creation that happens during prefab loading --- .../AzToolsFramework/Prefab/PrefabSystemComponent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index c697be437b..3f660bb73b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -782,7 +782,7 @@ namespace AzToolsFramework link.SetInstanceName(instanceName.data()); PrefabDomValue& instance = instanceIterator->value; - + AZ_Assert(instance.IsObject(), "Nested instance DOM provided is not a valid JSON object."); PrefabDomValueReference sourceTemplateName = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::SourceName); AZ_Assert(sourceTemplateName, "Couldn't find source template name in the DOM of the nested instance while creating a link."); AZ_Assert(