From 75b4d62dcb2ae68d5900e5d5d9c07d5269e5a246 Mon Sep 17 00:00:00 2001 From: Chris Santora Date: Tue, 20 Jul 2021 16:59:25 -0700 Subject: [PATCH] Restored the version converter EditorMaterialComponent::ConvertVersion for version 3, which wasn't possible with an earlier version of my changes. Signed-off-by: santorac <55155825+santorac@users.noreply.github.com> --- .../Material/EditorMaterialComponent.cpp | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp index 866b2dec56..d2f8c1daa0 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp @@ -45,8 +45,57 @@ namespace AZ if (classElement.GetVersion() < 3) { - AZ_Error("EditorMaterialComponent", false, "Material Component version < 3 is no longer supported"); - return false; + // The default material was changed from an asset to an EditorMaterialComponentSlot and old data must be converted + constexpr AZ::u32 defaultMaterialAssetDataCrc = AZ_CRC("defaultMaterialAsset", 0x736fc071); + + Data::Asset oldDefaultMaterialData; + if (!classElement.GetChildData(defaultMaterialAssetDataCrc, oldDefaultMaterialData)) + { + AZ_Error("AZ::Render::EditorMaterialComponent::ConvertVersion", false, "Failed to get defaultMaterialAsset element"); + return false; + } + + if (!classElement.RemoveElementByName(defaultMaterialAssetDataCrc)) + { + AZ_Error("AZ::Render::EditorMaterialComponent::ConvertVersion", false, "Failed to remove defaultMaterialAsset element"); + return false; + } + + EditorMaterialComponentSlot newDefaultMaterialData; + newDefaultMaterialData.m_id = DefaultMaterialAssignmentId; + newDefaultMaterialData.m_materialAsset = oldDefaultMaterialData; + classElement.AddElementWithData(context, "defaultMaterialSlot", newDefaultMaterialData); + + // Slots now support and display the default material asset when empty + // The old placeholder assignments are irrelevant and must be cleared + constexpr AZ::u32 materialSlotsByLodDataCrc = AZ_CRC("materialSlotsByLod", 0xb1498db6); + + EditorMaterialComponentSlotsByLodContainer lodSlotData; + if (!classElement.GetChildData(materialSlotsByLodDataCrc, lodSlotData)) + { + AZ_Error("AZ::Render::EditorMaterialComponent::ConvertVersion", false, "Failed to get materialSlotsByLod element"); + return false; + } + + if (!classElement.RemoveElementByName(materialSlotsByLodDataCrc)) + { + AZ_Error("AZ::Render::EditorMaterialComponent::ConvertVersion", false, "Failed to remove materialSlotsByLod element"); + return false; + } + + // Find and clear all slots that are assigned to the slot's default value + for (auto& lodSlots : lodSlotData) + { + for (auto& slot : lodSlots) + { + if (slot.m_materialAsset.GetId() == slot.m_defaultMaterialAsset.GetId()) + { + slot.m_materialAsset = {}; + } + } + } + + classElement.AddElementWithData(context, "materialSlotsByLod", lodSlotData); } if (classElement.GetVersion() < 4)