Subversion Repositories gelsvn

Rev

Rev 332 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "subdivision.h"
#include "FaceCirculator.h"
#include "build_manifold.h"

using namespace std;
using namespace CGLA;
namespace HMesh
{
                void cc_split(Manifold& m_in, Manifold& m_out)
                {
                                vector<Vec3f> new_points;

                                for(VertexIter v=m_in.vertices_begin(); v != m_in.vertices_end();++v)
                                {
                                                int idx = new_points.size();
                                                new_points.push_back(v->pos);
                                                v->touched = idx;
                                }
        
                                for(HalfEdgeIter h=m_in.halfedges_begin();h!= m_in.halfedges_end();++h)
                                                h->touched = -1;

                                for(HalfEdgeIter h=m_in.halfedges_begin();h!= m_in.halfedges_end();++h)
                                                if(h->touched == -1)
                                {
                                                int idx = new_points.size();
                                                new_points.push_back((h->vert->pos + h->opp->vert->pos) / 2.0);
                                                h->touched = h->opp->touched = idx;
                                }
                                
                                vector<int> indices;
                                vector<int> faces;
                                for(FaceIter 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.get_halfedge()->prev->touched);
                                                                indices.push_back(fc.get_vertex()->touched);
                                                                indices.push_back(fc.get_halfedge()->touched);
                                                                faces.push_back(4);
                                                }
                                }
                                m_out.clear();
                                build_manifold(m_out, new_points.size(),
                                                                                         &new_points[0],
                                                                                         faces.size(),
                                                                                         &faces[0],
                                                                                         &indices[0]);
                }
                
}