diff --git a/apps/test/lem/insert_vertex.h b/apps/test/lem/insert_vertex.h index bedfdf95..5e2fbd55 100644 --- a/apps/test/lem/insert_vertex.h +++ b/apps/test/lem/insert_vertex.h @@ -46,16 +46,124 @@ namespace vcg{ f1->FFi(z1)=z0; } + + template + ///insert a vertex iside a face and re-triangolarize v will be pointer to inserted vertex + void InsertVertEdge(MESH_TYPE &m,typename MESH_TYPE::FaceType** f,int edge,typename MESH_TYPE::VertexType *&v) + { + std::vector local_var; + local_var.push_back(f); + MESH_TYPE::VertexIterator Vi=vcg::tri::Allocator::AddVertices(m,1); + MESH_TYPE::FaceIterator Finit=vcg::tri::Allocator::AddFaces(m,4,local_var); + + if (MESH_TYPE::HasVFTopology()) + Vi->VFp()=0; + + MESH_TYPE::FaceIterator Fi=Finit; + + + //take new faces added + MESH_TYPE::FaceType *Fr0=&(*Fi); + Fi++; + MESH_TYPE::FaceType *Fr1=&(*Fi); + Fi++; + MESH_TYPE::FaceType *Fl0=&(*Fi); + Fi++; + MESH_TYPE::FaceType *Fl1=&(*Fi); + + //old faces + MESH_TYPE::FaceType *fdl=(*f); + MESH_TYPE::FaceType *fdr=(*f)->FFp(edge); + + int edgel=edge; + int edger=(*f)->FFi(edge); + + //opposite vertex used to build new triangles + MESH_TYPE::VertexType *voppl=fdl->V((edgel+2)%3); + MESH_TYPE::VertexType *voppr=fdr->V((edger+2)%3); + + //inizialize the for new faces + Fl0->V(0)=voppl; + Fl0->V(1)=fdl->V(edgel); + Fl0->V(2)=&(*Vi); + Fl1->V(0)=voppl; + Fl1->V(1)=&(*Vi); + Fl1->V(2)=fdl->V((edgel+1)%3); + + Fr0->V(0)=voppr; + Fr0->V(1)=&(*Vi); + Fr0->V(2)=fdr->V((edger+1)%3); + Fr1->V(0)=voppr; + Fr1->V(1)=fdr->V(edger); + Fr1->V(2)=&(*Vi); + + //VFTopology setting + if (MESH_TYPE::HasVFTopology()) + { + for (int i=0;i<3;i++) + { + //initial settings + Fl0->VFp(i)=0; + Fl1->VFp(i)=0; + Fr0->VFp(i)=0; + Fr1->VFp(i)=0; + + //append new faces to VF topology + vcg::face::VFAppend(Fl0,i); + vcg::face::VFAppend(Fl1,i); + vcg::face::VFAppend(Fr0,i); + vcg::face::VFAppend(Fr1,i); + + //erase old faces from VF topology + vcg::face::VFDetach((*fdl),i); + vcg::face::VFDetach((*fdr),i); + + } + } + + //FFTopology setting + if (MESH_TYPE::HasFFTopology()) + { + //attach old faces that was attached by + //the one that should be substituted + FFAttach(Fl0,0,fdl->FFp((edgel+2)%3),fdl->FFi((edgel+2)%3)); + FFAttach(Fl1,2,fdl->FFp((edgel+1)%3),fdl->FFi((edgel+1)%3)); + + FFAttach(Fr0,2,fdr->FFp((edger+1)%3),fdr->FFi((edger+1)%3)); + FFAttach(Fr1,0,fdr->FFp((edger+2)%3),fdr->FFi((edger+2)%3)); + + //then connect between thenselfes + + FFAttach(Fl0,2,Fl1,0); + FFAttach(Fl0,1,Fr0,1); + + FFAttach(Fl1,1,Fr1,1); + FFAttach(Fr0,0,Fr1,2); + + + + } + + //finally set as deleted the old faces + fdl->SetD(); + fdr->SetD(); + v=&(*Vi); + } + + template ///insert a vertex iside a face and re-triangolarize v will be pointer to inserted vertex - void InsertVert(MESH_TYPE &m,typename MESH_TYPE::FaceType** f,typename MESH_TYPE::VertexType *&v) + void InsertVertFace(MESH_TYPE &m,typename MESH_TYPE::FaceType** f,typename MESH_TYPE::VertexType *&v) { + assert(!(*f)->IsD()); std::vector local_var; local_var.push_back(f); MESH_TYPE::VertexIterator Vi=vcg::tri::Allocator::AddVertices(m,1); MESH_TYPE::FaceIterator Finit=vcg::tri::Allocator::AddFaces(m,3,local_var); - + if (MESH_TYPE::HasVFTopology()) + Vi->VFp()=0; + MESH_TYPE::FaceIterator Fi=Finit; MESH_TYPE::FaceType *F; MESH_TYPE::FaceType *fd=(*f); @@ -81,6 +189,9 @@ namespace vcg{ if (MESH_TYPE::HasVFTopology()) { + F->VFp(0)=0; + F->VFp(1)=0; + F->VFp(2)=0; //put new faces on list of the old vertex and new one vcg::face::VFAppend(F,0); vcg::face::VFAppend(F,1);