// 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> TriangleMeshArray; if (const TManagedArray* TriangleMeshIndices = InCollection.FindAttribute("ObjectIndices", "TriangleMesh")) { if (const TManagedArray* Indices = InCollection.FindAttribute("Indices", FGeometryCollection::FacesGroup)) { if (const TManagedArray* FaceStarts = InCollection.FindAttribute("FaceStart", FGeometryCollection::GeometryGroup)) { if (const TManagedArray* FaceCounts = InCollection.FindAttribute("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 IndicesTemp((*Indices)[e][0], (*Indices)[e][1], (*Indices)[e][2]); TriangleMeshArray.Emplace(IndicesTemp); } } } } } } TArray IndicesOut = Chaos::Utilities::ComputeBoundaryNodes(TriangleMeshArray); SetValue(Context, MoveTemp(IndicesOut), &BoundaryIndicesOut); } }