Revision: 15506
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15506
Author:   theeth
Date:     2008-07-09 20:36:35 +0200 (Wed, 09 Jul 2008)

Log Message:
-----------
Fix external arc merging bug (could mess up node degrees)

Modified Paths:
--------------
    branches/harmonic-skeleton/source/blender/src/reeb.c

Modified: branches/harmonic-skeleton/source/blender/src/reeb.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/reeb.c        2008-07-09 
15:54:53 UTC (rev 15505)
+++ branches/harmonic-skeleton/source/blender/src/reeb.c        2008-07-09 
18:36:35 UTC (rev 15506)
@@ -340,26 +340,32 @@
        }
 }
 
+#ifdef DEBUG_REEB_NODE
 void NodeDegreeDecrement(ReebGraph *rg, ReebNode *node)
 {
        node->degree--;
 
-//     if (node->degree == 0)
-//     {
-//             printf("would remove node %i\n", node->index);
-//     }
+       if (node->degree == 0)
+       {
+               printf("would remove node %i\n", node->index);
+       }
 }
 
 void NodeDegreeIncrement(ReebGraph *rg, ReebNode *node)
 {
-//     if (node->degree == 0)
-//     {
-//             printf("first connect node %i\n", node->index);
-//     }
+       if (node->degree == 0)
+       {
+               printf("first connect node %i\n", node->index);
+       }
 
        node->degree++;
 }
 
+#else
+#define NodeDegreeDecrement(rg, node) {node->degree--;}
+#define NodeDegreeIncrement(rg, node) {node->degree++;}
+#endif
+
 void repositionNodes(ReebGraph *rg)
 {
        BArc *arc = NULL;
@@ -992,8 +998,8 @@
                {
                        if (arc->head == srcArc->head && arc->tail == 
srcArc->tail && arc != srcArc)
                        {
-                               ReebNode *head = (ReebNode*)srcArc->head;
-                               ReebNode *tail = (ReebNode*)srcArc->tail;
+                               ReebNode *head = srcArc->head;
+                               ReebNode *tail = srcArc->tail;
                                mergeArcBuckets(srcArc, arc, head->weight, 
tail->weight);
                        }
                }
@@ -1021,7 +1027,6 @@
                        {
                                // v1 or v2 was already newNode, since we're 
removing an arc, decrement degree
                                NodeDegreeDecrement(rg, newNode);
-                               //newNode->degree--;
                                
                                // If it's srcArc, it'll be removed later, so 
keep it for now
                                if (arc != srcArc)
@@ -1032,7 +1037,7 @@
                        }
                        else
                        {
-                               /* flip arcs that flipped can happen on diamond 
shapes, mostly on null arcs */
+                               /* flip arcs that flipped, can happen on 
diamond shapes, mostly on null arcs */
                                if (arc->head->weight > arc->tail->weight)
                                {
                                        ReebNode *tmp;
@@ -1048,12 +1053,15 @@
 
                                if (merging)
                                {
-                                       ReebNode *head = (ReebNode*)arc->head;
-                                       ReebNode *tail = (ReebNode*)arc->tail;
+                                       ReebNode *head = arc->head;
+                                       ReebNode *tail = arc->tail;
 
                                        // resize bucket list
                                        resizeArcBuckets(arc);
                                        mergeArcBuckets(arc, srcArc, 
head->weight, tail->weight);
+                                       
+                                       /* update length */
+                                       arc->length += srcArc->length;
                                }
                        }
                }
@@ -1167,9 +1175,7 @@
                {
                        ReebNode *terminalNode = NULL;
                        ReebNode *middleNode = NULL;
-                       ReebNode *newNode = NULL;
                        ReebNode *removedNode = NULL;
-                       int merging = 0;
                        
                        // Assign terminal and middle nodes
                        if (arc->head->degree == 1)
@@ -1186,29 +1192,17 @@
                        // If middle node is a normal node, it will be removed 
later
                        if (middleNode->degree == 2)
                        {
-//                             continue;
-                               merging = 1;
-                               newNode = terminalNode;
                                removedNode = middleNode;
+
+                               filterArc(rg, terminalNode, removedNode, arc, 
1);
                        }
                        // Otherwise, just plain remove of the arc
                        else
                        {
-                               merging = 0;
-                               newNode = middleNode;
                                removedNode = terminalNode;
-                       }
-                       
-                       // Merging arc
-                       if (merging)
-                       {
-                               filterArc(rg, newNode, removedNode, arc, 1);
-                       }
-                       else
-                       {
+
                                // removing arc, so we need to decrease the 
degree of the remaining node
-                               //newNode->degree--;
-                               NodeDegreeDecrement(rg, newNode);
+                               NodeDegreeDecrement(rg, middleNode);
                        }
 
                        // Reset nextArc, it might have changed
@@ -1441,6 +1435,8 @@
        
        calculateGraphLength(rg);
 
+       verifyNodeDegree(rg);
+
        /* filter until there's nothing more to do */
        while (done == 1)
        {
@@ -1450,12 +1446,14 @@
                {
 //                     done |= filterExternalReebGraph(rg, threshold_external 
* rg->resolution);
                        done |= filterExternalReebGraph(rg, threshold_external);
+                       verifyNodeDegree(rg);
                }
        
                if (options & SKGEN_FILTER_INTERNAL)
                {
 //                     done |= filterInternalReebGraph(rg, threshold_internal 
* rg->resolution);
                        done |= filterInternalReebGraph(rg, threshold_internal);
+                       verifyNodeDegree(rg);
                }
        }
 
@@ -1466,6 +1464,8 @@
                filterCyclesReebGraph(rg, 0.5);
        }
        
+       verifyNodeDegree(rg);
+
        repositionNodes(rg);
 
        /* Filtering might have created degree 2 nodes, so remove them */
@@ -1627,7 +1627,7 @@
                        {
                                ReebArc *connectedArc = 
(ReebArc*)BLI_findConnectedArc((BGraph*)rg, (BArc*)arc, (BNode*)arc->head);
 
-                               // Merge arc only if needed
+                               /* If arcs are one after the other */
                                if (arc->head == connectedArc->tail)
                                {               
                                        /* remove furthest arc */               
@@ -1639,14 +1639,14 @@
                                        else
                                        {
                                                mergeConnectedArcs(rg, 
connectedArc, arc);
-                                               break;
-                                               arc = connectedArc; /* arc was 
removed, continue with connected */
+                                               break; /* arc was removed, move 
to next */
                                        }
                                }
-                               // Otherwise, mark down vert
+                               /* Otherwise, arcs are side by side */
                                else
                                {
-                                       arc->head->degree = 3;
+                                       /* Don't do anything, we need to keep 
the lowest node, even if degree 2 */
+                                       break;
                                }
                        }
                        
@@ -1655,7 +1655,7 @@
                        {
                                ReebArc *connectedArc = 
(ReebArc*)BLI_findConnectedArc((BGraph*)rg, (BArc*)arc, (BNode*)arc->tail);
                                
-                               // Merge arc only if needed
+                               /* If arcs are one after the other */
                                if (arc->tail == connectedArc->head)
                                {                               
                                        /* remove furthest arc */               
@@ -1667,14 +1667,14 @@
                                        else
                                        {
                                                mergeConnectedArcs(rg, 
connectedArc, arc);
-                                               break;
-                                               arc = connectedArc; /* arc was 
removed, continue with connected */
+                                               break; /* arc was removed, move 
to next */
                                        }
                                }
-                               // Otherwise, mark down vert
+                               /* Otherwise, arcs are side by side */
                                else
                                {
-                                       arc->tail->degree = 3;
+                                       /* Don't do anything, we need to keep 
the lowest node, even if degree 2 */
+                                       break;
                                }
                        }
                }


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to