[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15475] branches/harmonic-skeleton/source/ blender: First draft: Use multiresolution graph for retargetting ( enables bypassing small appendages that don' t correspond to anything on the armature).

Martin Poirier theeth at yahoo.com
Mon Jul 7 22:31:53 CEST 2008


Revision: 15475
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15475
Author:   theeth
Date:     2008-07-07 22:31:53 +0200 (Mon, 07 Jul 2008)

Log Message:
-----------
First draft: Use multiresolution graph for retargetting (enables bypassing small appendages that don't correspond to anything on the armature).

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/include/reeb.h
    branches/harmonic-skeleton/source/blender/src/autoarmature.c
    branches/harmonic-skeleton/source/blender/src/buttons_editing.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-07 20:28:56 UTC (rev 15474)
+++ branches/harmonic-skeleton/source/blender/blenlib/BLI_graph.h	2008-07-07 20:31:53 UTC (rev 15475)
@@ -78,6 +78,8 @@
 
 int BLI_FlagSubgraphs(BGraph *graph);
 
+int BLI_subtreeShape(BNode *node, BArc *rootArc, int include_root);
+
 void BLI_replaceNode(BGraph *graph, BNode *node_src, BNode *node_replaced);
 void BLI_removeDoubleNodes(BGraph *graph, float limit);
 

Modified: branches/harmonic-skeleton/source/blender/blenlib/intern/graph.c
===================================================================
--- branches/harmonic-skeleton/source/blender/blenlib/intern/graph.c	2008-07-07 20:28:56 UTC (rev 15474)
+++ branches/harmonic-skeleton/source/blender/blenlib/intern/graph.c	2008-07-07 20:31:53 UTC (rev 15475)
@@ -321,34 +321,40 @@
 
 /*********************************** GRAPH AS TREE FUNCTIONS *******************************************/
 
-int BLI_subtreeShape(BNode *node, BArc *rootArc)
+int BLI_subtreeShape(BNode *node, BArc *rootArc, int include_root)
 {
 	int depth = 0;
 	
-	/* Base case, no arcs leading away */
-	if (node->arcs == NULL || *(node->arcs) == NULL)
+	if (include_root)
 	{
-		return 0;
+		BNode *newNode = BLI_otherNode(rootArc, node);
+		depth = BLI_subtreeShape(newNode, rootArc, 0);
 	}
 	else
 	{
-		int i;
-
-		for(i = 0; i < node->degree; i++)
+		/* Base case, no arcs leading away */
+		if (node->arcs == NULL || *(node->arcs) == NULL)
 		{
-			BArc *arc = node->arcs[i];
-			
-			/* only arcs that go down the tree */
-			if (arc != rootArc)
+			return 0;
+		}
+		else
+		{
+			int i;
+	
+			for(i = 0; i < node->degree; i++)
 			{
-				BNode *newNode = BLI_otherNode(arc, node);
-				//depth = MAX2(depth, BLI_subtreeShape(newNode, arc));
-				depth += BLI_subtreeShape(newNode, arc);
+				BArc *arc = node->arcs[i];
+				
+				/* only arcs that go down the tree */
+				if (arc != rootArc)
+				{
+					BNode *newNode = BLI_otherNode(arc, node);
+					depth += BLI_subtreeShape(newNode, arc, 0);
+				}
 			}
 		}
 	}
 	
-	//return depth + 1;
 	return 10 * depth + 1;
 }
 
@@ -776,7 +782,7 @@
 			BNode *connectedNode = BLI_otherNode(connectedArc, node);
 			
 			/* symmetry level is positive value, negative values is subtree depth */
-			connectedArc->symmetry_level = -BLI_subtreeShape(connectedNode, connectedArc);
+			connectedArc->symmetry_level = -BLI_subtreeShape(connectedNode, connectedArc, 0);
 		}
 	}
 

Modified: branches/harmonic-skeleton/source/blender/include/reeb.h
===================================================================
--- branches/harmonic-skeleton/source/blender/include/reeb.h	2008-07-07 20:28:56 UTC (rev 15474)
+++ branches/harmonic-skeleton/source/blender/include/reeb.h	2008-07-07 20:31:53 UTC (rev 15475)
@@ -163,6 +163,8 @@
 void BIF_GlobalReebGraphFromEditMesh(void);
 void BIF_GlobalReebFree(void);
 
+ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
+
 void REEB_freeGraph(ReebGraph *rg);
 void REEB_exportGraph(ReebGraph *rg, int count);
 void REEB_draw();

Modified: branches/harmonic-skeleton/source/blender/src/autoarmature.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/autoarmature.c	2008-07-07 20:28:56 UTC (rev 15474)
+++ branches/harmonic-skeleton/source/blender/src/autoarmature.c	2008-07-07 20:31:53 UTC (rev 15475)
@@ -1257,11 +1257,22 @@
 			next_earc->symmetry_group == symmetry_group &&
 			next_earc->symmetry_level == symmetry_level)
 		{
+			int ishape, eshape;
 
 			printf("-----------------------\n");
 			printf("CORRESPONDING ARC FOUND\n");
 			RIG_printArcBones(next_iarc);
 			printf("flag %i -- symmetry level %i -- symmetry flag %i\n", next_earc->flag, next_earc->symmetry_level, next_earc->symmetry_flag);
+			
+			ishape = BLI_subtreeShape((BNode*)start_node, (BArc*)next_iarc, 1);
+			eshape = BLI_subtreeShape((BNode*)enode, (BArc*)next_earc, 1);
+			
+			while (ishape > eshape && next_earc->link)
+			{
+				next_earc = next_earc->link;
+				enode = next_earc->head; //enode->link;
+				eshape = BLI_subtreeShape((BNode*)enode, (BArc*)next_earc, 1);
+			} 
 
 			next_earc->flag = 1; // mark as taken
 			next_iarc->link = next_earc;
@@ -1299,7 +1310,7 @@
 		
 	retargetArctoArc(iarc);
 	
-	enode = (ReebNode*)BLI_otherNode((BArc*)earc, (BNode*)enode);
+	enode = BIF_otherNodeFromIndex(earc, enode);
 	inode = (RigNode*)BLI_otherNode((BArc*)iarc, (BNode*)inode);
 	
 	inode->link = enode;

Modified: branches/harmonic-skeleton/source/blender/src/buttons_editing.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/buttons_editing.c	2008-07-07 20:28:56 UTC (rev 15474)
+++ branches/harmonic-skeleton/source/blender/src/buttons_editing.c	2008-07-07 20:31:53 UTC (rev 15475)
@@ -5027,10 +5027,10 @@
 	uiDefButS(block, NUM, B_DIFF, "Resolution:",							1025,150,225,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0,		"Specifies the resolution of the graph's embedding");
 	uiDefButBitS(block, TOG, SKGEN_HARMONIC, B_DIFF, 		"H",			1250,150, 25,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Apply harmonic smoothing to the weighting");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In",	1025,130, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter internal small arcs from graph");
-	uiDefButF(block, NUM, B_DIFF, 							"",				1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering internal arcs");
+	uiDefButF(block, NUM, B_DIFF, 							"",				1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 5.0, 10, 0,	"Specify the threshold ratio for filtering internal arcs");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_EXTERNAL, B_DIFF, "Filter Ex",	1025,110, 53,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter external small arcs from graph");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_SMART, 	B_DIFF, "Sm",			1078,110, 30,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Smart Filtering");
-	uiDefButF(block, NUM, B_DIFF, 							"",				1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering external arcs");
+	uiDefButF(block, NUM, B_DIFF, 							"",				1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 5.0, 10, 0,	"Specify the threshold ratio for filtering external arcs");
 	uiBlockEndAlign(block);
 	
 	uiDefButBitS(block, TOG, SKGEN_DISP_LENGTH, REDRAWVIEW3D,	"Length",			1025, 60, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,		"Show Length");
@@ -5054,10 +5054,10 @@
 	uiDefButS(block, NUM, B_DIFF, "Resolution:",							1025,150,225,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0,		"Specifies the resolution of the graph's embedding");
 	uiDefButBitS(block, TOG, SKGEN_HARMONIC, B_DIFF, 		"H",			1250,150, 25,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Apply harmonic smoothing to the weighting");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In",	1025,130, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter internal small arcs from graph");
-	uiDefButF(block, NUM, B_DIFF, 							"",				1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering internal arcs");
+	uiDefButF(block, NUM, B_DIFF, 							"",				1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 5.0, 10, 0,	"Specify the threshold ratio for filtering internal arcs");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_EXTERNAL, B_DIFF, "Filter Ex",	1025,110, 53,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter external small arcs from graph");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_SMART, 	B_DIFF, "Sm",			1078,110, 30,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Smart Filtering");
-	uiDefButF(block, NUM, B_DIFF, 							"",				1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering external arcs");
+	uiDefButF(block, NUM, B_DIFF, 							"",				1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 5.0, 10, 0,	"Specify the threshold ratio for filtering external arcs");
 	uiBlockEndAlign(block);
 
 	uiDefButF(block, NUM, B_DIFF, 							"Ang:",			1025, 60, 83,19, &G.scene->toolsettings->skgen_retarget_angle_weight, 0, 10, 1, 0,		"Angle Weight");
@@ -5090,10 +5090,10 @@
 	uiDefButS(block, NUM, B_DIFF, "Resolution:",							1025,150,225,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0,		"Specifies the resolution of the graph's embedding");
 	uiDefButBitS(block, TOG, SKGEN_HARMONIC, B_DIFF, 		"H",			1250,150, 25,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Apply harmonic smoothing to the weighting");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In",	1025,130, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter internal small arcs from graph");
-	uiDefButF(block, NUM, B_DIFF, 							"",				1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering internal arcs");
+	uiDefButF(block, NUM, B_DIFF, 							"",				1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 5.0, 10, 0,	"Specify the threshold ratio for filtering internal arcs");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_EXTERNAL, B_DIFF, "Filter Ex",	1025,110, 53,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Filter external small arcs from graph");
 	uiDefButBitS(block, TOG, SKGEN_FILTER_SMART, 	B_DIFF, "Sm",			1078,110, 30,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0,					"Smart Filtering");
-	uiDefButF(block, NUM, B_DIFF, 							"",				1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 1.0, 10, 0,	"Specify the threshold ratio for filtering external arcs");
+	uiDefButF(block, NUM, B_DIFF, 							"",				1111,110,164,19, &G.scene->toolsettings->skgen_threshold_external,0.0, 5.0, 10, 0,	"Specify the threshold ratio for filtering external arcs");
 	uiBlockEndAlign(block);
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list