diff --git a/vcg/complex/trimesh/update/halfedge_topology.h b/vcg/complex/trimesh/update/halfedge_topology.h index 393bfe43..aba43902 100644 --- a/vcg/complex/trimesh/update/halfedge_topology.h +++ b/vcg/complex/trimesh/update/halfedge_topology.h @@ -18,90 +18,6 @@ namespace vcg namespace tri { - template class Garbage - { - - public: - - typedef typename MeshType::VertexPointer VertexPointer; - typedef typename MeshType::EdgePointer EdgePointer; - typedef typename MeshType::HEdgePointer HEdgePointer; - typedef typename MeshType::FacePointer FacePointer; - - typedef typename MeshType::VertexType VertexType; - typedef typename MeshType::EdgeType EdgeType; - typedef typename MeshType::HEdgeType HEdgeType; - typedef typename MeshType::FaceType FaceType; - - typedef typename std::vector::iterator VertexIterator; - typedef typename std::vector::iterator EdgeIterator; - typedef typename std::vector::iterator HEdgeIterator; - typedef typename std::vector::iterator FaceIterator; - - std::vector vert; - std::vector edge; - std::vector hedge; - std::vector face; - - /// Default Constructor - Garbage() - { - } - - ~Garbage() - { - } - - void undelete_hedges(MeshType &m) - { - clear_elements(hedge); - - m.hn += hedge.size(); - } - - void undelete_edges(MeshType &m) - { - clear_elements(edge); - - m.en += edge.size(); - } - - void undelete_vertices(MeshType &m) - { - clear_elements(vert); - - m.vn += vert.size(); - } - - void undelete_faces(MeshType &m) - { - clear_elements(face); - - m.fn += face.size(); - } - - void clear() - { - clear_elements(vert); - clear_elements(edge); - clear_elements(hedge); - clear_elements(face); - } - - protected: - - template void clear_elements(std::vector &container) - { - Type aux; - - for(typename std::vector::iterator it = container.begin(); it!= container.end(); ++it) - { - memcpy((*it), &aux, sizeof(Type)); - } - - } - }; - /*! * \brief Class containing functions to modify the topology of a halfedge based mesh * @@ -120,8 +36,6 @@ namespace vcg typedef typename MeshType::HEdgeIterator HEdgeIterator; typedef typename MeshType::FaceIterator FaceIterator; - typedef vcg::tri::Garbage GarbageType; - typedef GarbageType* GarbagePointer; /*! * Collpases an edge shared by two quads, generating only quads. @@ -710,7 +624,7 @@ namespace vcg * * \return Pointer to the new face if it has been inserted, NULL otherwise */ - static FacePointer add_face(MeshType &m, vector &vps, GarbagePointer gp = NULL) + static FacePointer add_face(MeshType &m, vector &vps) { assert(MeshType::VertexType::HasVHAdjacency()); @@ -737,7 +651,7 @@ namespace vcg vector non_manifold_vertices(size, false); - return add_face_unsafe( m,vps, hps, non_manifold_vertices, gp ); + return add_face_unsafe( m,vps, hps, non_manifold_vertices); } @@ -750,7 +664,7 @@ namespace vcg * \retval true if face has been removed * \retval false otherwise */ - static bool remove_face(MeshType &m, FacePointer fp, GarbagePointer gp = NULL) + static bool remove_face(MeshType &m, FacePointer fp) { assert(MeshType::VertexType::HasVHAdjacency()); @@ -762,7 +676,7 @@ namespace vcg if( can_remove_face(fp) ) { - remove_face_unsafe(m, fp, gp); + remove_face_unsafe(m, fp); return true; } @@ -779,7 +693,7 @@ namespace vcg * * \return Pointer to the new face */ - static FacePointer add_face_unsafe(MeshType &m, vector &vps, GarbagePointer gp = NULL) + static FacePointer add_face_unsafe(MeshType &m, vector &vps) { unsigned int size = vps.size(); @@ -794,7 +708,7 @@ namespace vcg non_manifold_vertices.push_back( hps.back() == NULL ); } - return add_face_unsafe(m,vps,hps, non_manifold_vertices, gp); + return add_face_unsafe(m,vps,hps, non_manifold_vertices); } @@ -807,7 +721,7 @@ namespace vcg * * \return Pointer to the new face */ - static FacePointer add_face_unsafe(MeshType &m, vector &vps, vector &hps, vector &non_manifold_vertices, GarbagePointer gp) + static FacePointer add_face_unsafe(MeshType &m, vector &vps, vector &hps, vector &non_manifold_vertices) { assert(MeshType::VertexType::HasVHAdjacency()); @@ -830,7 +744,6 @@ namespace vcg bool HasEH = MeshType::EdgeType::HasEHAdjacency(); HEdgeIterator hi; - std::vector gphps; assert(hps.size() == size); @@ -839,145 +752,84 @@ namespace vcg FacePointer fp; - if(!gp) - { - FaceIterator fi = Allocator::AddFaces(m,1); - (*fi).Alloc( size ); - fp = &(*fi); - } - else - { - assert(gp->face.size() >=1 ); - - fp = gp->face.back(); - gp->face.pop_back(); - - fp->Alloc( size ); - - m.fn++; - } + FaceIterator fi = Allocator::AddFaces(m,1); + (*fi).Alloc( size ); + fp = &(*fi); if(edge_n > 0) { EdgeIterator ei; - if(!gp) + fp->SetD(); + + if(HasEH || HasHE) { - fp->SetD(); - - if(HasEH || HasHE) - { - ei = Allocator::AddEdges(m,edge_n); - for(EdgeIterator ei1 = ei; ei1 != m.edge.end(); ++ei1) - (*ei1).SetD(); - } - - typename Allocator::template PointerUpdater pu; - - if(m.hedge.empty()) - pu.oldBase = 0; - else - { - pu.oldBase = &*(m.hedge.begin()); - pu.oldEnd = &m.hedge.back()+1; - } - - hi = Allocator::AddHEdges(m,2*edge_n); - - pu.newBase = &*(m.hedge.begin()); - pu.newEnd = &m.hedge.back()+1; - - //undelete face - fp->ClearD(); - - //undelete edges + ei = Allocator::AddEdges(m,edge_n); for(EdgeIterator ei1 = ei; ei1 != m.edge.end(); ++ei1) - (*ei1).ClearD(); - - // update hedge pointers (if needed) - if( pu.NeedUpdate() ) - for(typename vector::iterator hpsi = hps.begin(); hpsi != hps.end(); ++hpsi) - { - if((*hpsi)) - pu.Update(*hpsi); - } - - - HEdgeIterator hi1 = hi; - HEdgeIterator hi2 = hi; - - ++hi2; - - EdgeIterator ei1 = ei; - - for(; hi2 != m.hedge.end(); ++hi1, ++hi2) - { - // EH - if(HasEH) - (*ei1).EHp() = &(*hi1); - - // HE - if(HasHE) - { - (*hi1).HEp() = &(*ei1); - (*hi2).HEp() = &(*ei1); - } - - //HO - (*hi1).HOp() = &(*hi2); - (*hi2).HOp() = &(*hi1); - - // HF - (*hi1).HFp() = fp; - - ++hi1; - ++hi2; - } - - + (*ei1).SetD(); } + + typename Allocator::template PointerUpdater pu; + + if(m.hedge.empty()) + pu.oldBase = 0; else { + pu.oldBase = &*(m.hedge.begin()); + pu.oldEnd = &m.hedge.back()+1; + } - assert((int) (gp->edge.size()) >= edge_n); - assert((int)(gp->hedge.size()) >= 2*edge_n); + hi = Allocator::AddHEdges(m,2*edge_n); - m.en += edge_n; - m.hn += 2*edge_n; + pu.newBase = &*(m.hedge.begin()); + pu.newEnd = &m.hedge.back()+1; - EdgePointer ep; - HEdgePointer hp1, hp2; + //undelete face + fp->ClearD(); - for(int i=0; i < edge_n;i++) + //undelete edges + for(EdgeIterator ei1 = ei; ei1 != m.edge.end(); ++ei1) + (*ei1).ClearD(); + + // update hedge pointers (if needed) + if( pu.NeedUpdate() ) + for(typename vector::iterator hpsi = hps.begin(); hpsi != hps.end(); ++hpsi) { - ep = gp->edge.back(); - hp1 = gp->hedge.back(); - - gp->edge.pop_back(); - gp->hedge.pop_back(); - - hp2 = gp->hedge.back(); - - gp->hedge.pop_back(); - - gphps.push_back(hp1); - - // EH - ep->EHp() = hp1; - - // HE - hp1->HEp() = ep; - hp2->HEp() = ep; - - //HO - hp1->HOp() = hp2; - hp2->HOp() = hp1; - - // HF - hp1->HFp() = fp; + if((*hpsi)) + pu.Update(*hpsi); } + + HEdgeIterator hi1 = hi; + HEdgeIterator hi2 = hi; + + ++hi2; + + EdgeIterator ei1 = ei; + + for(; hi2 != m.hedge.end(); ++hi1, ++hi2) + { + // EH + if(HasEH) + (*ei1).EHp() = &(*hi1); + + // HE + if(HasHE) + { + (*hi1).HEp() = &(*ei1); + (*hi2).HEp() = &(*ei1); + } + + //HO + (*hi1).HOp() = &(*hi2); + (*hi2).HOp() = &(*hi1); + + // HF + (*hi1).HFp() = fp; + + ++hi1; + ++hi2; } } @@ -987,24 +839,14 @@ namespace vcg { if(hps[i] == NULL) { - if(gp) - { - hps1.push_back(gphps.back()); - gphps.pop_back(); - } - else - { hps1.push_back(&(*hi)); ++hi; ++hi; - } } else hps1.push_back(hps[i]); } - - assert( gphps.size() == 0 ); assert( hps1.size() == size ); for(unsigned int i = 0; i < size; i++) @@ -1105,7 +947,7 @@ namespace vcg * \param fp Face to be removed * */ - static void remove_face_unsafe (MeshType &m, FacePointer fp, GarbagePointer gp = NULL) + static void remove_face_unsafe (MeshType &m, FacePointer fp) { vector hps = getHEdges(fp); @@ -1134,13 +976,6 @@ namespace vcg } else { - if(gp) - { - gp->hedge.push_back(hps[i]); - gp->hedge.push_back(hps[i]->HOp()); - gp->edge.push_back(hps[i]->HEp()); - } - Allocator::DeleteHEdge( m, *hps[i] ); Allocator::DeleteHEdge( m, *(hps[i]->HOp()) ); @@ -1201,9 +1036,6 @@ namespace vcg } - if(gp) - gp->face.push_back(fp); - Allocator::DeleteFace(m,*fp); }