// Copyright Epic Games, Inc. All Rights Reserved. #include "Sampling/MeshResampleImageBaker.h" #include "ExplicitUseGeometryMathTypes.h" // using UE::Geometry::(math types) using namespace UE::Geometry; void FMeshResampleImageBaker::Bake() { const FMeshImageBakingCache* BakeCache = GetCache(); check(BakeCache); const FDynamicMesh3* DetailMesh = BakeCache->GetDetailMesh(); check(DetailUVOverlay); FVector4f DefaultValue(0, 0, 0, 1.0); auto PropertySampleFunction = [&](const FMeshImageBakingCache::FCorrespondenceSample& SampleData) { FVector4f Color = DefaultValue; int32 DetailTriID = SampleData.DetailTriID; if (DetailMesh->IsTriangle(SampleData.DetailTriID) && DetailUVOverlay) { FVector2d DetailUV; DetailUVOverlay->GetTriBaryInterpolate(DetailTriID, &SampleData.DetailBaryCoords.X, &DetailUV.X); Color = SampleFunction(DetailUV); } return Color; }; ResultBuilder = MakeUnique>(); ResultBuilder->SetDimensions(BakeCache->GetDimensions()); ResultBuilder->Clear(DefaultColor); BakeCache->EvaluateSamples([&](const FVector2i& Coords, const FMeshImageBakingCache::FCorrespondenceSample& Sample) { FVector4f Color = PropertySampleFunction(Sample); ResultBuilder->SetPixel(Coords, Color); }); const FImageOccupancyMap& Occupancy = *BakeCache->GetOccupancyMap(); for (int64 k = 0; k < Occupancy.GutterTexels.Num(); k++) { TPair GutterTexel = Occupancy.GutterTexels[k]; ResultBuilder->CopyPixel(GutterTexel.Value, GutterTexel.Key); } }