/////////////////////////////////////////////////////////////////////////// #region [Subdivide] /** * Subdivide a mesh, without smoothing it, trying to interpolate all * available attributes as much as possible. After subdivision, all faces * are quads. * Overriding attributes: edge's id */ public static void Subdivide(BMesh mesh) { int i = 0; var edgeCenters = new Vertex[mesh.edges.Count]; var originalEdges = new Edge[mesh.edges.Count]; foreach (Edge e in mesh.edges) { edgeCenters[i] = mesh.AddVertex(e.Center()); AttributeLerp(mesh, edgeCenters[i], e.vert1, e.vert2, 0.5f); originalEdges[i] = e; e.id = i++; } var originalFaces = new List <Face>(mesh.faces); // copy because mesh.faces changes during iterations foreach (Face f in originalFaces) { Vertex faceCenter = mesh.AddVertex(f.Center()); float w = 0; // Create one quad per loop in the original face Loop it = f.loop; do { w += 1; AttributeLerp(mesh, faceCenter, faceCenter, it.vert, 1 / w); var quad = new Vertex[] { it.vert, edgeCenters[it.edge.id], faceCenter, edgeCenters[it.prev.edge.id] }; mesh.AddFace(quad); it = it.next; } while (it != f.loop); // then get rid of the original face mesh.RemoveFace(f); } // Remove old edges foreach (Edge e in originalEdges) { mesh.RemoveEdge(e); } }