Merge pull request #6365 from aws-lumberyard-dev/Atom/guthadam/materialcomponent/workaround_for_lost_image_overrides_with_prefabs
Temporary fix for material component losing image overrides with prefabs
This commit is contained in:
+33
@@ -104,6 +104,7 @@ namespace AZ
|
||||
MaterialComponentController::MaterialComponentController(const MaterialComponentConfig& config)
|
||||
: m_configuration(config)
|
||||
{
|
||||
ConvertAssetsForSerialization();
|
||||
}
|
||||
|
||||
void MaterialComponentController::Activate(EntityId entityId)
|
||||
@@ -135,6 +136,7 @@ namespace AZ
|
||||
void MaterialComponentController::SetConfiguration(const MaterialComponentConfig& config)
|
||||
{
|
||||
m_configuration = config;
|
||||
ConvertAssetsForSerialization();
|
||||
}
|
||||
|
||||
const MaterialComponentConfig& MaterialComponentController::GetConfiguration() const
|
||||
@@ -338,6 +340,7 @@ namespace AZ
|
||||
// before LoadMaterials() is called [LYN-2249]
|
||||
auto temp = m_configuration.m_materials;
|
||||
m_configuration.m_materials = materials;
|
||||
ConvertAssetsForSerialization();
|
||||
LoadMaterials();
|
||||
}
|
||||
|
||||
@@ -489,6 +492,7 @@ namespace AZ
|
||||
auto& materialAssignment = m_configuration.m_materials[materialAssignmentId];
|
||||
const bool wasEmpty = materialAssignment.m_propertyOverrides.empty();
|
||||
materialAssignment.m_propertyOverrides[AZ::Name(propertyName)] = value;
|
||||
ConvertAssetsForSerialization();
|
||||
|
||||
if (materialAssignment.RequiresLoading())
|
||||
{
|
||||
@@ -586,6 +590,7 @@ namespace AZ
|
||||
auto& materialAssignment = m_configuration.m_materials[materialAssignmentId];
|
||||
const bool wasEmpty = materialAssignment.m_propertyOverrides.empty();
|
||||
materialAssignment.m_propertyOverrides = propertyOverrides;
|
||||
ConvertAssetsForSerialization();
|
||||
|
||||
if (materialAssignment.RequiresLoading())
|
||||
{
|
||||
@@ -667,5 +672,33 @@ namespace AZ
|
||||
TickBus::Handler::BusConnect();
|
||||
}
|
||||
}
|
||||
|
||||
void MaterialComponentController::ConvertAssetsForSerialization()
|
||||
{
|
||||
for (auto& materialAssignmentPair : m_configuration.m_materials)
|
||||
{
|
||||
MaterialAssignment& materialAssignment = materialAssignmentPair.second;
|
||||
for (auto& propertyPair : materialAssignment.m_propertyOverrides)
|
||||
{
|
||||
auto& value = propertyPair.second;
|
||||
if (value.is<AZ::Data::Asset<AZ::Data::AssetData>>())
|
||||
{
|
||||
value = AZStd::any_cast<AZ::Data::Asset<AZ::Data::AssetData>>(value).GetId();
|
||||
}
|
||||
else if (value.is<AZ::Data::Asset<AZ::RPI::StreamingImageAsset>>())
|
||||
{
|
||||
value = AZStd::any_cast<AZ::Data::Asset<AZ::RPI::StreamingImageAsset>>(value).GetId();
|
||||
}
|
||||
else if (value.is<AZ::Data::Asset<AZ::RPI::ImageAsset>>())
|
||||
{
|
||||
value = AZStd::any_cast<AZ::Data::Asset<AZ::RPI::ImageAsset>>(value).GetId();
|
||||
}
|
||||
else if (value.is<AZ::Data::Instance<AZ::RPI::Image>>())
|
||||
{
|
||||
value = AZStd::any_cast<AZ::Data::Instance<AZ::RPI::Image>>(value)->GetAssetId();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace Render
|
||||
} // namespace AZ
|
||||
|
||||
+5
@@ -99,6 +99,11 @@ namespace AZ
|
||||
//! Queue material instance recreation notifiucations until tick
|
||||
void QueueMaterialUpdateNotification();
|
||||
|
||||
//! Converts property overrides storing image asset references into asset IDs. This addresses a problem where image property
|
||||
//! overrides are lost during prefab serialization and patching. This suboptimal function will be removed once the underlying
|
||||
//! problem is resolved.
|
||||
void ConvertAssetsForSerialization();
|
||||
|
||||
EntityId m_entityId;
|
||||
MaterialComponentConfig m_configuration;
|
||||
AZStd::unordered_set<MaterialAssignmentId> m_materialsWithDirtyProperties;
|
||||
|
||||
Reference in New Issue
Block a user