From 71c6b3e506a52622ba9f749ab201f8edcd69ba0f Mon Sep 17 00:00:00 2001 From: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> Date: Tue, 6 Jul 2021 14:17:21 -0500 Subject: [PATCH] Refresh cached transforms before saving. (#1858) If the prefab template saves default values for a cached transform, but *shouldn't* have default values, it will get patch application errors at runtime due to missing cached transform fields. Signed-off-by: mbalfour --- Code/Tools/SerializeContextTools/SliceConverter.cpp | 13 +++++++++++++ Code/Tools/SerializeContextTools/SliceConverter.h | 1 + 2 files changed, 14 insertions(+) diff --git a/Code/Tools/SerializeContextTools/SliceConverter.cpp b/Code/Tools/SerializeContextTools/SliceConverter.cpp index 0ffe7427e7..5730f2c8d6 100644 --- a/Code/Tools/SerializeContextTools/SliceConverter.cpp +++ b/Code/Tools/SerializeContextTools/SliceConverter.cpp @@ -330,6 +330,7 @@ namespace AZ prefabPlaceholderEntities.clear(); for (size_t curEntityIdx = 0; curEntityIdx < sliceEntities.size(); curEntityIdx++) { + UpdateCachedTransform(*(sliceEntities[curEntityIdx])); sourceInstance->AddEntity(*(sliceEntities[curEntityIdx]), entityAliases[curEntityIdx]); } @@ -631,12 +632,14 @@ namespace AZ AZ_Assert(false, "Couldn't find nested instance %s", it->c_str()); } } + UpdateCachedTransform(*entity); addingInstance->AddEntity(*entity, mappingStruct.m_entityAlias); addedEntityList.emplace_back(entity, addingInstance); } else { AZ_Assert(false, "Failed to find entity alias."); + UpdateCachedTransform(*entity); nestedInstance->AddEntity(*entity); addedEntityList.emplace_back(entity, nestedInstance.get()); } @@ -781,6 +784,16 @@ namespace AZ } } + void SliceConverter::UpdateCachedTransform(const AZ::Entity& entity) + { + AzToolsFramework::Components::TransformComponent* transformComponent = + entity.FindComponent(); + if (transformComponent) + { + transformComponent->UpdateCachedWorldTransform(); + } + } + void SliceConverter::PrintPrefab(AzToolsFramework::Prefab::TemplateId templateId) { auto prefabSystemComponentInterface = AZ::Interface::Get(); diff --git a/Code/Tools/SerializeContextTools/SliceConverter.h b/Code/Tools/SerializeContextTools/SliceConverter.h index 07fddc8fa1..1e6aec4208 100644 --- a/Code/Tools/SerializeContextTools/SliceConverter.h +++ b/Code/Tools/SerializeContextTools/SliceConverter.h @@ -72,6 +72,7 @@ namespace AZ bool ConvertSliceInstance( AZ::SliceComponent::SliceInstance& instance, AZ::Data::Asset& sliceAsset, AzToolsFramework::Prefab::TemplateReference nestedTemplate, AzToolsFramework::Prefab::Instance* topLevelInstance); + void UpdateCachedTransform(const AZ::Entity& entity); void SetParentEntity(const AZ::Entity& entity, const AZ::EntityId& parentId, bool onlySetIfInvalid); void PrintPrefab(AzToolsFramework::Prefab::TemplateId templateId); bool SavePrefab(AZ::IO::PathView outputPath, AzToolsFramework::Prefab::TemplateId templateId);