Files
UnrealEngine/Engine/Plugins/Experimental/GeometryFlow/Source/GeometryFlowMeshProcessing/Private/MeshBakingNodes/BakeMeshMultiTextureNode.cpp
2025-05-18 13:04:45 +08:00

57 lines
2.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MeshBakingNodes/BakeMeshMultiTextureNode.h"
#include "GeometryFlowNodeUtil.h"
#include "Sampling/MeshResampleImageBaker.h"
using namespace UE::Geometry;
using namespace UE::GeometryFlow;
void FBakeMeshMultiTextureNode::Evaluate(
const FNamedDataMap& DatasIn,
FNamedDataMap& DatasOut,
TUniquePtr<FEvaluationInfo>& EvaluationInfo)
{
if (ensure(DatasOut.Contains(OutParamTextureImage())))
{
bool bAllInputsValid = true;
bool bRecomputeRequired = (IsOutputAvailable(OutParamTextureImage()) == false);
TSafeSharedPtr<IData> BakeCacheArg = FindAndUpdateInputForEvaluate(InParamBakeCache(), DatasIn, bRecomputeRequired, bAllInputsValid);
TSafeSharedPtr<IData> MaterialToTextureMapArg = FindAndUpdateInputForEvaluate(InParamMaterialTextures(), DatasIn, bRecomputeRequired, bAllInputsValid);
TSafeSharedPtr<IData> SettingsArg = FindAndUpdateInputForEvaluate(InParamSettings(), DatasIn, bRecomputeRequired, bAllInputsValid);
if (bAllInputsValid)
{
if (bRecomputeRequired)
{
// always make a copy of settings
FBakeMeshMultiTextureSettings Settings;
SettingsArg->GetDataCopy(Settings, FBakeMeshMultiTextureSettings::DataTypeIdentifier);
const FMeshBakingCache& BakeCacheContainer = BakeCacheArg->GetDataConstRef<FMeshBakingCache>((int)EMeshProcessingDataTypes::BakingCache);
const FDynamicMesh3& DetailMesh = BakeCacheContainer.DetailMesh;
check(DetailMesh.HasAttributes() && DetailMesh.Attributes()->NumUVLayers() > Settings.DetailUVLayer);
const FDynamicMeshUVOverlay* DetailUVOverlay = DetailMesh.Attributes()->GetUVLayer(Settings.DetailUVLayer);
const FMaterialIDToTextureMap& SourceMaterialTextures =
MaterialToTextureMapArg->GetDataConstRef<FMaterialIDToTextureMap>(FMaterialIDToTextureMap::DataTypeIdentifier);
FMeshMultiResampleImageBaker Baker;
Baker.SetCache(&BakeCacheContainer.BakeCache);
Baker.DetailUVOverlay = DetailUVOverlay;
Baker.MultiTextures = SourceMaterialTextures.MaterialIDTextureMap;
Baker.Bake();
FTextureImage ResultImage;
ResultImage.Image = MoveTemp(*Baker.TakeResult());
SetOutput(OutParamTextureImage(), MakeMovableData<FTextureImage>(MoveTemp(ResultImage)) );
EvaluationInfo->CountCompute(this);
}
DatasOut.SetData(OutParamTextureImage(), GetOutput(OutParamTextureImage()));
}
}
}