diff --git a/AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/MaterialInstanceGenerator.cpp b/AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/MaterialInstanceGenerator.cpp index 86464fe..dac8331 100644 --- a/AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/MaterialInstanceGenerator.cpp +++ b/AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/MaterialInstanceGenerator.cpp @@ -98,6 +98,11 @@ void UMaterialInstanceGenerator::PreFinishAssetGeneration() { const TSharedPtr AssetUserDataJson = AssetObjectProperties->GetField(TEXT("AssetUserData")); GetPropertySerializer()->DeserializePropertyValue(AssetUserDataProperty, AssetUserDataJson.ToSharedRef(), AssetUserData); + + // AssetUserData is deserialized in PRE_FINSHED, after the + // DATA_POPULATION save. Without marking the asset changed the package is not re-saved and the + // AssetUserData written here is lost (IsSimpleAssetUpToDate then fails on every re-run). + MarkAssetChanged(); } void EnsureStaticSwitchNodesPresent(UMaterial* Material, const FStaticParameterSet& StaticParameters) { diff --git a/AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/SimpleAssetGenerator.cpp b/AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/SimpleAssetGenerator.cpp index e7e908a..93358b4 100644 --- a/AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/SimpleAssetGenerator.cpp +++ b/AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/SimpleAssetGenerator.cpp @@ -16,6 +16,16 @@ void USimpleAssetGenerator::PopulateAssetWithData() { UE_LOG(LogAssetGenerator, Display, TEXT("%s %s is not up to date, regenerating data"), *ExistingAssetObject->GetClass()->GetName(), *ExistingAssetObject->GetPathName()); PopulateSimpleAssetWithData(ExistingAssetObject); + + // Commit d665fd6 ("Update to UE 5.6.1") + // moved data population out of CreateAssetPackage() (CONSTRUCTION, which always marks + // the asset changed) into this DATA_POPULATION stage, but never marks the asset as + // changed here. UAssetTypeGenerator::AdvanceGenerationState only saves when + // bAssetChanged is set, and the property serializer does not dirty the package, so + // every simple asset (MaterialInstance, PhysicalMaterial, MPC, DataAsset, curves...) + // was written to disk as the empty CONSTRUCTION shell and the populated data was lost. + // Marking the asset changed makes AdvanceGenerationState save the populated package. + MarkAssetChanged(); } }