Subversion Repositories gelsvn

Rev

Rev 489 | Rev 511 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "subdivision.h"

#include <vector>
#include <CGLA/Vec3f.h>

#include "Manifold.h"
#include "VertexHandle.h"
#include "FaceHandle.h"
#include "FaceCirculator.h"


namespace HMesh
{
    using std::vector;

    using CGLA::Vec3f;

    void cc_split(Manifold& m_in, Manifold& m_out)
    {
        vector<Vec3f> new_points;

        for(VertexHandle v = m_in.vertices_begin(); v != m_in.vertices_end(); ++v){
            int idx = new_points.size();
            new_points.push_back(v.get().pos);
            v.get().touched = idx;
        }

        for(HalfEdgeHandle h = m_in.halfedges_begin(); h != m_in.halfedges_end(); ++h)
            h.get().touched = -1;

        for(HalfEdgeHandle h = m_in.halfedges_begin(); h != m_in.halfedges_end(); ++h)
            if(h.get().touched == -1){
                int idx = new_points.size();
                new_points.push_back((h.vert().get().pos + h.opp().vert().get().pos) * 0.5f);
                h.get().touched = h.opp().get().touched = idx;
            }

            vector<IndexType> indices;
            vector<IndexType> faces;
            for(FaceHandle f = m_in.faces_begin(); f != m_in.faces_end(); ++f){
                int idx_center = new_points.size();
                new_points.push_back(centre(f));
                for(FaceCirculator fc(f); !fc.end(); ++fc){
                    indices.push_back(idx_center);
                    indices.push_back(fc.next_halfedge().prev().get().touched);
                    indices.push_back(fc.vertex().get().touched);
                    indices.push_back(fc.next_halfedge().get().touched);
                    faces.push_back(4);
                }
            }
            m_out.clear();
            m_out.build(new_points.size(), reinterpret_cast<float*>(&new_points[0]), faces.size(), &faces[0], &indices[0]);
    }

}