[Bf-blender-cvs] [866f103] depsgraph_refactor: Depsgraph: De-duplicate root ik solver bone find code

Sergey Sharybin noreply at git.blender.org
Wed Nov 26 17:19:07 CET 2014


Commit: 866f1037df48af57fd79dd89d78851befca2b96c
Author: Sergey Sharybin
Date:   Wed Nov 26 14:49:40 2014 +0100
Branches: depsgraph_refactor
https://developer.blender.org/rB866f1037df48af57fd79dd89d78851befca2b96c

Depsgraph: De-duplicate root ik solver bone find code

===================================================================

M	source/blender/blenkernel/BKE_armature.h
M	source/blender/blenkernel/intern/armature.c
M	source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
M	source/blender/depsgraph/intern/depsgraph_build_relations.cpp

===================================================================

diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 4c78648..0bc2126 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -144,6 +144,14 @@ void b_bone_spline_setup(struct bPoseChannel *pchan, int rest, Mat4 result_array
 	(PBONE_VISIBLE(arm, bone) && !((bone)->flag & BONE_UNSELECTABLE))
 
 /* Evaluation helpers */
+struct bKinematicConstraint;
+struct bSplineIKConstraint;
+
+struct bPoseChannel *BKE_armature_ik_solver_find_root(struct bPoseChannel *pchan,
+                                                      struct bKinematicConstraint *data);
+struct bPoseChannel* BKE_armature_splineik_solver_find_root(struct bPoseChannel *pchan,
+                                                            struct bSplineIKConstraint *data);
+
 void BKE_pose_splineik_init_tree(struct Scene *scene, struct Object *ob, float ctime);
 void BKE_splineik_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan_root, float ctime);
 
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index e7e0aff..eda451f 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -2643,6 +2643,47 @@ BoundBox *BKE_armature_boundbox_get(Object *ob)
 	return ob->bb;
 }
 
+/************** Graph evaluation ********************/
+
+bPoseChannel *BKE_armature_ik_solver_find_root(bPoseChannel *pchan,
+                                               bKinematicConstraint *data)
+{
+	bPoseChannel *rootchan = pchan;
+	if (!(data->flag & CONSTRAINT_IK_TIP)) {
+		/* Exclude tip from chain. */
+		rootchan = rootchan->parent;
+	}
+	if (rootchan != NULL) {
+		int segcount = 0;
+		while (rootchan->parent) {
+			/* Continue up chain, until we reach target number of items. */
+			segcount++;
+			if (segcount == data->rootbone) {
+				break;
+			}
+			rootchan = rootchan->parent;
+		}
+	}
+	return rootchan;
+}
+
+bPoseChannel* BKE_armature_splineik_solver_find_root(bPoseChannel *pchan,
+                                                     bSplineIKConstraint *data)
+{
+	bPoseChannel *rootchan = pchan;
+	int segcount = 0;
+	BLI_assert(rootchan != NULL);
+	while (rootchan->parent) {
+		/* Continue up chain, until we reach target number of items. */
+		segcount++;
+		if (segcount == data->chainlen) {
+			break;
+		}
+		rootchan = rootchan->parent;
+	}
+	return rootchan;
+}
+
 void BKE_splineik_execute_tree(Scene *scene, Object *ob, bPoseChannel *pchan_root, float ctime)
 {
 	splineik_execute_tree(scene, ob, pchan_root, ctime);
diff --git a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
index 4346e54..7075129 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
@@ -510,26 +510,9 @@ void DepsgraphNodeBuilder::build_particles(Object *ob)
 void DepsgraphNodeBuilder::build_ik_pose(Scene *scene, Object *ob, bPoseChannel *pchan, bConstraint *con)
 {
 	bKinematicConstraint *data = (bKinematicConstraint *)con->data;
-	
-	/* find the chain's root */
-	bPoseChannel *rootchan = pchan;
-	/* exclude tip from chain? */
-	if (!(data->flag & CONSTRAINT_IK_TIP)) {
-		rootchan = rootchan->parent;
-	}
-	
-	if (rootchan) {
-		size_t segcount = 0;
-		while (rootchan->parent) {
-			/* continue up chain, until we reach target number of items... */
-			segcount++;
-			if ((segcount == data->rootbone) || (segcount > 255)) break;  /* XXX 255 is weak */
-			
-			rootchan = rootchan->parent;
-		}
-	}
-	
-	/* operation node for evaluating/running IK Solver */
+	/* Find the chain's root. */
+	bPoseChannel *rootchan = BKE_armature_ik_solver_find_root(pchan, data);
+	/* Operation node for evaluating/running IK Solver. */
 	add_operation_node(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name,
 	                   DEPSOP_TYPE_SIM, bind(BKE_pose_iktree_evaluate, _1, scene, ob, rootchan),
 	                   deg_op_name_ik_solver);
@@ -539,20 +522,10 @@ void DepsgraphNodeBuilder::build_ik_pose(Scene *scene, Object *ob, bPoseChannel
 void DepsgraphNodeBuilder::build_splineik_pose(Scene *scene, Object *ob, bPoseChannel *pchan, bConstraint *con)
 {
 	bSplineIKConstraint *data = (bSplineIKConstraint *)con->data;
-	
-	/* find the chain's root */
-	bPoseChannel *rootchan = pchan;
-	size_t segcount = 0;
-	while (rootchan->parent) {
-		/* continue up chain, until we reach target number of items... */
-		segcount++;
-		if ((segcount == data->chainlen) || (segcount > 255)) break;  /* XXX 255 is weak */
-		
-		rootchan = rootchan->parent;
-	}
-	
-	/* operation node for evaluating/running IK Solver
-	 * store the "root bone" of this chain in the solver, so it knows where to start
+	/* Find the chain's root. */
+	bPoseChannel *rootchan = BKE_armature_splineik_solver_find_root(pchan, data);
+	/* Operation node for evaluating/running IK Solver.
+	 * Store the "root bone" of this chain in the solver, so it knows where to start.
 	 */
 	add_operation_node(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name,
 	                   DEPSOP_TYPE_SIM, bind(BKE_pose_splineik_evaluate, _1, scene, ob, rootchan),
diff --git a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
index 7598ac0..edccaa4 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
@@ -709,50 +709,11 @@ BLI_INLINE OperationKey bone_transforms_key(Object *ob,
 	return OperationKey(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, "Bone Transforms");
 }
 
-/* TODO(sergey): Deduplicate with the node builder.  */
-static bPoseChannel* ik_solver_rootchan_find(bPoseChannel *pchan,
-                                             bKinematicConstraint *data)
-{
-	bPoseChannel *rootchan = pchan;
-	/* exclude tip from chain? */
-	if (!(data->flag & CONSTRAINT_IK_TIP)) {
-		rootchan = rootchan->parent;
-	}
-	if (rootchan) {
-		size_t segcount = 0;
-		while (rootchan->parent) {
-			/* continue up chain, until we reach target number of items... */
-			segcount++;
-			if ((segcount == data->rootbone) || (segcount > 255)) break;  /* XXX 255 is weak */
-			rootchan = rootchan->parent;
-		}
-	}
-	return rootchan;
-}
-
-/* TODO(sergey): Deduplicate with above. */
-static bPoseChannel* splineik_solver_rootchan_find(bPoseChannel *pchan,
-                                                   bSplineIKConstraint *data)
-{
-	bPoseChannel *rootchan = pchan;
-	if (rootchan) {
-		size_t segcount = 0;
-		while (rootchan->parent) {
-			/* continue up chain, until we reach target number of items... */
-			segcount++;
-			if ((segcount == data->chainlen) || (segcount > 255)) break;  /* XXX 255 is weak */
-			rootchan = rootchan->parent;
-		}
-	}
-	return rootchan;
-}
-
 static void root_map_add_bone(const char *bone,
                               const char *root,
                               DepsgraphRelationBuilder::RootPChanMap *root_map)
 {
 	DepsgraphRelationBuilder::RootPChanMap::iterator found = root_map->find(bone);
-	printf("%s: %s %s\n", __func__, bone, root);
 	if (found != root_map->end()) {
 		found->second.push_back(root);
 	}
@@ -808,7 +769,7 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
 	 * - assume that owner is always part of chain 
 	 * - see notes on direction of rel below...
 	 */
-	bPoseChannel *rootchan = ik_solver_rootchan_find(pchan, data);
+	bPoseChannel *rootchan = BKE_armature_ik_solver_find_root(pchan, data);
 	OperationKey transforms_key = bone_transforms_key(ob, pchan);
 	OperationKey solver_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name, deg_op_name_ik_solver);
 	add_relation(transforms_key, solver_key, DEPSREL_TYPE_TRANSFORM, "IK Solver Owner");
@@ -883,7 +844,7 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *ob,
                                                    RootPChanMap *root_map)
 {
 	bSplineIKConstraint *data = (bSplineIKConstraint *)con->data;
-	bPoseChannel *rootchan = splineik_solver_rootchan_find(pchan, data);
+	bPoseChannel *rootchan = BKE_armature_splineik_solver_find_root(pchan, data);
 	OperationKey transforms_key = bone_transforms_key(ob, pchan);
 	OperationKey solver_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name, deg_op_name_spline_ik_solver);




More information about the Bf-blender-cvs mailing list