Added support of selection in polygon smoothing

This commit is contained in:
Paolo Cignoni 2018-11-29 00:46:35 +01:00
parent 1d7a803c8c
commit a2c22505ed
1 changed files with 13 additions and 8 deletions

View File

@ -259,7 +259,7 @@ private:
//assert(W!=0); //assert(W!=0);
for (size_t k=0;k<(size_t)poly_m.face[i].VN();k++) for (size_t k=0;k<(size_t)poly_m.face[i].VN();k++)
{ {
if (k==j)continue; if (k==j) continue;
int IndexV=vcg::tri::Index(poly_m,poly_m.face[i].V(k)); int IndexV=vcg::tri::Index(poly_m,poly_m.face[i].V(k));
AvVert[IndexV]+=currP*W; AvVert[IndexV]+=currP*W;
AvSum[IndexV]+=W; AvSum[IndexV]+=W;
@ -596,14 +596,16 @@ public:
static void LaplacianReproject(PolyMeshType &poly_m, static void LaplacianReproject(PolyMeshType &poly_m,
TriMeshType &tri_mesh, TriMeshType &tri_mesh,
int nstep=100, int nstep=100,
ScalarType Damp=0.5) ScalarType DampS=0.5,
ScalarType DampR=0.5,
bool OnlyOnSelected=false)
{ {
typedef typename TriMeshType::FaceType TriFaceType; typedef typename TriMeshType::FaceType TriFaceType;
typedef typename TriMeshType::ScalarType TriScalarType; typedef typename TriMeshType::ScalarType TriScalarType;
typedef typename TriMeshType::CoordType TriCoordType; typedef typename TriMeshType::CoordType TriCoordType;
typedef vcg::GridStaticPtr<TriFaceType, TriScalarType> TriMeshGrid; typedef vcg::GridStaticPtr<TriFaceType, TriScalarType> TriMeshGrid;
TriMeshGrid grid; TriMeshGrid grid;
tri::MeshAssert<TriMeshType>::VertexNormalNormalized(tri_mesh);
//initialize the grid //initialize the grid
grid.Set(tri_mesh.face.begin(),tri_mesh.face.end()); grid.Set(tri_mesh.face.begin(),tri_mesh.face.end());
@ -616,14 +618,17 @@ public:
for (size_t i=0;i<poly_m.vert.size();i++) for (size_t i=0;i<poly_m.vert.size();i++)
{ {
if (poly_m.vert[i].IsB())continue; if (poly_m.vert[i].IsB()) continue;
poly_m.vert[i].P()=poly_m.vert[i].P()*Damp+ if (OnlyOnSelected && !poly_m.vert[i].IsS()) continue;
AvVert[i]*(1-Damp);
poly_m.vert[i].P()=poly_m.vert[i].P()*DampS+
AvVert[i]*(1-DampS);
} }
for (size_t i=0;i<poly_m.vert.size();i++) for (size_t i=0;i<poly_m.vert.size();i++)
{ {
if(OnlyOnSelected && !poly_m.vert[i].IsS()) continue;
TriCoordType testPos; TriCoordType testPos;
testPos.Import(poly_m.vert[i].P()); testPos.Import(poly_m.vert[i].P());
TriCoordType closestPt; TriCoordType closestPt;
@ -633,8 +638,8 @@ public:
f=vcg::tri::GetClosestFaceBase(tri_mesh,grid,testPos,MaxD,minDist,closestPt,norm,ip); f=vcg::tri::GetClosestFaceBase(tri_mesh,grid,testPos,MaxD,minDist,closestPt,norm,ip);
CoordType closestImp; CoordType closestImp;
closestImp.Import(closestPt); closestImp.Import(closestPt);
poly_m.vert[i].P()=poly_m.vert[i].P()*Damp+ poly_m.vert[i].P()=poly_m.vert[i].P()*DampR+
closestImp*(1-Damp); closestImp*(1-DampR);
CoordType normalImp; CoordType normalImp;
normalImp.Import(norm); normalImp.Import(norm);
poly_m.vert[i].N()=normalImp; poly_m.vert[i].N()=normalImp;