Files
UnrealEngine/Engine/Plugins/Experimental/GeometryCollectionPlugin/Source/GeometryCollectionNodes/Private/Dataflow/GeometryCollectionTriangleBoundaryIndicesNode.cpp
2025-05-18 13:04:45 +08:00

57 lines
2.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Dataflow/GeometryCollectionTriangleBoundaryIndicesNode.h"
#include "Chaos/BoundingVolumeHierarchy.h"
#include "GeometryCollection/Facades/CollectionMeshFacade.h"
#include "GeometryCollection/Facades/CollectionPositionTargetFacade.h"
#include "Chaos/Utilities.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(GeometryCollectionTriangleBoundaryIndicesNode)
FTriangleBoundaryIndicesNode::FTriangleBoundaryIndicesNode(const UE::Dataflow::FNodeParameters& InParam, FGuid InGuid)
: FDataflowNode(InParam, InGuid)
{
RegisterInputConnection(&Collection);
RegisterOutputConnection(&BoundaryIndicesOut);
}
void FTriangleBoundaryIndicesNode::Evaluate(UE::Dataflow::FContext& Context, const FDataflowOutput* Out) const
{
if (Out->IsA(&BoundaryIndicesOut))
{
const FManagedArrayCollection& InCollection = GetValue(Context, &Collection);
TArray<Chaos::TVec3<int32>> TriangleMeshArray;
if (const TManagedArray<int32>* TriangleMeshIndices = InCollection.FindAttribute<int32>("ObjectIndices", "TriangleMesh"))
{
if (const TManagedArray<FIntVector>* Indices = InCollection.FindAttribute<FIntVector>("Indices", FGeometryCollection::FacesGroup))
{
if (const TManagedArray<int32>* FaceStarts = InCollection.FindAttribute<int32>("FaceStart", FGeometryCollection::GeometryGroup))
{
if (const TManagedArray<int32>* FaceCounts = InCollection.FindAttribute<int32>("FaceCount", FGeometryCollection::GeometryGroup))
{
for (int32 i = 0; i < TriangleMeshIndices->Num(); i++)
{
const int32 ObjectIndex = (*TriangleMeshIndices)[i];
const int32 FaceStartIndex = (*FaceStarts)[ObjectIndex];
const int32 FaceNum = (*FaceCounts)[ObjectIndex];
for (int32 e = FaceStartIndex; e < FaceStartIndex + FaceNum; e++)
{
Chaos::TVec3<int32> IndicesTemp((*Indices)[e][0], (*Indices)[e][1], (*Indices)[e][2]);
TriangleMeshArray.Emplace(IndicesTemp);
}
}
}
}
}
}
TArray<int32> IndicesOut = Chaos::Utilities::ComputeBoundaryNodes(TriangleMeshArray);
SetValue(Context, MoveTemp(IndicesOut), &BoundaryIndicesOut);
}
}