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)