Ejemplo n.º 1
0
    ///////////////////////////////////////////////////////////////////////////
    #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);
        }
    }