@ -228,22 +228,22 @@ namespace MaterialEditor
return false ;
}
AZ : : IO : : BasicPath < AZStd : : string > exportFolder ( m_absolutePath ) ;
exportFolder . RemoveFilename ( ) ;
// create source data from properties
MaterialSourceData sourceData ;
sourceData . m_materialType = m_materialSourceData . m_materialType ;
sourceData . m_parentMaterial = m_materialSourceData . m_parentMaterial ;
AZ_Assert ( m_materialAsset & & m_materialAsset - > GetMaterialTypeAsset ( ) , " When IsOpen() is true, these assets should not be null. " ) ;
sourceData . m_materialTypeVersion = m_materialAsset - > GetMaterialTypeAsset ( ) - > GetVersion ( ) ;
// Force save data to store forward slashes
AzFramework : : StringFunc : : Replace ( sourceData . m_materialType , " \\ " , " / " ) ;
AzFramework : : StringFunc : : Replace ( sourceData . m_parentMaterial , " \\ " , " / " ) ;
sourceData . m_propertyLayoutVersion = m_materialTypeSourceData . m_propertyLayout . m_version ;
sourceData . m_materialType = AZ : : IO : : PathView ( m_materialSourceData . m_materialType ) . LexicallyRelative ( exportFolder ) . StringAsPosix ( ) ;
sourceData . m_parentMaterial = AZ : : IO : : PathView ( m_materialSourceData . m_parentMaterial ) . LexicallyRelative ( exportFolder ) . StringAsPosix ( ) ;
// populate sourceData with modified or overwritten properties
const bool savedProperties = SavePropertiesToSourceData ( sourceData , [ ] ( const AtomToolsFramework : : DynamicProperty & property ) {
return ! AtomToolsFramework : : ArePropertyValuesEqual ( property . GetValue ( ) , property . GetConfig ( ) . m_parentValue ) ;
} ) ;
const bool savedProperties = SavePropertiesToSourceData (
exportFolder , sourceData ,
[ ] ( const AtomToolsFramework : : DynamicProperty & property )
{
return ! AtomToolsFramework : : ArePropertyValuesEqual ( property . GetValue ( ) , property . GetConfig ( ) . m_parentValue ) ;
} ) ;
if ( ! savedProperties )
{
@ -302,22 +302,22 @@ namespace MaterialEditor
return false ;
}
AZ : : IO : : BasicPath < AZStd : : string > exportFolder ( normalizedSavePath ) ;
exportFolder . RemoveFilename ( ) ;
// create source data from properties
MaterialSourceData sourceData ;
sourceData . m_materialType = m_materialSourceData . m_materialType ;
sourceData . m_parentMaterial = m_materialSourceData . m_parentMaterial ;
AZ_Assert ( m_materialAsset & & m_materialAsset - > GetMaterialTypeAsset ( ) , " When IsOpen() is true, these assets should not be null. " ) ;
sourceData . m_materialTypeVersion = m_materialAsset - > GetMaterialTypeAsset ( ) - > GetVersion ( ) ;
// Force save data to store forward slashes
AzFramework : : StringFunc : : Replace ( sourceData . m_materialType , " \\ " , " / " ) ;
AzFramework : : StringFunc : : Replace ( sourceData . m_parentMaterial , " \\ " , " / " ) ;
sourceData . m_propertyLayoutVersion = m_materialTypeSourceData . m_propertyLayout . m_version ;
sourceData . m_materialType = AZ : : IO : : PathView ( m_materialSourceData . m_materialType ) . LexicallyRelative ( exportFolder ) . StringAsPosix ( ) ;
sourceData . m_parentMaterial = AZ : : IO : : PathView ( m_materialSourceData . m_parentMaterial ) . LexicallyRelative ( exportFolder ) . StringAsPosix ( ) ;
// populate sourceData with modified or overwritten properties
const bool savedProperties = SavePropertiesToSourceData ( sourceData , [ ] ( const AtomToolsFramework : : DynamicProperty & property ) {
return ! AtomToolsFramework : : ArePropertyValuesEqual ( property . GetValue ( ) , property . GetConfig ( ) . m_parentValue ) ;
} ) ;
const bool savedProperties = SavePropertiesToSourceData (
exportFolder , sourceData ,
[ ] ( const AtomToolsFramework : : DynamicProperty & property )
{
return ! AtomToolsFramework : : ArePropertyValuesEqual ( property . GetValue ( ) , property . GetConfig ( ) . m_parentValue ) ;
} ) ;
if ( ! savedProperties )
{
@ -375,17 +375,18 @@ namespace MaterialEditor
return false ;
}
AZ : : IO : : BasicPath < AZStd : : string > exportFolder ( normalizedSavePath ) ;
exportFolder . RemoveFilename ( ) ;
// create source data from properties
MaterialSourceData sourceData ;
sourceData . m_materialType = m_materialSourceData . m_materialType ;
AZ_Assert ( m_materialAsset & & m_materialAsset - > GetMaterialTypeAsset ( ) , " When IsOpen() is true, these assets should not be null. " ) ;
sourceData . m_materialTypeVersion = m_materialAsset - > GetMaterialTypeAsset ( ) - > GetVersion ( ) ;
sourceData . m_propertyLayoutVersion = m_materialTypeSourceData . m_propertyLayout . m_version ;
sourceData . m_materialType = AZ : : IO : : PathView ( m_materialSourceData . m_materialType ) . LexicallyRelative ( exportFolder ) . StringAsPosix ( ) ;
// Only assign a parent path if the source was a .material
if ( AzFramework : : StringFunc : : Path : : IsExtension ( m_relativePath . c_str ( ) , MaterialSourceData : : Extension ) )
{
sourceData . m_parentMaterial = m_relativePath ;
sourceData . m_parentMaterial = AZ: : IO : : PathView ( m_absolutePath ) . LexicallyRelative ( exportFolder ) . StringAsPosix ( ) ;
}
// Force save data to store forward slashes
@ -393,9 +394,12 @@ namespace MaterialEditor
AzFramework : : StringFunc : : Replace ( sourceData . m_parentMaterial , " \\ " , " / " ) ;
// populate sourceData with modified properties
const bool savedProperties = SavePropertiesToSourceData ( sourceData , [ ] ( const AtomToolsFramework : : DynamicProperty & property ) {
return ! AtomToolsFramework : : ArePropertyValuesEqual ( property . GetValue ( ) , property . GetConfig ( ) . m_originalValue ) ;
} ) ;
const bool savedProperties = SavePropertiesToSourceData (
exportFolder , sourceData ,
[ ] ( const AtomToolsFramework : : DynamicProperty & property )
{
return ! AtomToolsFramework : : ArePropertyValuesEqual ( property . GetValue ( ) , property . GetConfig ( ) . m_originalValue ) ;
} ) ;
if ( ! savedProperties )
{
@ -590,7 +594,10 @@ namespace MaterialEditor
}
}
bool MaterialDocument : : SavePropertiesToSourceData ( AZ : : RPI : : MaterialSourceData & sourceData , PropertyFilterFunction propertyFilter ) const
bool MaterialDocument : : SavePropertiesToSourceData (
const AZ : : IO : : BasicPath < AZStd : : string > & exportFolder ,
AZ : : RPI : : MaterialSourceData & sourceData ,
PropertyFilterFunction propertyFilter ) const
{
using namespace AZ ;
using namespace RPI ;
@ -598,7 +605,7 @@ namespace MaterialEditor
bool result = true ;
// populate sourceData with properties that meet the filter
m_materialTypeSourceData . EnumerateProperties ( [ this , & sourceData , & propertyFilter , & result ] ( const AZStd : : string & groupName , const AZStd : : string & propertyName , const auto & propertyDefinition ) {
m_materialTypeSourceData . EnumerateProperties ( [ & ] ( const AZStd : : string & groupName , const AZStd : : string & propertyName , const auto & propertyDefinition ) {
const MaterialPropertyId propertyId ( groupName , propertyName ) ;
@ -608,7 +615,7 @@ namespace MaterialEditor
MaterialPropertyValue propertyValue = AtomToolsFramework : : ConvertToRuntimeType ( it - > second . GetValue ( ) ) ;
if ( propertyValue . IsValid ( ) )
{
if ( ! m_materialTypeSourceData. ConvertPropertyValueToSourceDataFormat ( propertyDefinition , propertyValue ) )
if ( ! AtomToolsFramework: : ConvertToExportFormat ( exportFolder , propertyDefinition , propertyValue ) )
{
AZ_Error ( " MaterialDocument " , false , " Material document property could not be converted: '%s' in '%s'. " , propertyId . GetFullName ( ) . GetCStr ( ) , m_absolutePath . c_str ( ) ) ;
result = false ;
@ -662,8 +669,6 @@ namespace MaterialEditor
return false ;
}
AZStd : : string materialTypeSourceFilePath ;
// The material document and inspector are constructed from source data
if ( AzFramework : : StringFunc : : Path : : IsExtension ( m_absolutePath . c_str ( ) , MaterialSourceData : : Extension ) )
{
@ -676,27 +681,29 @@ namespace MaterialEditor
// We must also always load the material type data for a complete, ordered set of the
// groups and properties that will be needed for comparison and building the inspector
materialTypeSourceFilePath = AssetUtils : : ResolvePathReference ( m_absolutePath , m_materialSourceData . m_materialType ) ;
auto materialTypeOutcome = MaterialUtils : : LoadMaterialTypeSourceData ( materialTypeSourceFilePath ) ;
if ( ! materialTypeOutcome . IsSuccess ( ) )
if ( ! m_materialSourceData . m_parentMaterial . empty ( ) )
{
AZ_Error( " MaterialDocument " , false , " Material type source data could not be loaded: '%s'. " , materialTypeSourceFilePath . c_str ( ) ) ;
return false ;
m_materialSourceData . m_parentMaterial =
AssetUtils : : ResolvePathReference ( m_absolutePath , m_materialSourceData . m_parentMaterial ) ;
}
m_materialTypeSourceData = materialTypeOutcome . GetValue ( ) ;
if ( MaterialSourceData : : ApplyVersionUpdatesResult : : Failed = = m_materialSourceData . ApplyVersionUpdates ( m_absolutePath ) )
if ( ! m_materialSourceData . m_materialType . empty ( ) )
{
m_materialSourceData . m_materialType = AssetUtils : : ResolvePathReference ( m_absolutePath , m_materialSourceData . m_materialType ) ;
}
auto materialTypeOutcome = MaterialUtils : : LoadMaterialTypeSourceData ( m_materialSourceData . m_materialType ) ;
if ( ! materialTypeOutcome . IsSuccess ( ) )
{
AZ_Error ( " MaterialDocument " , false , " Material source data could not be auto updated to the latest version of the material type: '%s'. " , m_materialSourceData . m_materialType . c_str ( ) ) ;
AZ_Error ( " MaterialDocument " , false , " Material type source data could not be loaded : '%s'." , m_materialSourceData . m_materialType . c_str ( ) ) ;
return false ;
}
m_materialTypeSourceData = materialTypeOutcome . GetValue ( ) ;
}
else if ( AzFramework : : StringFunc : : Path : : IsExtension ( m_absolutePath . c_str ( ) , MaterialTypeSourceData : : Extension ) )
{
materialTypeSourceFilePath = m_absolutePath ;
// Load the material type source data, which will be used for enumerating properties and building material source data
auto materialTypeOutcome = MaterialUtils : : LoadMaterialTypeSourceData ( m aterialTypeSourceFil ePath) ;
auto materialTypeOutcome = MaterialUtils : : LoadMaterialTypeSourceData ( m_absolutePath ) ;
if ( ! materialTypeOutcome . IsSuccess ( ) )
{
AZ_Error ( " MaterialDocument " , false , " Material type source data could not be loaded: '%s'. " , m_absolutePath . c_str ( ) ) ;
@ -706,7 +713,7 @@ namespace MaterialEditor
// The document represents a material, not a material type.
// If the input data is a material type file we have to generate the material source data by referencing it.
m_materialSourceData . m_materialType = m_ rel ativ ePath;
m_materialSourceData . m_materialType = m_ absolu tePath;
m_materialSourceData . m_parentMaterial . clear ( ) ;
}
else
@ -877,7 +884,8 @@ namespace MaterialEditor
m_properties [ propertyConfig . m_id ] = AtomToolsFramework : : DynamicProperty ( propertyConfig ) ;
}
const MaterialFunctorSourceData : : EditorContext editorContext = MaterialFunctorSourceData : : EditorContext ( materialTypeSourceFilePath , m_materialAsset - > GetMaterialPropertiesLayout ( ) ) ;
const MaterialFunctorSourceData : : EditorContext editorContext =
MaterialFunctorSourceData : : EditorContext ( m_materialSourceData . m_materialType , m_materialAsset - > GetMaterialPropertiesLayout ( ) ) ;
for ( Ptr < MaterialFunctorSourceDataHolder > functorData : m_materialTypeSourceData . m_materialFunctorSourceData )
{
MaterialFunctorSourceData : : FunctorResult result2 = functorData - > CreateFunctor ( editorContext ) ;