diff --git a/vcg/complex/algorithms/smooth.h b/vcg/complex/algorithms/smooth.h index 1df0a806..7409e6f7 100644 --- a/vcg/complex/algorithms/smooth.h +++ b/vcg/complex/algorithms/smooth.h @@ -1233,26 +1233,39 @@ static void VertexCoordPasoDobleFast(MeshType &m, int NormalSmoothStep, typename } -static void VertexNormalPointCloud(MeshType &m, int neighborNum) +static void VertexNormalPointCloud(MeshType &m, int neighborNum, int iterNum, KdTree *tp=0) { SimpleTempData TD(m.vert,Point3f(0,0,0)); VertexConstDataWrapper ww(m); + KdTree *tree=0; + if(tp==0) tree = new KdTree(ww); + else tree=tp; - KdTree tree(ww); - tree.setMaxNofNeighbors(neighborNum); - for (VertexIterator vi = m.vert.begin();vi!=m.vert.end();++vi) + tree->setMaxNofNeighbors(neighborNum); + for(int ii=0;iicP()); - int neighbours = tree.getNofFoundNeighbors(); + for (VertexIterator vi = m.vert.begin();vi!=m.vert.end();++vi) + { + tree->doQueryK(vi->cP()); + int neighbours = tree->getNofFoundNeighbors(); for (int i = 0; i < neighbours; i++) { - int neightId = tree.getNeighborId(i); + int neightId = tree->getNeighborId(i); + if(m.vert[neightId].cN()*vi->cN()>0) TD[vi]+= m.vert[neightId].cN(); + else + TD[vi]-= m.vert[neightId].cN(); } + } + for (VertexIterator vi = m.vert.begin();vi!=m.vert.end();++vi) + { + vi->N()=TD[vi]; + TD[vi]=Point3f(0,0,0); + } + tri::UpdateNormal::NormalizePerVertex(m); } - for (VertexIterator vi = m.vert.begin();vi!=m.vert.end();++vi) - vi->N()=TD[vi]; - tri::UpdateNormal::NormalizePerVertex(m); + + if(tp==0) delete tree; } //! Laplacian smoothing with a reprojection on a target surface.