Rev 467 | Rev 489 | 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<uint> indices;
vector<uint> 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]);
}
}