// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Materials/MaterialParameters.h" #include "HAL/Platform.h" #include "Containers/Map.h" #include "Materials/Material.h" #include "Materials/MaterialExpressionTextureBase.h" #include "Materials/MaterialInstanceConstant.h" #include "Materials/MaterialInterface.h" enum class EPackageSaveResolutionType : uint8; class UObject; class USkeletalMesh; class UTexture2D; class UTexture; class UMaterialInterface; class UMaterial; class CUSTOMIZABLEOBJECTEDITOR_API FUnrealBakeHelpers { public: static UObject* BakeHelper_DuplicateAsset(UObject* Object, const FString& ObjName, const FString& PkgName, TMap* ReplacementMap, const bool bGenerateConstantMaterialInstances, const EPackageSaveResolutionType SaveResolutionType); /** * Duplicates a texture asset. Duplicates Mutable and non Mutable textures. * * @param OrgTex Original source texture from which a Mutable texture has been generated. Only required when SrcTex is a Mutable texture. */ static UTexture2D* BakeHelper_CreateAssetTexture(UTexture2D* SourceTexture, const FString& TexObjName, const FString& TexPkgName, const UTexture* OrgTex, TMap* ReplacementMap, const EPackageSaveResolutionType SaveResolutionType); template static void CopyAllMaterialParameters(MaterialType& DestMaterial, UMaterialInterface& OriginMaterial, const TMap& TextureReplacementMap) { // Copy scalar parameters { TArray ScalarParameterInfoArray; TArray GuidArray; OriginMaterial.GetAllScalarParameterInfo(ScalarParameterInfoArray, GuidArray); for (const FMaterialParameterInfo& Param : ScalarParameterInfoArray) { float Value = 0.f; if (OriginMaterial.GetScalarParameterValue(Param, Value, true)) { DestMaterial.SetScalarParameterValueEditorOnly(Param.Name, Value); } } } // Copy vector parameters { TArray VectorParameterInfoArray; TArray GuidArray; OriginMaterial.GetAllVectorParameterInfo(VectorParameterInfoArray, GuidArray); for (const FMaterialParameterInfo& Param : VectorParameterInfoArray) { FLinearColor Value; if (OriginMaterial.GetVectorParameterValue(Param, Value, true)) { DestMaterial.SetVectorParameterValueEditorOnly(Param.Name, Value); } } } // Copy switch parameters { TArray StaticSwitchParameterInfoArray; TArray GuidArray; OriginMaterial.GetAllStaticSwitchParameterInfo(StaticSwitchParameterInfoArray, GuidArray); for (int i = 0; i < StaticSwitchParameterInfoArray.Num(); ++i) { bool Value = false; FGuid ExpressionsGuid; if (OriginMaterial.GetStaticSwitchParameterValue(StaticSwitchParameterInfoArray[i].Name, Value, ExpressionsGuid, true)) { // For some reason UMaterialInstance::SetStaticSwitchParameterValueEditorOnly signature is different than UMaterial::SetStaticSwitchParameterValueEditorOnly if constexpr (std::is_same_v) { DestMaterial.SetStaticSwitchParameterValueEditorOnly(StaticSwitchParameterInfoArray[i].Name, Value, ExpressionsGuid); } else if (std::is_same_v) { DestMaterial.SetStaticSwitchParameterValueEditorOnly(StaticSwitchParameterInfoArray[i].Name, Value); } else { static_assert( std::is_same_v || std::is_same_v); } } } } // Replace Textures { TArray OutParameterInfo; TArray Guids; OriginMaterial.GetAllTextureParameterInfo(OutParameterInfo, Guids); for (const TPair& It : TextureReplacementMap) { if (OutParameterInfo.IsValidIndex(It.Key)) { DestMaterial.SetTextureParameterValueEditorOnly(OutParameterInfo[It.Key].Name, It.Value); } } } // Fix potential errors compiling materials due to Sampler Types for (const TObjectPtr& Expression : DestMaterial.GetMaterial()->GetExpressions()) { if (UMaterialExpressionTextureBase* MatExpressionTexBase = Cast(Expression)) { MatExpressionTexBase->AutoSetSampleType(); } } DestMaterial.PreEditChange(NULL); DestMaterial.PostEditChange(); } };