[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16426] branches/harmonic-skeleton/source/ blender/src/autoarmature.c: superposed bone check when linking control bones.

Martin Poirier theeth at yahoo.com
Tue Sep 9 00:36:32 CEST 2008


Revision: 16426
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16426
Author:   theeth
Date:     2008-09-09 00:36:32 +0200 (Tue, 09 Sep 2008)

Log Message:
-----------
superposed bone check when linking control bones. deal better with some constraint setups.

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

Modified: branches/harmonic-skeleton/source/blender/src/autoarmature.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/autoarmature.c	2008-09-08 18:37:24 UTC (rev 16425)
+++ branches/harmonic-skeleton/source/blender/src/autoarmature.c	2008-09-08 22:36:32 UTC (rev 16426)
@@ -321,7 +321,7 @@
 	rg->head = NULL;
 	
 	rg->bones_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
-	rg->controls_map = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+	rg->controls_map = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
 	
 	rg->free_arc = RIG_freeRigArc;
 	rg->free_node = NULL;
@@ -462,7 +462,7 @@
 	ctrl->bone = bone;
 	getEditBoneRollUpAxis(bone, bone->roll, ctrl->up_axis);
 	
-	BLI_ghash_insert(rg->controls_map, bone, ctrl);
+	BLI_ghash_insert(rg->controls_map, bone->name, ctrl);
 }
 
 static int RIG_parentControl(RigControl *ctrl, EditBone *link)
@@ -573,8 +573,7 @@
 							/* SET bone link to bone corresponding to pchan */
 							EditBone *link = BLI_ghash_lookup(rg->bones_map, pchan->name);
 							
-							RIG_parentControl(ctrl, link);
-							found = 1;
+							found = RIG_parentControl(ctrl, link);
 						}
 					}
 					
@@ -584,15 +583,53 @@
 			}
 		}
 
-		/* if not found yet, check parent */		
-		if (found == 0 && ctrl->bone->parent)
-		{
-			/* make sure parent is a deforming bone
-			 * NULL if not
-			 *  */
-			EditBone *link = BLI_ghash_lookup(rg->bones_map, ctrl->bone->parent->name);
+		/* if not found yet, check parent */
+		if (found == 0)
+		{		
+			if (ctrl->bone->parent)
+			{
+				/* make sure parent is a deforming bone
+				 * NULL if not
+				 *  */
+				EditBone *link = BLI_ghash_lookup(rg->bones_map, ctrl->bone->parent->name);
+				
+				found = RIG_parentControl(ctrl, link);
+			}
 			
-			found = RIG_parentControl(ctrl, link);
+			/* check if bone is not superposed on another one */
+			{
+				RigArc *arc;
+				RigArc *best_arc = NULL;
+				EditBone *link = NULL;
+				
+				for (arc = rg->arcs.first; arc; arc = arc->next)
+				{
+					RigEdge *edge;
+					for (edge = arc->edges.first; edge; edge = edge->next)
+					{
+						if (edge->bone)
+						{
+							int fit = 0;
+							
+							fit = VecLenf(ctrl->bone->head, edge->bone->head) < 0.0001;
+							fit = fit || VecLenf(ctrl->bone->tail, edge->bone->tail) < 0.0001;
+							
+							if (fit)
+							{
+								/* pick the bone on the arc with the lowest symmetry level
+								 * means you connect control to the trunk of the skeleton */
+								if (best_arc == NULL || arc->symmetry_level < best_arc->symmetry_level)
+								{
+									best_arc = arc;
+									link = edge->bone;
+								}
+							}
+						}
+					}
+				}
+				
+				found = RIG_parentControl(ctrl, link);
+			}
 		}
 		
 		/* if not found yet, check child */		
@@ -622,41 +659,97 @@
 			
 			found = RIG_parentControl(ctrl, link);
 		}
-		
+
 	}
 	
+	
 	/* second pass, make chains in control bones */
 	while (change)
 	{
 		change = 0;
 		
+		printf("-------------------------\n");
+		
 		for (ctrl = rg->controls.first; ctrl; ctrl = ctrl->next)
 		{
 			/* if control is not linked yet */
 			if (ctrl->link == NULL)
 			{
-				RigControl *ctrl_parent = BLI_ghash_lookup(rg->controls_map, ctrl->bone->parent);
+				bPoseChannel *pchan;
+				bConstraint *con;
+				RigControl *ctrl_parent = NULL;
 				RigControl *ctrl_child;
+				int found = 0;
 
-				/* check if parent is already linked */
-				if (ctrl_parent && ctrl_parent->link)
+				if (ctrl->bone->parent)
 				{
-					RIG_parentControl(ctrl, ctrl_parent->bone);
-					change = 1;
+					ctrl_parent = BLI_ghash_lookup(rg->controls_map, ctrl->bone->parent->name);
 				}
-				else
+
+				/* check constraints first */
+				
+				/* DO SOME MAGIC HERE */
+				for (pchan= rg->ob->pose->chanbase.first; pchan; pchan= pchan->next)
 				{
-					/* check childs */
-					for (ctrl_child = rg->controls.first; ctrl_child; ctrl_child = ctrl_child->next)
+					for (con= pchan->constraints.first; con; con= con->next) 
 					{
-						/* if a child is linked, link to that one */
-						if (ctrl_child->link && ctrl_child->bone->parent == ctrl->bone)
+						bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+						ListBase targets = {NULL, NULL};
+						bConstraintTarget *ct;
+						
+						/* constraint targets */
+						if (cti && cti->get_constraint_targets)
 						{
-							RIG_parentControl(ctrl, ctrl_child->bone);
-							change = 1;
-							break;
+							cti->get_constraint_targets(con, &targets);
+							
+							for (ct= targets.first; ct; ct= ct->next)
+							{
+								if ((ct->tar == rg->ob) && strcmp(ct->subtarget, ctrl->bone->name) == 0)
+								{
+									/* SET bone link to ctrl corresponding to pchan */
+									RigControl *link = BLI_ghash_lookup(rg->controls_map, pchan->name);
+
+									/* if owner is a control bone, link with it */									
+									if (link && link->link)
+									{
+										printf("%s -constraint- %s\n", ctrl->bone->name, link->bone->name);
+										RIG_parentControl(ctrl, link->bone);
+										found = 1;
+										break;
+									}
+								}
+							}
+							
+							if (cti->flush_constraint_targets)
+								cti->flush_constraint_targets(con, &targets, 0);
 						}
 					}
+				}			
+
+				if (found == 0)
+				{
+					/* check if parent is already linked */
+					if (ctrl_parent && ctrl_parent->link)
+					{
+						printf("%s -parent- %s\n", ctrl->bone->name, ctrl_parent->bone->name);
+						RIG_parentControl(ctrl, ctrl_parent->bone);
+						change = 1;
+					}
+					else
+					{
+						/* check childs */
+						for (ctrl_child = rg->controls.first; ctrl_child; ctrl_child = ctrl_child->next)
+						{
+							/* if a child is linked, link to that one */
+							if (ctrl_child->link && ctrl_child->bone->parent == ctrl->bone)
+							{
+								printf("%s -child- %s\n", ctrl->bone->name, ctrl_child->bone->name);
+								RIG_parentControl(ctrl, ctrl_child->bone);
+								change = 1;
+								break;
+							}
+						}
+					}
 				}
 			}
 		}
@@ -1067,15 +1160,45 @@
 	printf("\n");
 }
 
-void RIG_printCtrl(RigControl *ctrl)
+void RIG_printCtrl(RigControl *ctrl, char *indent)
 {
-	printf("Bone: %s\n", ctrl->bone->name);
-	printf("Link: %s\n", ctrl->link ? ctrl->link->name : "!NONE!");
-	printf("Flag: %i\n", ctrl->flag);
+	char text[128];
+	
+	printf("%sBone: %s\n", indent, ctrl->bone->name);
+	printf("%sLink: %s\n", indent, ctrl->link ? ctrl->link->name : "!NONE!");
+	
+	sprintf(text, "%soffset", indent);
+	printvecf(text, ctrl->offset);
+	
+	printf("%sFlag: %i\n", indent, ctrl->flag);
 }
 
-void RIG_printArc(RigArc *arc)
+void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs)
 {
+	RigControl *ctrl;
+	char indent[64];
+	char *s = indent;
+	int i;
+	
+	for (i = 0; i < tabs; i++)
+	{
+		s[0] = '\t';
+		s++;
+	}
+	s[0] = 0;
+	
+	for (ctrl = rg->controls.first; ctrl; ctrl = ctrl->next)
+	{
+		if (ctrl->link == bone)
+		{
+			RIG_printCtrl(ctrl, indent);
+			RIG_printLinkedCtrl(rg, ctrl->bone, tabs + 1);
+		}
+	}
+}
+
+void RIG_printArc(RigGraph *rg, RigArc *arc)
+{
 	RigEdge *edge;
 
 	RIG_printNode((RigNode*)arc->head, "head");
@@ -1086,7 +1209,10 @@
 		printf("\t\tlength %f\n", edge->length);
 		printf("\t\tangle %f\n", edge->angle * 180 / M_PI);
 		if (edge->bone)
+		{
 			printf("\t\t%s\n", edge->bone->name);
+			RIG_printLinkedCtrl(rg, edge->bone, 3);
+		}
 	}	
 	printf("symmetry level: %i flag: %i group %i\n", arc->symmetry_level, arc->symmetry_flag, arc->symmetry_group);
 
@@ -1096,21 +1222,13 @@
 void RIG_printGraph(RigGraph *rg)
 {
 	RigArc *arc;
-	RigControl *ctrl;
 
 	printf("---- ARCS ----\n");
 	for (arc = rg->arcs.first; arc; arc = arc->next)
 	{
-		RIG_printArc(arc);	
+		RIG_printArc(rg, arc);	
 		printf("\n");
 	}
-	
-	printf("---- CONTROLS ----\n");
-	for (ctrl = rg->controls.first; ctrl; ctrl = ctrl->next)
-	{
-		RIG_printCtrl(ctrl);
-		printf("\n");
-	}
 
 	if (rg->head)
 	{
@@ -2739,7 +2857,7 @@
 				
 				printf("Armature graph created\n");
 		
-//				RIG_printGraph(rigg);
+				//RIG_printGraph(rigg);
 				
 				rigg->link_mesh = reebg;
 				





More information about the Bf-blender-cvs mailing list