/// <summary> /// /// </summary> /// <typeparam name="V"></typeparam> /// <typeparam name="E"></typeparam> /// <typeparam name="F"></typeparam> /// <param name="mesh"></param> private static void QuadSplitTopology <V, E, F>(HeMeshBase <V, E, F> mesh) where V : HeVertex <V, E, F> where E : Halfedge <V, E, F> where F : HeFace <V, E, F> { var verts = mesh.Vertices; var hedges = mesh.Halfedges; var faces = mesh.Faces; int ne = hedges.Count >> 1; int nf = faces.Count; int ev0 = verts.Count - ne; // index of first edge vertex int fv0 = ev0 - nf; // index of first face vertex (also the number of vertices in the initial mesh) // split edges for (int i = 0; i < ne; i++) { var he = hedges[i << 1]; if (he.IsRemoved) { continue; } var ev = verts[i + ev0]; mesh.SplitEdgeImpl(he, ev); } // split faces for (int i = 0; i < nf; i++) { var f = faces[i]; if (f.IsRemoved) { continue; } var he = f.First; if (he.Start.Index >= fv0) { he = he.PrevInFace; // ensure halfedge starts from an old vertex } mesh.QuadSplitFace(he, verts[i + fv0]); } }