private void AddTriangleToGroup(MeshBasedBakeGroup group, int triangleIndex)
 {
     group.triangleIndices.Add(triangleIndex);
     triangleIndex *= 3;
     group.vertexIndices.Add(triangles[triangleIndex++]);
     group.vertexIndices.Add(triangles[triangleIndex++]);
     group.vertexIndices.Add(triangles[triangleIndex]);
 }
        private int[] RetriveTrianglesFromGroup(MeshBasedBakeGroup group)
        {
            var triangles         = this.triangles.ToArray();
            int numberOfTriangles = group.triangleIndices.Count;
            int resultSize        = numberOfTriangles * 3;
            var result            = new int[resultSize];
            int i = 0;

            foreach (int triangleIndex in group.triangleIndices)
            {
                System.Array.Copy(triangles, 3 * triangleIndex, result, i, 3);
                i += 3;
            }
            return(result);
        }
        /// <summary>
        /// Splits result triangles into groups by their connections.
        /// </summary>
        /// <returns>The result triangles splited into groups.</returns>
        public int[][] GroupTrianglesByConnection()
        {
            var groups = new HashSet <MeshBasedBakeGroup>();

            int numberOfTriangles = triangles.Count / 3;

            for (int t = 0; t < numberOfTriangles; t++)
            {
                var connectedGroups = FindConnectedGroups(t, groups);
                if (connectedGroups.Count == 0)
                {
                    var group = new MeshBasedBakeGroup();
                    AddTriangleToGroup(group, t);
                    groups.Add(group);
                }
                else if (connectedGroups.Count == 1)
                {
                    foreach (var connectedGroup in connectedGroups)
                    {
                        AddTriangleToGroup(connectedGroup, t);
                    }
                }
                else
                {
                    var group = new MeshBasedBakeGroup();
                    AddTriangleToGroup(group, t);
                    foreach (var connectedGroup in connectedGroups)
                    {
                        groups.Remove(connectedGroup);
                        group.vertexIndices.UnionWith(connectedGroup.vertexIndices);
                        group.triangleIndices.UnionWith(connectedGroup.triangleIndices);
                    }
                    groups.Add(group);
                }
            }

            return(GrupsToArray(groups));
        }