public static List <int[]> ComputeNonConcaveSubPolygons( this V3d[] vertexArray, int polyCount, V3d[] normalArray, int[] firstIndices, int[] vertexIndices, List <int> faceBackMap, double absoluteEpsilon) { var polyList = new List <int[]>(); var eps2 = absoluteEpsilon * absoluteEpsilon; for (int fvi = 0, fi = 0; fi < polyCount; fi++) { int fve = firstIndices[fi + 1], fvc = fve - fvi; var n = normalArray[fi]; var l2 = n.LengthSquared; if (l2 < eps2) { polyList.Add(new int[fvc].SetByIndex(i => vertexIndices[fvi + i])); if (faceBackMap != null) { faceBackMap.Add(fi); } fvi = fve; continue; } M44d local2global, global2local; M44d.NormalFrame(V3d.Zero, n, out local2global, out global2local); var polygon = new Polygon2d(fvc, i => global2local.TransformPos(vertexArray[vertexIndices[fvi + i]]).XY); var subPolyList = polygon.ComputeNonConcaveSubPolygons(absoluteEpsilon); foreach (var poly in subPolyList) { polyList.Add(poly.Map(i => fvi + i)); } if (faceBackMap != null) { for (int i = 0; i < subPolyList.Count; i++) { faceBackMap.Add(fi); } } fvi = fve; } return(polyList); }