From 2b9a9f2be2a35f1a6abed926b4e57d80d4437042 Mon Sep 17 00:00:00 2001
From: cignoni <paolo.cignoni@isti.cnr.it>
Date: Mon, 28 Jan 2013 15:42:24 +0000
Subject: [PATCH] removed a useless loop in the update cycle of the heap of the
 edges to be collapesed. Stupid bug pointed out by Enrico (thanks!)

---
 .../local_optimization/tri_edge_collapse.h    | 81 ++++++++---------
 .../tri_edge_collapse_quadric.h               | 90 +++++++++----------
 2 files changed, 82 insertions(+), 89 deletions(-)

diff --git a/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h b/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h
index 01a22ba6..36364ac9 100644
--- a/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h
+++ b/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h
@@ -134,61 +134,56 @@ public:
 
   inline  void UpdateHeap(HeapType & h_ret, BaseParameterClass *pp)
   {
-		GlobalMark()++; int nn=0;
-		VertexType *v[2];
-		v[0]= pos.V(0);v[1]=pos.V(1);	
-		v[1]->IMark() = GlobalMark();
+    GlobalMark()++;
+    VertexType *v[2];
+    v[0]= pos.V(0);v[1]=pos.V(1);
+    v[1]->IMark() = GlobalMark();
 
-		// First loop around the remaining vertex to unmark visited flags
+    // First loop around the remaining vertex to unmark visited flags
     vcg::face::VFIterator<FaceType> vfi(v[1]);
-		while (!vfi.End()){
-			vfi.V1()->ClearV();
-			vfi.V2()->ClearV();
-			++vfi;
-		}
+    while (!vfi.End()){
+      vfi.V1()->ClearV();
+      vfi.V2()->ClearV();
+      ++vfi;
+    }
 
     // Second Loop: add all the outgoing edges around v[1]
     // for each face add the two edges outgoing from v[1] and not visited.
     vfi = face::VFIterator<FaceType>(v[1]);
     while (!vfi.End())
     {
-			assert(!vfi.F()->IsD());
-      for (int j=0;j<3;j++)
-			{
-				if( !(vfi.V1()->IsV()) && (vfi.V1()->IsRW()))
-				{
-          vfi.V1()->SetV();
-          h_ret.push_back(HeapElem(new MYTYPE(VertexPair( vfi.V(),vfi.V1() ),GlobalMark(),pp)));
+      assert(!vfi.F()->IsD());
+      if( !(vfi.V1()->IsV()) && (vfi.V1()->IsRW()))
+      {
+        vfi.V1()->SetV();
+        h_ret.push_back(HeapElem(new MYTYPE(VertexPair( vfi.V(),vfi.V1() ),GlobalMark(),pp)));
+        std::push_heap(h_ret.begin(),h_ret.end());
+        if(! this->IsSymmetric(pp)){
+          h_ret.push_back(HeapElem(new MYTYPE(VertexPair( vfi.V1(),vfi.V()),GlobalMark(),pp)));
           std::push_heap(h_ret.begin(),h_ret.end());
-          if(! this->IsSymmetric(pp)){
-            h_ret.push_back(HeapElem(new MYTYPE(VertexPair( vfi.V1(),vfi.V()),GlobalMark(),pp)));
-            std::push_heap(h_ret.begin(),h_ret.end());
-          }
         }
-				if(  !(vfi.V2()->IsV()) && (vfi.V2()->IsRW()))
-				{
-					vfi.V2()->SetV();
-          h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.F()->V(vfi.I()),vfi.F()->V2(vfi.I())),GlobalMark(),pp)));
+      }
+      if(  !(vfi.V2()->IsV()) && (vfi.V2()->IsRW()))
+      {
+        vfi.V2()->SetV();
+        h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.F()->V(vfi.I()),vfi.F()->V2(vfi.I())),GlobalMark(),pp)));
+        std::push_heap(h_ret.begin(),h_ret.end());
+        if(! this->IsSymmetric(pp)){
+          h_ret.push_back(HeapElem(new MYTYPE(VertexPair (vfi.F()->V1(vfi.I()),vfi.F()->V(vfi.I())),GlobalMark(),pp)));
           std::push_heap(h_ret.begin(),h_ret.end());
-          if(! this->IsSymmetric(pp)){
-            h_ret.push_back(HeapElem(new MYTYPE(VertexPair (vfi.F()->V1(vfi.I()),vfi.F()->V(vfi.I())),GlobalMark(),pp)));
-            std::push_heap(h_ret.begin(),h_ret.end());
-          }
         }
-        //        if(vfi.V1()->IsRW() && vfi.V2()->IsRW() )
-//        {
-//          h_ret.push_back(HeapElem(new MYTYPE(EdgeType(vfi.V1(),vfi.V2()),this->GlobalMark())));
-//          std::push_heap(h_ret.begin(),h_ret.end());
-//          if(IsSymmetric()){
-//            h_ret.push_back(HeapElem(new MYTYPE(EdgeType(vfi.V2(),vfi.V1()), this->GlobalMark())));
-//            std::push_heap(h_ret.begin(),h_ret.end());
-//          }
-//        }
-
-			}
-      ++vfi;nn++;
-    }
-//		printf("ADDED %d\n",nn);
+      }
+      //        if(vfi.V1()->IsRW() && vfi.V2()->IsRW() )
+      //        {
+      //          h_ret.push_back(HeapElem(new MYTYPE(EdgeType(vfi.V1(),vfi.V2()),this->GlobalMark())));
+      //          std::push_heap(h_ret.begin(),h_ret.end());
+      //          if(IsSymmetric()){
+      //            h_ret.push_back(HeapElem(new MYTYPE(EdgeType(vfi.V2(),vfi.V1()), this->GlobalMark())));
+      //            std::push_heap(h_ret.begin(),h_ret.end());
+      //          }
+      //        }
+      ++vfi;
+    } // end while
   }
 
   ModifierType IsOfType(){ return TriEdgeCollapseOp;}
diff --git a/vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h b/vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h
index f6e9f640..b53de839 100644
--- a/vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h
+++ b/vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h
@@ -453,63 +453,61 @@ public:
   inline  void UpdateHeap(HeapType & h_ret,BaseParameterClass *_pp)
   {
     QParameter *pp=(QParameter *)_pp;
-		this->GlobalMark()++;
-		VertexType *v[2];
-		v[0]= this->pos.V(0);
-        v[1]= this->pos.V(1);	
-		v[1]->IMark() = this->GlobalMark();
+    this->GlobalMark()++;
+    VertexType *v[2];
+    v[0]= this->pos.V(0);
+    v[1]= this->pos.V(1);
+    v[1]->IMark() = this->GlobalMark();
 
-		// First loop around the remaining vertex to unmark visited flags
-    vcg::face::VFIterator<FaceType> vfi(v[1]);	
-		while (!vfi.End()){
-			vfi.V1()->ClearV();
-			vfi.V2()->ClearV();
-			++vfi;
-		}
+    // First loop around the remaining vertex to unmark visited flags
+    vcg::face::VFIterator<FaceType> vfi(v[1]);
+    while (!vfi.End()){
+      vfi.V1()->ClearV();
+      vfi.V2()->ClearV();
+      ++vfi;
+    }
 
-    // Second Loop 
-		vfi = face::VFIterator<FaceType>(v[1]);	
-		while (!vfi.End())
+    // Second Loop
+    vfi = face::VFIterator<FaceType>(v[1]);
+    while (!vfi.End())
     {
-			assert(!vfi.F()->IsD());
-      for (int j=0;j<3;j++)
-			{
-				if( !(vfi.V1()->IsV()) && vfi.V1()->IsRW())
-				{
-				  vfi.V1()->SetV();
-          h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V0(),vfi.V1()), this->GlobalMark(),_pp)));
-				  std::push_heap(h_ret.begin(),h_ret.end());
-          if(!IsSymmetric(pp)){
-            h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V1(),vfi.V0()), this->GlobalMark(),_pp)));
-					  std::push_heap(h_ret.begin(),h_ret.end());
-				  }
+      assert(!vfi.F()->IsD());
+      if( !(vfi.V1()->IsV()) && vfi.V1()->IsRW())
+      {
+        vfi.V1()->SetV();
+        h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V0(),vfi.V1()), this->GlobalMark(),_pp)));
+        std::push_heap(h_ret.begin(),h_ret.end());
+        if(!IsSymmetric(pp)){
+          h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V1(),vfi.V0()), this->GlobalMark(),_pp)));
+          std::push_heap(h_ret.begin(),h_ret.end());
         }
-				if(  !(vfi.V2()->IsV()) && vfi.V2()->IsRW())
-				{
-					vfi.V2()->SetV();
-          h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V0(),vfi.V2()),this->GlobalMark(),_pp)));
-				  std::push_heap(h_ret.begin(),h_ret.end());
-          if(!IsSymmetric(pp)){
-            h_ret.push_back( HeapElem(new MYTYPE(VertexPair(vfi.V2(),vfi.V0()), this->GlobalMark(),_pp) )  );
-					  std::push_heap(h_ret.begin(),h_ret.end());
-				  }
+      }
+      if(  !(vfi.V2()->IsV()) && vfi.V2()->IsRW())
+      {
+        vfi.V2()->SetV();
+        h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V0(),vfi.V2()),this->GlobalMark(),_pp)));
+        std::push_heap(h_ret.begin(),h_ret.end());
+        if(!IsSymmetric(pp)){
+          h_ret.push_back( HeapElem(new MYTYPE(VertexPair(vfi.V2(),vfi.V0()), this->GlobalMark(),_pp) )  );
+          std::push_heap(h_ret.begin(),h_ret.end());
         }
-        if(pp->SafeHeapUpdate && vfi.V1()->IsRW() && vfi.V2()->IsRW() )
-        {
-          h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V1(),vfi.V2()),this->GlobalMark(),_pp)));
-				  std::push_heap(h_ret.begin(),h_ret.end());
-          if(!IsSymmetric(pp)){
-            h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V2(),vfi.V1()), this->GlobalMark(),_pp)));
-					  std::push_heap(h_ret.begin(),h_ret.end());
-				  }
+      }
+      if(pp->SafeHeapUpdate && vfi.V1()->IsRW() && vfi.V2()->IsRW() )
+      {
+        h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V1(),vfi.V2()),this->GlobalMark(),_pp)));
+        std::push_heap(h_ret.begin(),h_ret.end());
+        if(!IsSymmetric(pp)){
+          h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V2(),vfi.V1()), this->GlobalMark(),_pp)));
+          std::push_heap(h_ret.begin(),h_ret.end());
         }
-			}
+      }
+
       ++vfi;
     }
 
   }
 
-static void InitQuadric(TriMeshType &m,BaseParameterClass *_pp)
+  static void InitQuadric(TriMeshType &m,BaseParameterClass *_pp)
 {
   QParameter *pp=(QParameter *)_pp;
 	typename TriMeshType::FaceIterator pf;