moved VertexBorderCorner function in updating flags

This commit is contained in:
nico 2017-01-25 17:26:57 +01:00
parent d23632a7d3
commit 2e3e2d5194
2 changed files with 53 additions and 17 deletions

View File

@ -848,27 +848,33 @@ static void EdgeMeshUniform(MeshType &m, VertexSampler &ps, float radius, bool c
///
static void VertexBorderCorner(MeshType & m, VertexSampler &ps, float angleRad)
{
typename MeshType::template PerVertexAttributeHandle<float> angleSumH = tri::Allocator<MeshType>:: template GetPerVertexAttribute<float> (m);
// typename MeshType::template PerVertexAttributeHandle<float> angleSumH = tri::Allocator<MeshType>:: template GetPerVertexAttribute<float> (m);
for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
angleSumH[vi]=0;
// for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
// angleSumH[vi]=0;
for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
{
for(int i=0;i<3;++i)
// for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
// {
// for(int i=0;i<3;++i)
// {
// angleSumH[fi->V(i)] += vcg::Angle(fi->P2(i) - fi->P0(i),fi->P1(i) - fi->P0(i));
// }
// }
// for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
// {
// if((angleSumH[vi]<angleRad && vi->IsB())||
// (angleSumH[vi]>(360-angleRad) && vi->IsB()))
// ps.AddVert(*vi);
// }
// tri::Allocator<MeshType>:: template DeletePerVertexAttribute<float> (m,angleSumH);
vcg::tri::UpdateFlags<MeshType>::FaceClearS(m);
vcg::tri::UpdateFlags<MeshType>::SelectVertexCornerBorder(m,angleRad);
for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
{
angleSumH[fi->V(i)] += vcg::Angle(fi->P2(i) - fi->P0(i),fi->P1(i) - fi->P0(i));
if(vi->IsS())ps.AddVert(*vi);
}
}
for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
{
if((angleSumH[vi]<angleRad && vi->IsB())||
(angleSumH[vi]>(360-angleRad) && vi->IsB()))
ps.AddVert(*vi);
}
tri::Allocator<MeshType>:: template DeletePerVertexAttribute<float> (m,angleSumH);
}
/// \brief Sample all the border vertices

View File

@ -443,6 +443,36 @@ public:
FaceFauxSignedCrease(m,-AngleRad,AngleRad);
}
/// \brief Select the border vertices that form a corner along the boder
/// with an angle that is below a certain threshold
static void SelectVertexCornerBorder(MeshType &m,typename MeshType::ScalarType &angleRad)
{
typedef typename MeshType::ScalarType ScalarType;
//get corner vertices
typename MeshType::template PerVertexAttributeHandle<ScalarType> angleSumH = tri::Allocator<MeshType>:: template GetPerVertexAttribute<ScalarType> (m);
for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
angleSumH[vi]=0;
for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi)
{
for(int i=0;i<(*fi).VN();++i)
{
typename MeshType::CoordType P0=fi->P(i);
typename MeshType::CoordType P1=fi->P((i+1)%(*fi).VN());
typename MeshType::CoordType P2=fi->P((i+2)%(*fi).VN());
angleSumH[fi->V(i)] += vcg::Angle(P2 - P0,P1 - P0);
}
}
for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)
{
if(angleSumH[vi]<angleRad && vi->IsB())
(*vi).SetS();
}
}
}; // end class
} // End namespace tri