Files
UnrealEngine/Engine/Plugins/Runtime/GeometryProcessing/Source/DynamicMesh/Private/Sampling/MeshSurfaceSampler.cpp
2025-05-18 13:04:45 +08:00

97 lines
2.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Sampling/MeshSurfaceSampler.h"
namespace UE
{
namespace Geometry
{
void FMeshSurfaceUVSampler::Initialize(
const FDynamicMesh3* MeshIn,
const FDynamicMeshUVOverlay* UVOverlayIn,
EMeshSurfaceSamplerQueryType QueryTypeIn)
{
Mesh = MeshIn;
UVOverlay = UVOverlayIn;
QueryType = QueryTypeIn;
if (QueryType == EMeshSurfaceSamplerQueryType::UVOnly)
{
InitializeUVMeshSpatial();
}
}
bool FMeshSurfaceUVSampler::QuerySampleInfo(const FVector2d& UV, FMeshUVSampleInfo& SampleInfo)
{
check(QueryType == EMeshSurfaceSamplerQueryType::UVOnly);
check(bUVMeshSpatialInitialized);
FRay3d HitRay(FVector3d(UV.X, UV.Y, 100.0), -FVector3d::UnitZ());
const int32 UVTriangleID = UVMeshSpatial.FindNearestHitTriangle(HitRay);
return QuerySampleInfo(UVTriangleID, UV, SampleInfo);
}
bool FMeshSurfaceUVSampler::QuerySampleInfo(int32 UVTriangleID, const FVector2d& UV, FMeshUVSampleInfo& SampleInfo)
{
SampleInfo.TriangleIndex = UVTriangleID;
if (Mesh->IsTriangle(SampleInfo.TriangleIndex) == false)
{
return false;
}
check(UVOverlay->IsSetTriangle(SampleInfo.TriangleIndex));
SampleInfo.MeshVertices = Mesh->GetTriangle(SampleInfo.TriangleIndex);
SampleInfo.Triangle3D = FTriangle3d(
Mesh->GetVertex(SampleInfo.MeshVertices.A),
Mesh->GetVertex(SampleInfo.MeshVertices.B),
Mesh->GetVertex(SampleInfo.MeshVertices.C));
SampleInfo.UVVertices = UVOverlay->GetTriangle(SampleInfo.TriangleIndex);
SampleInfo.TriangleUV = FTriangle2d(
(FVector2d)UVOverlay->GetElement(SampleInfo.UVVertices.A),
(FVector2d)UVOverlay->GetElement(SampleInfo.UVVertices.B),
(FVector2d)UVOverlay->GetElement(SampleInfo.UVVertices.C));
SampleInfo.BaryCoords = SampleInfo.TriangleUV.GetBarycentricCoords(UV);
SampleInfo.SurfacePoint = Mesh->GetTriBaryPoint(
SampleInfo.TriangleIndex,
SampleInfo.BaryCoords.X,
SampleInfo.BaryCoords.Y,
SampleInfo.BaryCoords.Z);
return true;
}
void FMeshSurfaceUVSampler::InitializeUVMeshSpatial()
{
if (bUVMeshSpatialInitialized)
{
return;
}
check(UVOverlay);
UVMeshAdapter.Mesh = Mesh;
UVMeshAdapter.UV = UVOverlay;
UVMeshSpatial.SetMesh(&UVMeshAdapter, true);
bUVMeshSpatialInitialized = true;
}
} // end namespace Geometry
} // end namespace UE