[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15593] branches/harmonic-skeleton/source/ blender: More merging goodness

Martin Poirier theeth at yahoo.com
Tue Jul 15 23:07:13 CEST 2008


Revision: 15593
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15593
Author:   theeth
Date:     2008-07-15 23:07:13 +0200 (Tue, 15 Jul 2008)

Log Message:
-----------
More merging goodness
	fix adjacency list inline instead of having to rebuild fully
	reweight joined graphs properly

Modified Paths:
--------------
    branches/harmonic-skeleton/source/blender/blenlib/BLI_graph.h
    branches/harmonic-skeleton/source/blender/blenlib/intern/graph.c
    branches/harmonic-skeleton/source/blender/src/reeb.c

Modified: branches/harmonic-skeleton/source/blender/blenlib/BLI_graph.h
===================================================================
--- branches/harmonic-skeleton/source/blender/blenlib/BLI_graph.h	2008-07-15 20:05:23 UTC (rev 15592)
+++ branches/harmonic-skeleton/source/blender/blenlib/BLI_graph.h	2008-07-15 21:07:13 UTC (rev 15593)
@@ -76,6 +76,7 @@
 int BLI_hasAdjacencyList(BGraph *rg);
 void BLI_buildAdjacencyList(BGraph *rg);
 void BLI_rebuildAdjacencyList(BGraph* rg);
+void BLI_rebuildAdjacencyListForNode(BGraph* rg, BNode *node);
 void BLI_freeAdjacencyList(BGraph *rg);
 
 int BLI_FlagSubgraphs(BGraph *graph);

Modified: branches/harmonic-skeleton/source/blender/blenlib/intern/graph.c
===================================================================
--- branches/harmonic-skeleton/source/blender/blenlib/intern/graph.c	2008-07-15 20:05:23 UTC (rev 15592)
+++ branches/harmonic-skeleton/source/blender/blenlib/intern/graph.c	2008-07-15 21:07:13 UTC (rev 15593)
@@ -90,12 +90,6 @@
 	node->flag++;
 }
 
-void BLI_rebuildAdjacencyList(BGraph *rg)
-{
-	BLI_freeAdjacencyList(rg);
-	BLI_buildAdjacencyList(rg);
-}
-
 void BLI_buildAdjacencyList(BGraph *rg)
 {
 	BNode *node;
@@ -129,6 +123,38 @@
 	}
 }
 
+void BLI_rebuildAdjacencyListForNode(BGraph* rg, BNode *node)
+{
+	BArc *arc;
+
+	if (node->arcs != NULL)
+	{
+		MEM_freeN(node->arcs);
+	}
+	
+	node->arcs = MEM_callocN((node->degree) * sizeof(BArc*), "adjacency list");
+	
+	/* temporary use to indicate the first index available in the lists */
+	node->flag = 0;
+
+	for(arc = rg->arcs.first; arc; arc= arc->next)
+	{
+		if (arc->head == node)
+		{
+			addArcToNodeAdjacencyList(arc->head, arc);
+		}
+		else if (arc->tail == node)
+		{
+			addArcToNodeAdjacencyList(arc->tail, arc);
+		}
+	}
+
+	if (node->degree != node->flag)
+	{
+		printf("error in node [%p]. Added only %i arcs out of %i\n", node, node->flag, node->degree);
+	}
+}
+
 void BLI_freeAdjacencyList(BGraph *rg)
 {
 	BNode *node;

Modified: branches/harmonic-skeleton/source/blender/src/reeb.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/reeb.c	2008-07-15 20:05:23 UTC (rev 15592)
+++ branches/harmonic-skeleton/source/blender/src/reeb.c	2008-07-15 21:07:13 UTC (rev 15593)
@@ -328,7 +328,7 @@
 		copyArc(cp_rg, arc);
 	}
 	
-	BLI_rebuildAdjacencyList((BGraph*)cp_rg);
+	BLI_buildAdjacencyList((BGraph*)cp_rg);
 	
 	return cp_rg;
 }
@@ -1063,30 +1063,51 @@
 
 void reweightArc(ReebArc *arc, ReebNode *start_node, float start_weight)
 {
-	float delta_weight = arc->tail->weight - arc->head->weight;
+	ReebNode *node;
+	float old_weight;
+	float end_weight = start_weight + (arc->tail->weight - arc->head->weight);
+	int i;
 	
 	if (arc->tail == start_node)
 	{
 		flipArc(arc);
 	}
 	
+	node = arc->tail;
+	
+	for (i = 0; i < node->degree; i++)
+	{
+		ReebArc *next_arc = node->arcs[i];
+		
+		if (next_arc != arc) /* prevent backtracking */
+		{
+			reweightArc(next_arc, node, end_weight);
+		}
+	}
+	
+	old_weight = arc->head->weight; /* backup head weight, other arcs need it intact, it will be fixed by the source arc */
+	
 	arc->head->weight = start_weight;
-	arc->tail->weight = start_weight + delta_weight;
+	arc->tail->weight = end_weight;
 	
 	reweightBuckets(arc);
 	resizeArcBuckets(arc);
 	fillArcEmptyBuckets(arc);
 	
-	/* recurse here */
+	arc->head->weight = old_weight;
 } 
 
 void reweightSubgraph(ReebGraph *rg, ReebNode *start_node, float start_weight)
 {
-	ReebArc *arc;
-	
-	arc = start_node->arcs[0];
-	
-	reweightArc(arc, start_node, start_weight);
+	int i;
+		
+	for (i = 0; i < start_node->degree; i++)
+	{
+		ReebArc *next_arc = start_node->arcs[i];
+		
+		reweightArc(next_arc, start_node, start_weight);
+	}
+	start_node->weight = start_weight;
 }
 
 int joinSubgraphsEnds(ReebGraph *rg, float threshold, int nb_subgraphs)
@@ -1144,6 +1165,7 @@
 						fillArcEmptyBuckets(start_arc);
 						
 						NodeDegreeIncrement(rg, end_node);
+						BLI_rebuildAdjacencyListForNode((BGraph*)rg, (BNode*)end_node);
 						
 						BLI_removeNode((BGraph*)rg, (BNode*)start_node);
 					}
@@ -1163,16 +1185,20 @@
 	int nb_subgraphs;
 	int joined = 0;
 	
-	BLI_rebuildAdjacencyList((BGraph*)rg);
+	BLI_buildAdjacencyList((BGraph*)rg);
 	
 	nb_subgraphs = BLI_FlagSubgraphs((BGraph*)rg);
 	
-	joined |= joinSubgraphsEnds(rg, threshold, nb_subgraphs);
-	
-	if (joined)
+	if (nb_subgraphs > 1)
 	{
-		removeNormalNodes(rg);
-		BLI_rebuildAdjacencyList((BGraph*)rg);
+		joined |= joinSubgraphsEnds(rg, threshold, nb_subgraphs);
+		
+		if (joined)
+		{
+			verifyNodeDegree(rg);
+			removeNormalNodes(rg);
+			BLI_buildAdjacencyList((BGraph*)rg);
+		}
 	}
 	
 	return joined;
@@ -1682,7 +1708,7 @@
 	if (options & SKGEN_FILTER_SMART)
 	{
 		filterSmartReebGraph(rg, 0.5);
-		BLI_rebuildAdjacencyList((BGraph*)rg);
+		BLI_buildAdjacencyList((BGraph*)rg);
 		filterCyclesReebGraph(rg, 0.5);
 	}
 	
@@ -1698,7 +1724,7 @@
 {
 	int i;
 	
-	BLI_rebuildAdjacencyList((BGraph*)rg);
+	BLI_buildAdjacencyList((BGraph*)rg);
 
 	sortNodes(rg);
 	
@@ -3162,10 +3188,8 @@
 	/* Filtering might have created degree 2 nodes, so remove them */
 	removeNormalNodes(rg);
 	
-	joinSubgraphs(rg, 1.5);
+	joinSubgraphs(rg, 1.0);
 	
-	BLI_rebuildAdjacencyList((BGraph*)rg);
-	
 	/* calc length before copy, so we have same length on all levels */
 	BLI_calcGraphLength((BGraph*)rg);
 





More information about the Bf-blender-cvs mailing list