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)); }