@ -110,12 +110,14 @@ namespace AZ
m_queuedMaterialUpdateNotification = false ;
MaterialComponentRequestBus : : Handler : : BusConnect ( m_entityId ) ;
MaterialReceiverNotificationBus : : Handler : : BusConnect ( m_entityId ) ;
LoadMaterials ( ) ;
}
void MaterialComponentController : : Deactivate ( )
{
MaterialComponentRequestBus : : Handler : : BusDisconnect ( ) ;
MaterialReceiverNotificationBus : : Handler : : BusDisconnect ( ) ;
TickBus : : Handler : : BusDisconnect ( ) ;
ReleaseMaterials ( ) ;
@ -214,13 +216,29 @@ namespace AZ
bool anyQueued = false ;
for ( auto & materialPair : m_configuration . m_materials )
{
auto & materialAsset = materialPair . second . m_materialAsset ;
if ( materialPair . second . m_materialInstancePreCreated )
{
continue ;
}
if ( materialPair . second . m_materialAsset . GetId ( ) . IsValid ( ) & &
! Data : : AssetBus : : MultiHandler : : BusIsConnectedId ( materialPair . second . m_materialAsset . GetId ( ) ) )
{
anyQueued = true ;
materialPair . second . m_materialAsset . QueueLoad ( ) ;
Data : : AssetBus : : MultiHandler : : BusConnect ( materialPair . second . m_materialAsset . GetId ( ) ) ;
continue ;
}
materialPair . second . m_defaultMaterialAsset = AZ : : Data : : Asset < AZ : : RPI : : MaterialAsset > (
GetDefaultMaterialAssetId ( materialPair . first ) , AZ : : AzTypeInfo < AZ : : RPI : : MaterialAsset > : : Uuid ( ) ) ;
if ( materialAsset . GetId ( ) . IsValid ( ) & & ! Data : : AssetBus : : MultiHandler : : BusIsConnectedId ( materialAsset . GetId ( ) ) )
if ( materialPair . second . m_defaultMaterialAsset . GetId ( ) . IsValid ( ) & &
! Data : : AssetBus : : MultiHandler : : BusIsConnectedId ( materialPair . second . m_defaultMaterialAsset . GetId ( ) ) )
{
anyQueued = true ;
materialAsset . QueueLoad ( ) ;
Data : : AssetBus : : MultiHandler : : BusConnect ( materialAsset . GetId ( ) ) ;
material Pair. second . m_defaultMaterial Asset. QueueLoad ( ) ;
Data : : AssetBus : : MultiHandler : : BusConnect ( material Pair. second . m_defaultMaterial Asset. GetId ( ) ) ;
}
}
@ -236,13 +254,22 @@ namespace AZ
for ( auto & materialPair : m_configuration . m_materials )
{
auto & materialAsset = materialPair . second . m_materialAsset ;
if ( materialAsset . GetId ( ) = = asset . GetId ( ) )
if ( materialPair . second . m_materialAsset . GetId ( ) = = asset . GetId ( ) )
{
materialPair . second . m_materialAsset = asset ;
}
if ( materialPair . second . m_materialAsset . GetId ( ) . IsValid ( ) & & ! materialPair . second . m_materialAsset . IsReady ( ) )
{
materialAsset = asset ;
allReady = false ;
}
if ( materialPair . second . m_defaultMaterialAsset . GetId ( ) = = asset . GetId ( ) )
{
materialPair . second . m_defaultMaterialAsset = asset ;
}
if ( materialAsset . GetId ( ) . IsValid ( ) & & ! materialAsset . IsReady ( ) )
if ( material Pair. second . m_defaultMaterial Asset. GetId ( ) . IsValid ( ) & & ! m aterialPair. second . m_defaultM aterialAsset. IsReady ( ) )
{
allReady = false ;
}
@ -268,11 +295,7 @@ namespace AZ
for ( auto & materialPair : m_configuration . m_materials )
{
if ( materialPair . second . m_materialAsset . GetId ( ) . IsValid ( ) )
{
materialPair . second . m_materialAsset . Release ( ) ;
materialPair . second . m_materialInstance = nullptr ;
}
materialPair . second . Release ( ) ;
}
MaterialComponentNotificationBus : : Event ( m_entityId , & MaterialComponentNotifications : : OnMaterialsUpdated , m_configuration . m_materials ) ;
@ -459,18 +482,21 @@ namespace AZ
void MaterialComponentController : : SetPropertyOverride ( const MaterialAssignmentId & materialAssignmentId , const AZStd : : string & propertyName , const AZStd : : any & value )
{
auto & materialAssignment = m_configuration . m_materials [ materialAssignmentId ] ;
const bool wasEmpty = materialAssignment . m_propertyOverrides . empty ( ) ;
materialAssignment . m_propertyOverrides [ AZ : : Name ( propertyName ) ] = value ;
// When applying property overrides for the first time, new instance needs to be created in case the current instance is already used somewhere else to keep overrides local
if ( materialAssignment . m_propertyOverrides . empty ( ) )
if ( materialAssignment . RequiresLoading ( ) )
{
materialAssignment . m_propertyOverrides [ AZ : : Name ( propertyName ) ] = value ;
materialAssignment . RebuildInstance ( ) ;
MaterialComponentNotificationBus : : Event ( m_entityId , & MaterialComponentNotifications : : OnMaterialInstanceCreated , materialAssignment ) ;
QueueMaterialUpdateNotification ( ) ;
LoadMaterials ( ) ;
return ;
}
else
if ( wasEmpty ! = materialAssignment . m_propertyOverrides . empty ( ) )
{
materialAssignment . m_propertyOverrides [ AZ : : Name ( propertyName ) ] = value ;
materialAssignment . RebuildInstance ( ) ;
MaterialComponentNotificationBus : : Event (
m_entityId , & MaterialComponentNotifications : : OnMaterialInstanceCreated , materialAssignment ) ;
QueueMaterialUpdateNotification ( ) ;
}
QueuePropertyChanges ( materialAssignmentId ) ;
@ -703,6 +729,12 @@ namespace AZ
const bool wasEmpty = materialAssignment . m_propertyOverrides . empty ( ) ;
materialAssignment . m_propertyOverrides = propertyOverrides ;
if ( materialAssignment . RequiresLoading ( ) )
{
LoadMaterials ( ) ;
return ;
}
if ( wasEmpty ! = materialAssignment . m_propertyOverrides . empty ( ) )
{
materialAssignment . RebuildInstance ( ) ;
@ -712,14 +744,11 @@ namespace AZ
QueuePropertyChanges ( materialAssignmentId ) ;
}
MaterialPropertyOverrideMap MaterialComponentController : : GetPropertyOverrides ( const MaterialAssignmentId & materialAssignmentId ) const
MaterialPropertyOverrideMap MaterialComponentController : : GetPropertyOverrides (
const MaterialAssignmentId & materialAssignmentId ) const
{
const auto materialIt = m_configuration . m_materials . find ( materialAssignmentId ) ;
if ( materialIt = = m_configuration . m_materials . end ( ) )
{
return { } ;
}
return materialIt - > second . m_propertyOverrides ;
return materialIt ! = m_configuration . m_materials . end ( ) ? materialIt - > second . m_propertyOverrides : MaterialPropertyOverrideMap ( ) ;
}
void MaterialComponentController : : SetModelUvOverrides (
@ -729,6 +758,12 @@ namespace AZ
const bool wasEmpty = materialAssignment . m_matModUvOverrides . empty ( ) ;
materialAssignment . m_matModUvOverrides = modelUvOverrides ;
if ( materialAssignment . RequiresLoading ( ) )
{
LoadMaterials ( ) ;
return ;
}
if ( wasEmpty ! = materialAssignment . m_matModUvOverrides . empty ( ) )
{
materialAssignment . RebuildInstance ( ) ;
@ -742,11 +777,19 @@ namespace AZ
const MaterialAssignmentId & materialAssignmentId ) const
{
const auto materialIt = m_configuration . m_materials . find ( materialAssignmentId ) ;
if ( materialIt = = m_configuration . m_materials . end ( ) )
return materialIt ! = m_configuration . m_materials . end ( ) ? materialIt - > second . m_matModUvOverrides : AZ : : RPI : : MaterialModelUvOverrideMap ( ) ;
}
void MaterialComponentController : : OnMaterialAssignmentsChanged ( )
{
for ( const auto & materialPair : m_configuration . m_materials )
{
return { } ;
if ( materialPair . second . RequiresLoading ( ) )
{
LoadMaterials ( ) ;
return ;
}
}
return materialIt - > second . m_matModUvOverrides ;
}
void MaterialComponentController : : QueuePropertyChanges ( const MaterialAssignmentId & materialAssignmentId )