bool FMeshMeshCut::Cut( const MeshIntersection::FIntersectionsQueryResult& Intersections )
{
check( !bCutCoplanar );
ResetOutputs();
bool bSuccess = true;
int MeshesToProcess = bMutuallyCut ? 2 : 1;
for ( int MeshIdx = 0; MeshIdx < MeshesToProcess; MeshIdx++ )
{
MeshCut::FCutWorkingInfo WorkingInfo( Mesh[ MeshIdx ], SnapTolerance );
WorkingInfo.AddSegments( Intersections, MeshIdx ); // add intersection segments
WorkingInfo.InsertFaceVertices(); // insert vertices for intersection segments w/ endpoints on faces
WorkingInfo.InsertEdgeVertices(); // insert vertices for intersection segments w/ endpoints on edges
// ensure that intersection segment endpoints are connected by direct edge paths
bool bConnected = WorkingInfo.ConnectEdges
(
bTrackInsertedVertices ? &VertexChains [ MeshIdx ] : nullptr,
bTrackInsertedVertices ? &SegmentToChain[ MeshIdx ] : nullptr
);
if ( !bConnected )
{
bSuccess = false;
}
}
return bSuccess;
}사실상 주요 처리는 FCutWorkingInfo에 의해서 이루어진다. 메쉬의 절단이 이루어지고 나서 처리된 정점과 세그먼트는 각각 VertexChains와 SegmentToChain에 채워진다.