diff --git a/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h b/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h index 36364ac9..36ff5ad8 100644 --- a/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h +++ b/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h @@ -8,7 +8,7 @@ * \ * * All rights reserved. * * * -* This program is free software; you can redistribute it and/or modify * +* This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * @@ -38,24 +38,24 @@ namespace tri{ /// This Class is specialization of LocalModification for the edge collapse. /// It wraps the atomic operation EdgeCollapse to be used in a optimizatin routine. /// Note that it has knowledge of the heap of the class LocalOptimization because -/// it is responsible of updating it after a collapse has been performed; -/// This is the base class of all the specialized collapse classes like for example Quadric Edge Collapse. -/// Each derived class +/// it is responsible of updating it after a collapse has been performed; +/// This is the base class of all the specialized collapse classes like for example Quadric Edge Collapse. +/// Each derived class template class TriEdgeCollapse: public LocalOptimization::LocModType { public: /// static data to gather statistical information about the reasons of collapse failures - class FailStat { + class FailStat { public: - static int &Volume() {static int vol=0; return vol;} - static int &LinkConditionFace(){static int lkf=0; return lkf;} - static int &LinkConditionEdge(){static int lke=0; return lke;} - static int &LinkConditionVert(){static int lkv=0; return lkv;} - static int &OutOfDate() {static int ofd=0; return ofd;} - static int &Border() {static int bor=0; return bor;} - static void Init() + static int &Volume() {static int vol=0; return vol;} + static int &LinkConditionFace(){static int lkf=0; return lkf;} + static int &LinkConditionEdge(){static int lke=0; return lke;} + static int &LinkConditionVert(){static int lkv=0; return lkv;} + static int &OutOfDate() {static int ofd=0; return ofd;} + static int &Border() {static int bor=0; return bor;} + static void Init() { Volume() =0; LinkConditionFace()=0; @@ -72,35 +72,35 @@ protected: typedef typename FaceType::VertexType::CoordType CoordType; typedef typename TriMeshType::VertexType::ScalarType ScalarType; typedef typename LocalOptimization::HeapElem HeapElem; - typedef typename LocalOptimization::HeapType HeapType; + typedef typename LocalOptimization::HeapType HeapType; TriMeshType *mt; - ///the pair to collapse + ///the pair to collapse VertexPair pos; - ///mark for up_dating - static int& GlobalMark(){ static int im=0; return im;} + ///mark for up_dating + static int& GlobalMark(){ static int im=0; return im;} - ///mark for up_dating - int localMark; - - /// priority in the heap - ScalarType _priority; + ///mark for up_dating + int localMark; - public: - /// Default Constructor - inline TriEdgeCollapse() - {} - ///Constructor with postype + /// priority in the heap + ScalarType _priority; + + public: + /// Default Constructor + inline TriEdgeCollapse() + {} + ///Constructor with postype inline TriEdgeCollapse(const VertexPair &p, int mark, BaseParameterClass *pp) - { - localMark = mark; - pos=p; + { + localMark = mark; + pos=p; _priority = ComputePriority(pp); - } + } - ~TriEdgeCollapse() - {} + ~TriEdgeCollapse() + {} private: @@ -108,26 +108,26 @@ private: public: inline ScalarType ComputePriority(BaseParameterClass *) - { - _priority = Distance(pos.V(0)->cP(),pos.V(1)->cP()); + { + _priority = Distance(pos.V(0)->cP(),pos.V(1)->cP()); return _priority; } virtual const char *Info(TriMeshType &m) { - mt = &m; + mt = &m; static char buf[60]; sprintf(buf,"%i -> %i %g\n", int(pos.V(0)-&m.vert[0]), int(pos.V(1)-&m.vert[0]),-_priority); return buf; } - + inline void Execute(TriMeshType &m, BaseParameterClass *) - { + { CoordType MidPoint=(pos.V(0)->P()+pos.V(1)->P())/2.0; EdgeCollapser::Do(m, pos, MidPoint); } - + static bool IsSymmetric(BaseParameterClass *) { return true;} - + // This function is called after an action to re-add in the heap elements whose priority could have been changed. // in the plain case we just put again in the heap all the edges around the vertex resulting from the previous collapse: v[1]. // if the collapse is not symmetric you should add also backward edges (because v0->v1 collapse could be different from v1->v0) @@ -190,28 +190,29 @@ public: inline bool IsFeasible(BaseParameterClass *){ return EdgeCollapser::LinkConditions(pos); - } + } inline bool IsUpToDate() const { VertexType *v0=pos.cV(0); VertexType *v1=pos.cV(1); - if( v0->IsD() || v1->IsD() || - localMark < v0->IMark() || - localMark < v1->IMark() ) - { - ++FailStat::OutOfDate(); - return false; + if( v0->IsD() || v1->IsD() || + localMark < v0->IMark() || + localMark < v1->IMark() ) + { + ++FailStat::OutOfDate(); + return false; } return true; - } + } - virtual ScalarType Priority() const { - return _priority; + virtual ScalarType Priority() const { + return _priority; } static void Init(TriMeshType &m, HeapType &h_ret, BaseParameterClass *pp) { + vcg::tri::RequirePerVertexMark(m); vcg::tri::UpdateTopology::VertexFace(m); h_ret.clear(); typename TriMeshType::FaceIterator fi; @@ -225,7 +226,7 @@ public: //printf("Inserting in heap coll %3i ->%3i %f\n",p.V()-&m.vert[0],p.VFlip()-&m.vert[0],h_ret.back().locModPtr->Priority()); } } - } + } }; }//end namespace tri