[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