Rev 595 | Go to most recent revision | 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]);
}
}