[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15492] branches/harmonic-skeleton/source/ blender: Rename some struct members to reduce confusion

Martin Poirier theeth at yahoo.com
Tue Jul 8 21:34:20 CEST 2008


Revision: 15492
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15492
Author:   theeth
Date:     2008-07-08 21:34:20 +0200 (Tue, 08 Jul 2008)

Log Message:
-----------
Rename some struct members to reduce confusion
Proper flag clearing for retarget on multi resolution

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

Modified: branches/harmonic-skeleton/source/blender/include/reeb.h
===================================================================
--- branches/harmonic-skeleton/source/blender/include/reeb.h	2008-07-08 18:32:42 UTC (rev 15491)
+++ branches/harmonic-skeleton/source/blender/include/reeb.h	2008-07-08 19:34:20 UTC (rev 15492)
@@ -51,7 +51,7 @@
 	int resolution;
 	int totnodes;
 	struct EdgeHash *emap;
-	struct ReebGraph *link; /* for multi resolution filtering, points to higher levels */
+	struct ReebGraph *link_up; /* for multi resolution filtering, points to higher levels */
 } ReebGraph;
 
 typedef struct EmbedBucket {
@@ -75,6 +75,7 @@
 
 	int index;
 	float weight;
+	struct ReebNode *link_down; /* for multi resolution filtering, points to lower levels, if present */
 } ReebNode;
 
 typedef struct ReebEdge {
@@ -103,7 +104,7 @@
 
 	struct GHash *faces;	
 	float angle;
-	struct ReebArc *link; /* for multi resolution filtering, points to higher levels */
+	struct ReebArc *link_up; /* for multi resolution filtering, points to higher levels */
 } ReebArc;
 
 typedef struct ReebArcIterator {
@@ -159,12 +160,14 @@
 /*********************** PUBLIC *********************************/
 ReebGraph *BIF_ReebGraphFromEditMesh(void);
 ReebGraph *BIF_ReebGraphMultiFromEditMesh(void);
+void BIF_flagMultiArcs(ReebGraph *rg, int flag);
 
 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-08 18:32:42 UTC (rev 15491)
+++ branches/harmonic-skeleton/source/blender/src/autoarmature.c	2008-07-08 19:34:20 UTC (rev 15492)
@@ -81,7 +81,7 @@
 	/*********************************/
 
 	struct RigNode *head;
-	ReebGraph *link;
+	ReebGraph *link_mesh;
 } RigGraph;
 
 typedef struct RigNode {
@@ -97,7 +97,7 @@
 	float symmetry_axis[3];
 	/*********************************/
 
-	ReebNode *link;
+	ReebNode *link_mesh;
 } RigNode;
 
 typedef struct RigArc {
@@ -114,7 +114,7 @@
 	
 	ListBase edges;
 	int count;
-	ReebArc *link;
+	ReebArc *link_mesh;
 } RigArc;
 
 typedef struct RigEdge {
@@ -387,7 +387,7 @@
 			{
 				RigEdge *edge = arc->edges.last;
 				
-				if (edge->bone->flag & BONESEL_ANY)
+				if (edge->bone->flag & (BONE_TIPSEL|BONE_SELECTED))
 				{
 					rg->head = arc->tail;
 					break;
@@ -514,7 +514,7 @@
 static RetargetMode detectArcRetargetMode(RigArc *iarc)
 {
 	RetargetMode mode = RETARGET_AGGRESSIVE;
-	ReebArc *earc = iarc->link;
+	ReebArc *earc = iarc->link_mesh;
 	RigEdge *edge;
 	int large_angle = 0;
 	float avg_angle = 0;
@@ -738,7 +738,7 @@
 	RigEdge *edge;
 	EmbedBucket *bucket = NULL;
 	ReebNode *node_start, *node_end;
-	ReebArc *earc = iarc->link;
+	ReebArc *earc = iarc->link_mesh;
 	float min_cost = FLT_MAX;
 	float *vec0, *vec1, *vec2;
 	float **vec_cache;
@@ -1074,7 +1074,7 @@
 static void retargetArctoArcLength(RigArc *iarc)
 {
 	ReebArcIterator iter;
-	ReebArc *earc = iarc->link;
+	ReebArc *earc = iarc->link_mesh;
 	ReebNode *node_start, *node_end;
 	RigEdge *edge;
 	EmbedBucket *bucket = NULL;
@@ -1203,7 +1203,7 @@
 
 static void retargetArctoArc(RigArc *iarc)
 {
-	ReebArc *earc = iarc->link;
+	ReebArc *earc = iarc->link_mesh;
 	
 	if (BLI_countlist(&iarc->edges) == 1)
 	{
@@ -1247,27 +1247,27 @@
 	ishape = BLI_subtreeShape((BNode*)start_node, (BArc*)next_iarc, 1) % MAGIC_NUMBER;
 	eshape = BLI_subtreeShape((BNode*)enode, (BArc*)next_earc, 1) % MAGIC_NUMBER;
 	
-	while (ishape > eshape && next_earc->link)
+	while (ishape > eshape && next_earc->link_up)
 	{
-		next_earc = next_earc->link;
+		next_earc = next_earc->link_up;
 		enode = next_earc->head;
 		eshape = BLI_subtreeShape((BNode*)enode, (BArc*)next_earc, 1) % MAGIC_NUMBER;
 	} 
 
 	next_earc->flag = 1; // mark as taken
-	next_iarc->link = next_earc;
+	next_iarc->link_mesh = next_earc;
 }
 
 static void findCorrespondingArc(RigArc *start_arc, RigNode *start_node, RigArc *next_iarc)
 {
-	ReebNode *enode = start_node->link;
+	ReebNode *enode = start_node->link_mesh;
 	ReebArc *next_earc;
 	int symmetry_level = next_iarc->symmetry_level;
 	int symmetry_group = next_iarc->symmetry_group;
 	int symmetry_flag = next_iarc->symmetry_flag;
 	int i;
 	
-	next_iarc->link = NULL;
+	next_iarc->link_mesh = NULL;
 		
 	for(i = 0; i < enode->degree; i++)
 	{
@@ -1288,7 +1288,7 @@
 	}
 	
 
-	if (next_iarc->link == NULL)
+	if (next_iarc->link_mesh == NULL)
 	{
 		printf("--------------------------\n");
 		printf("NO CORRESPONDING ARC FOUND\n");
@@ -1310,9 +1310,9 @@
 static void retargetSubgraph(RigGraph *rigg, RigArc *start_arc, RigNode *start_node)
 {
 	RigArc *iarc = start_arc;
-	ReebArc *earc = start_arc->link;
+	ReebArc *earc = start_arc->link_mesh;
 	RigNode *inode = start_node;
-	ReebNode *enode = start_node->link;
+	ReebNode *enode = start_node->link_mesh;
 	int i;
 		
 	retargetArctoArc(iarc);
@@ -1320,7 +1320,7 @@
 	enode = BIF_otherNodeFromIndex(earc, enode);
 	inode = (RigNode*)BLI_otherNode((BArc*)iarc, (BNode*)inode);
 	
-	inode->link = enode;
+	inode->link_mesh = enode;
 	
 	for(i = 0; i < inode->degree; i++)
 	{
@@ -1330,7 +1330,7 @@
 		if (next_iarc != iarc)
 		{
 			findCorrespondingArc(iarc, inode, next_iarc);
-			if (next_iarc->link)
+			if (next_iarc->link_mesh)
 			{
 				retargetSubgraph(rigg, next_iarc, inode);
 			}
@@ -1340,28 +1340,28 @@
 
 static void retargetGraphs(RigGraph *rigg)
 {
-	ReebGraph *reebg = rigg->link;
+	ReebGraph *reebg = rigg->link_mesh;
 	ReebArc *earc;
 	RigArc *iarc;
 	ReebNode *enode;
 	RigNode *inode;
 	
 	/* flag all ReebArcs as not taken */
-	for (earc = reebg->arcs.first; earc; earc = earc->next)
-	{
-		earc->flag = 0;
-	}
+	BIF_flagMultiArcs(reebg, 0);
 	
+	/* return to first level */
+	reebg = rigg->link_mesh;
+	
 	earc = reebg->arcs.first;
 	iarc = (RigArc*)rigg->head->arcs[0];
 	inode = iarc->tail;
 	
 	matchMultiResolutionArc(inode, iarc, earc);
 
-	earc = iarc->link; /* find might have changed it */
+	earc = iarc->link_mesh; /* find might have changed it */
 	enode = earc->head;
 
-	inode->link = enode;
+	inode->link_mesh = enode;
 
 	retargetSubgraph(rigg, iarc, inode);
 }
@@ -1372,9 +1372,6 @@
 	Base *base;
 	ReebGraph *reebg;
 	
-	//reebg = BIF_ReebGraphFromEditMesh();
-	//BLI_markdownSymmetry((BGraph*)reebg, reebg->nodes.first, G.scene->toolsettings->skgen_symmetry_limit);
-	
 	reebg = BIF_ReebGraphMultiFromEditMesh();
 	
 	
@@ -1406,7 +1403,7 @@
 		
 				RIG_printGraph(rigg);
 				
-				rigg->link = reebg;
+				rigg->link_mesh = reebg;
 				
 				printf("retargetting %s\n", ob->id.name);
 				

Modified: branches/harmonic-skeleton/source/blender/src/reeb.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/reeb.c	2008-07-08 18:32:42 UTC (rev 15491)
+++ branches/harmonic-skeleton/source/blender/src/reeb.c	2008-07-08 19:34:20 UTC (rev 15492)
@@ -145,9 +145,9 @@
 	BLI_edgehash_free(rg->emap, NULL);
 	
 	/* free linked graph */
-	if (rg->link)
+	if (rg->link_up)
 	{
-		REEB_freeGraph(rg->link);
+		REEB_freeGraph(rg->link_up);
 	}
 	
 	MEM_freeN(rg);
@@ -170,6 +170,14 @@
 	return rg;
 }
 
+void BIF_flagMultiArcs(ReebGraph *rg, int flag)
+{
+	for ( ; rg; rg = rg->link_up)
+	{
+		BLI_flagArcs((BGraph*)rg, flag);
+	}
+}
+
 ReebNode * addNode(ReebGraph *rg, EditVert *eve, float weight)
 {
 	ReebNode *node = NULL;
@@ -208,6 +216,28 @@
 	return cp_node; 
 }
 
+void relinkNodes(ReebGraph *low_rg, ReebGraph *high_rg)
+{
+	ReebNode *low_node, *high_node;
+	
+	if (low_rg == NULL || high_rg == NULL)
+	{
+		return;
+	}
+	
+	for (low_node = low_rg->nodes.first; low_node; low_node = low_node->next)
+	{
+		for (high_node = high_rg->nodes.first; high_node; high_node = high_node->next)
+		{
+			if (low_node->index == high_node->index)
+			{
+				high_node->link_down = low_node;
+				break;
+			}
+		}
+	}
+}
+
 ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node)
 {
 	return (arc->head->index == node->index) ? arc->tail : arc->head;
@@ -222,7 +252,7 @@
 
 	memcpy(cp_arc, arc, sizeof(ReebArc));
 	
-	cp_arc->link = arc;
+	cp_arc->link_up = arc;
 	
 	cp_arc->head = NULL;
 	cp_arc->tail = NULL;
@@ -266,7 +296,7 @@
 	ReebGraph *cp_rg = newReebGraph();
 	
 	cp_rg->resolution = rg->resolution;
-	cp_rg->link = rg;
+	cp_rg->link_up = rg;
 
 	/* Copy nodes */	
 	for (node = rg->nodes.first; node; node = node->next)
@@ -438,7 +468,7 @@
 void verifyMultiResolutionLinks(ReebGraph *rg)
 {
 #ifdef DEBUG_REEB
-	ReebGraph *lower_rg = rg->link;
+	ReebGraph *lower_rg = rg->link_up;
 	
 	if (lower_rg)
 	{
@@ -446,9 +476,9 @@
 		
 		for (arc = rg->arcs.first; arc; arc = arc->next)
 		{
-			if (BLI_findindex(&lower_rg->arcs, arc->link) == -1)
+			if (BLI_findindex(&lower_rg->arcs, arc->link_up) == -1)
 			{
-				printf("missing arc %p\n", arc->link);
+				printf("missing arc %p\n", arc->link_up);
 			}
 		}
 		
@@ -2874,7 +2904,7 @@
 {
 	EditMesh *em = G.editMesh;
 	ReebGraph *rg = NULL;
-	ReebGraph *rgi;
+	ReebGraph *rgi, *previous;
 	int i, nb_levels = 5;
 	
 	if (em == NULL)
@@ -2912,10 +2942,10 @@
 		rg = copyReebGraph(rg);
 	}
 	
-	for (rgi = rg, i = nb_levels; rgi; rgi = rgi->link, i--)
+	for (rgi = rg, i = nb_levels, previous = NULL; rgi; previous = rgi, rgi = rgi->link_up, i--)
 	{
 		/* don't fully filter last level */
-		if (rgi->link)
+		if (rgi->link_up)
 		{
 			float internal_threshold = G.scene->toolsettings->skgen_threshold_internal * (i / (float)nb_levels);
 			float external_threshold = G.scene->toolsettings->skgen_threshold_external * (i / (float)nb_levels);
@@ -2930,6 +2960,8 @@
 		finalizeGraph(rgi, G.scene->toolsettings->skgen_postpro_passes, G.scene->toolsettings->skgen_postpro);
 
 		BLI_markdownSymmetry((BGraph*)rgi, rgi->nodes.first, G.scene->toolsettings->skgen_symmetry_limit);
+		
+		relinkNodes(previous, rgi);
 	}
 	
 	verifyMultiResolutionLinks(rg);
@@ -3033,15 +3065,15 @@
 		return;
 	}
 	
-	if (GLOBAL_RG->link && G.scene->toolsettings->skgen_options & SKGEN_DISP_ORIG)
+	if (GLOBAL_RG->link_up && G.scene->toolsettings->skgen_options & SKGEN_DISP_ORIG)
 	{
-		for (rg = GLOBAL_RG; rg->link; rg = rg->link) ;
+		for (rg = GLOBAL_RG; rg->link_up; rg = rg->link_up) ;
 	}
 	else
 	{
 		i = G.scene->toolsettings->skgen_multi_level;
 		
-		for (rg = GLOBAL_RG; i && rg->link; i--, rg = rg->link) ;
+		for (rg = GLOBAL_RG; i && rg->link_up; i--, rg = rg->link_up) ;
 	}
 	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list