Generate Procedural Mesh

Hi!! Sorry for my bad english ) (its not my native lang).

I was edit the code and include smoothings groups support for triangles.


USTRUCT(BlueprintType)
struct ProceduralMeshTriangle
{
    GENERATED_USTRUCT_BODY()

        UPROPERTY(EditAnywhere, Category = Triangle)
        ProceduralMeshVertex Vertex0;

    UPROPERTY(EditAnywhere, Category = Triangle)
        ProceduralMeshVertex Vertex1;

    UPROPERTY(EditAnywhere, Category = Triangle)
        ProceduralMeshVertex Vertex2;

  **  *UPROPERTY(EditAnywhere, Category = Triangle)
        int32 SmoothingsGroups;***
};

and in to sceneproxy class


      **TArray<FVector> PositionEq;
        TArray<int32> SmoothingGroupEq;**

        // Add each triangle to the vertex/index buffer
        for (int TriIdx = 0; TriIdx < Component->ProceduralMeshTris.Num(); TriIdx++)
        {
            FProceduralMeshTriangle& Tri = Component->ProceduralMeshTris[TriIdx];

            const FVector Edge01 = (Tri.Vertex1.Position - Tri.Vertex0.Position);
            const FVector Edge02 = (Tri.Vertex2.Position - Tri.Vertex0.Position);

            const FVector TangentX = Edge01.SafeNormal();
            const FVector TangentZ = (Edge02 ^ Edge01).SafeNormal();
            const FVector TangentY = (TangentX ^ TangentZ).SafeNormal();

            int32 VIndex;
            ***int32 SG;   //SmoothigGrup Buffer

            SG = Tri.SmoothingsGroups;***

            FDynamicMeshVertex Vert0;
            Vert0.Position = Tri.Vertex0.Position;
            Vert0.Color = Tri.Vertex0.Color;
            Vert0.SetTangents(TangentX, TangentY, TangentZ);
            Vert0.TextureCoordinate.Set(Tri.Vertex0.U, Tri.Vertex0.V);
            ***if (!PositionEq.Contains(Vert0.Position))
            {
                SmoothingGroupEq.Add(Tri.SmoothingsGroups);
                PositionEq.Add(Vert0.Position);
                VIndex = VertexBuffer.Vertices.Add(Vert0);
                IndexBuffer.Indices.Add(VIndex);
            } else 
                {
                if ((SmoothingGroupEq[PositionEq.Find(Vert0.Position)] == SG))
                    {
                        IndexBuffer.Indices.Add(PositionEq.Find(Vert0.Position));
                    } else    
                        {
                            SmoothingGroupEq.Add(Tri.SmoothingsGroups);
                            PositionEq.Add(Vert0.Position);
                            VIndex = VertexBuffer.Vertices.Add(Vert0);
                            IndexBuffer.Indices.Add(VIndex);
                        }
                }***

            FDynamicMeshVertex Vert1;
            Vert1.Position = Tri.Vertex1.Position;
            Vert1.Color = Tri.Vertex1.Color;
            Vert1.SetTangents(TangentX, TangentY, TangentZ);
            Vert1.TextureCoordinate.Set(Tri.Vertex1.U, Tri.Vertex1.V);
            ***if (!PositionEq.Contains(Vert1.Position))
            {
                SmoothingGroupEq.Add(Tri.SmoothingsGroups);
                PositionEq.Add(Vert1.Position);
                VIndex = VertexBuffer.Vertices.Add(Vert1);
                IndexBuffer.Indices.Add(VIndex);
            } else
                {
                    if ((SmoothingGroupEq[PositionEq.Find(Vert1.Position)] == SG))
                    {
                    IndexBuffer.Indices.Add(PositionEq.Find(Vert1.Position));
                    } else
                        {
                        SmoothingGroupEq.Add(Tri.SmoothingsGroups);
                        PositionEq.Add(Vert1.Position);
                        VIndex = VertexBuffer.Vertices.Add(Vert1);
                        IndexBuffer.Indices.Add(VIndex);
                        }
                }***
            FDynamicMeshVertex Vert2;
            Vert2.Position = Tri.Vertex2.Position;
            Vert2.Color = Tri.Vertex2.Color;
            Vert2.SetTangents(TangentX, TangentY, TangentZ);
            Vert2.TextureCoordinate.Set(Tri.Vertex2.U, Tri.Vertex2.V);
            ***if (!PositionEq.Contains(Vert2.Position))
            {
                SmoothingGroupEq.Add(Tri.SmoothingsGroups);
                PositionEq.Add(Vert2.Position);
                VIndex = VertexBuffer.Vertices.Add(Vert2);
                IndexBuffer.Indices.Add(VIndex);
            } else
                {
                    if ((SmoothingGroupEq[PositionEq.Find(Vert2.Position)] == SG))
                    {
                        IndexBuffer.Indices.Add(PositionEq.Find(Vert2.Position));
                    } else
                        {
                            SmoothingGroupEq.Add(Tri.SmoothingsGroups);
                            PositionEq.Add(Vert2.Position);
                            VIndex = VertexBuffer.Vertices.Add(Vert2);
                            IndexBuffer.Indices.Add(VIndex);
                        }
                }***
        }