[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