public Mesh BuildMeshFromConwayPoly(bool forceTwosided) { //var originalFaceSides = KisTriangulate(); var target = new Mesh(); var meshTriangles = new List <int>(); var meshVertices = new List <Vector3>(); var meshNormals = new List <Vector3>(); var meshColors = new List <Color32>(); var hasNaked = _conwayPoly.HasNaked(); hasNaked = false; // TODO // for (int i = 0; i < conway.Faces.Count; i++) // { // if (conway.Faces[i].Sides > 3) // { // conway.Faces.Triangulate(i, false); // } // } // Strip down to Face-Vertex structure var points = _conwayPoly.ListVerticesByPoints(); var faceIndices = _conwayPoly.ListFacesByVertexIndices(); // Add faces int index = 0; for (var i = 0; i < faceIndices.Length; i++) { var faceIndex = faceIndices[i]; var face = _conwayPoly.Faces[i]; var faceNormal = face.Normal; Color32 color; switch (ColorMethod) { case AppearancePreset.ColorMethods.ByRole: color = faceColors[(int)_conwayPoly.FaceRoles[i]]; break; case AppearancePreset.ColorMethods.BySides: color = faceColors[face.Sides % faceColors.Length]; break; default: color = Color.red; break; } if (face.Sides > 3) { for (var edgeIndex = 0; edgeIndex < faceIndex.Count; edgeIndex++) { meshVertices.Add(face.Centroid); meshTriangles.Add(index++); meshVertices.Add(points[faceIndex[edgeIndex]]); meshTriangles.Add(index++); meshVertices.Add(points[faceIndex[(edgeIndex + 1) % face.Sides]]); meshTriangles.Add(index++); meshNormals.AddRange(Enumerable.Repeat(faceNormal, 3)); meshColors.AddRange(Enumerable.Repeat(color, 3)); } } else { meshVertices.Add(points[faceIndex[0]]); meshTriangles.Add(index++); meshVertices.Add(points[faceIndex[1]]); meshTriangles.Add(index++); meshVertices.Add(points[faceIndex[2]]); meshTriangles.Add(index++); meshNormals.AddRange(Enumerable.Repeat(faceNormal, 3)); meshColors.AddRange(Enumerable.Repeat(color, 3)); } if (hasNaked || forceTwosided) { if (faceIndex.Count > 3) { for (var edgeIndex = 0; edgeIndex < faceIndex.Count; edgeIndex++) { meshVertices.Add(face.Centroid); meshTriangles.Add(index++); meshVertices.Add(points[faceIndex[(edgeIndex + 1) % face.Sides]]); meshTriangles.Add(index++); meshVertices.Add(points[faceIndex[edgeIndex]]); meshTriangles.Add(index++); meshNormals.AddRange(Enumerable.Repeat(faceNormal, 3)); meshColors.AddRange(Enumerable.Repeat(color, 3)); } } else { meshVertices.Add(points[faceIndex[0]]); meshTriangles.Add(index++); meshVertices.Add(points[faceIndex[2]]); meshTriangles.Add(index++); meshVertices.Add(points[faceIndex[1]]); meshTriangles.Add(index++); meshNormals.AddRange(Enumerable.Repeat(-faceNormal, faceIndex.Count)); meshColors.AddRange(Enumerable.Repeat(color, faceIndex.Count)); } } } target.vertices = meshVertices.ToArray(); target.normals = meshNormals.ToArray(); target.triangles = meshTriangles.ToArray(); target.colors32 = meshColors.ToArray(); if (hasNaked || forceTwosided) { target.RecalculateNormals(); } return(target); }