void UPaperSprite::Triangulate(const FSpritePolygonCollection& Source, TArray<FVector2D>& Target) { Target.Empty(); for (int32 PolygonIndex = 0; PolygonIndex < Source.Polygons.Num(); ++PolygonIndex) { const FSpritePolygon& SourcePoly = Source.Polygons[PolygonIndex]; if (SourcePoly.Vertices.Num() >= 3) { // Convert our format into one the triangulation library supports FClipSMPolygon ClipPolygon(0); for (int32 VertexIndex = 0; VertexIndex < SourcePoly.Vertices.Num() ; ++VertexIndex) { FClipSMVertex* ClipVertex = new (ClipPolygon.Vertices) FClipSMVertex; FMemory::Memzero(ClipVertex, sizeof(FClipSMVertex)); const FVector2D& SourceVertex = SourcePoly.Vertices[VertexIndex]; ClipVertex->Pos.X = SourceVertex.X; ClipVertex->Pos.Z = SourceVertex.Y; } ClipPolygon.FaceNormal = FVector(0.0f, -1.0f, 0.0f); // Attempt to triangulate this polygon TArray<FClipSMTriangle> GeneratedTriangles; if (TriangulatePoly(/*out*/ GeneratedTriangles, ClipPolygon)) { // Convert the triangles back to our 2D data structure for (int32 TriangleIndex = 0; TriangleIndex < GeneratedTriangles.Num(); ++TriangleIndex) { const FClipSMTriangle& Triangle = GeneratedTriangles[TriangleIndex]; new (Target) FVector2D(Triangle.Vertices[0].Pos.X, Triangle.Vertices[0].Pos.Z); new (Target) FVector2D(Triangle.Vertices[1].Pos.X, Triangle.Vertices[1].Pos.Z); new (Target) FVector2D(Triangle.Vertices[2].Pos.X, Triangle.Vertices[2].Pos.Z); } } } } }
int32 FPoly::Triangulate( ABrush* InOwnerBrush, TArray<FPoly>& OutTriangles ) { #if WITH_EDITOR if( Vertices.Num() < 3 ) { return 0; } FClipSMPolygon Polygon(0); for( int32 v = 0 ; v < Vertices.Num() ; ++v ) { FClipSMVertex vtx; vtx.Pos = Vertices[v]; // Init other data so that VertsAreEqual won't compare garbage vtx.TangentX = FVector::ZeroVector; vtx.TangentY = FVector::ZeroVector; vtx.TangentZ = FVector::ZeroVector; vtx.Color = FColor(0, 0, 0); for( int32 uvIndex=0; uvIndex<ARRAY_COUNT(vtx.UVs); ++uvIndex ) { vtx.UVs[uvIndex] = FVector2D(0.f, 0.f); } Polygon.Vertices.Add( vtx ); } Polygon.FaceNormal = Normal; // Attempt to triangulate this polygon TArray<FClipSMTriangle> Triangles; if( TriangulatePoly( Triangles, Polygon ) ) { // Create a set of FPolys from the triangles OutTriangles.Empty(); FPoly TrianglePoly; for( int32 p = 0 ; p < Triangles.Num() ; ++p ) { FClipSMTriangle* tri = &(Triangles[p]); TrianglePoly.Init(); TrianglePoly.Base = tri->Vertices[0].Pos; TrianglePoly.Vertices.Add( tri->Vertices[0].Pos ); TrianglePoly.Vertices.Add( tri->Vertices[1].Pos ); TrianglePoly.Vertices.Add( tri->Vertices[2].Pos ); if( TrianglePoly.Finalize( InOwnerBrush, 0 ) == 0 ) { OutTriangles.Add( TrianglePoly ); } } } #endif return OutTriangles.Num(); }