[Bf-blender-cvs] [2d58cb8] depsgraph_refactor: Depsgraph: Hook up spline IK solver to the granular update
Sergey Sharybin
noreply at git.blender.org
Thu Nov 20 16:13:53 CET 2014
Commit: 2d58cb899805389bb7e6a6e431de0636f2ca546f
Author: Sergey Sharybin
Date: Thu Nov 20 16:11:28 2014 +0100
Branches: depsgraph_refactor
https://developer.blender.org/rB2d58cb899805389bb7e6a6e431de0636f2ca546f
Depsgraph: Hook up spline IK solver to the granular update
A bit of test of prove-of-concept of the design made in the previous commit.
still needs a bit of cleanup (de-duplicate some logic, move functions to their
final location etc).
But currently it's good enough for testing i guess.
===================================================================
M source/blender/blenkernel/BKE_armature.h
M source/blender/blenkernel/intern/armature.c
M source/blender/depsgraph/intern/depsgraph_build.h
M source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
M source/blender/depsgraph/intern/depsgraph_build_relations.cpp
M source/blender/depsgraph/intern/depsgraph_type_defines.cpp
M source/blender/depsgraph/intern/stubs.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index ba0db26..4c78648 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -145,6 +145,7 @@ void b_bone_spline_setup(struct bPoseChannel *pchan, int rest, Mat4 result_array
/* Evaluation helpers */
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);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 7e0898c..e7e0aff 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -2642,3 +2642,8 @@ BoundBox *BKE_armature_boundbox_get(Object *ob)
return ob->bb;
}
+
+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.h b/source/blender/depsgraph/intern/depsgraph_build.h
index c2fb730..76c49a4 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.h
+++ b/source/blender/depsgraph/intern/depsgraph_build.h
@@ -136,7 +136,7 @@ struct DepsgraphNodeBuilder {
void build_animdata(ID *id);
OperationDepsNode *build_driver(ID *id, FCurve *fcurve);
void build_ik_pose(Scene *scene, Object *ob, bPoseChannel *pchan, bConstraint *con);
- void build_splineik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con);
+ void build_splineik_pose(Scene *scene, Object *ob, bPoseChannel *pchan, bConstraint *con);
void build_rig(Scene *scene, Object *ob);
void build_shapekeys(Key *key);
void build_obdata_geom(Scene *scene, Object *ob);
diff --git a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
index 8835d47..4346e54 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
@@ -536,7 +536,7 @@ void DepsgraphNodeBuilder::build_ik_pose(Scene *scene, Object *ob, bPoseChannel
}
/* Spline IK Eval Steps */
-void DepsgraphNodeBuilder::build_splineik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con)
+void DepsgraphNodeBuilder::build_splineik_pose(Scene *scene, Object *ob, bPoseChannel *pchan, bConstraint *con)
{
bSplineIKConstraint *data = (bSplineIKConstraint *)con->data;
@@ -554,8 +554,8 @@ void DepsgraphNodeBuilder::build_splineik_pose(Object *ob, bPoseChannel *pchan,
/* 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, pchan->name,
- DEPSOP_TYPE_SIM, bind(BKE_pose_splineik_evaluate, _1, ob, rootchan),
+ add_operation_node(&ob->id, DEPSNODE_TYPE_EVAL_POSE, rootchan->name,
+ DEPSOP_TYPE_SIM, bind(BKE_pose_splineik_evaluate, _1, scene, ob, rootchan),
deg_op_name_spline_ik_solver);
// XXX: what sort of ID-data is needed?
}
@@ -635,7 +635,7 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob)
break;
case CONSTRAINT_TYPE_SPLINEIK:
- build_splineik_pose(ob, pchan, con);
+ build_splineik_pose(scene, ob, pchan, con);
break;
default:
diff --git a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
index d00a48a..92f8f1d 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
@@ -736,6 +736,23 @@ static bPoseChannel* ik_solver_rootchan_find(bPoseChannel *pchan,
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;
+}
+
/* IK Solver Eval Steps */
void DepsgraphRelationBuilder::build_ik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con)
{
@@ -801,22 +818,31 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob, bPoseChannel *pchan, bC
void DepsgraphRelationBuilder::build_splineik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con)
{
bSplineIKConstraint *data = (bSplineIKConstraint *)con->data;
-
- ComponentKey bone_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name);
- OperationKey solver_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE, pchan->name, deg_op_name_spline_ik_solver);
+ bPoseChannel *rootchan = splineik_solver_rootchan_find(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);
/* attach owner to IK Solver too
* - assume that owner is always part of chain
* - see notes on direction of rel below...
*/
- add_relation(bone_key, solver_key, DEPSREL_TYPE_TRANSFORM, "Spline IK Solver Owner");
+ add_relation(transforms_key, solver_key, DEPSREL_TYPE_TRANSFORM, "Spline IK Solver Owner");
/* attach path dependency to solver */
if (data->tar) {
- ComponentKey curve_path_key(&data->tar->id, DEPSNODE_TYPE_GEOMETRY);
- add_relation(curve_path_key, solver_key, DEPSREL_TYPE_GEOMETRY_EVAL, "[Curve.Path -> Spline IK] DepsRel");
+ /* TODO(sergey): For until we'll store partial matricies in the depsgraph,
+ * we create dependency bewteen target object and pose eval component.
+ * See IK pose for a bit more information.
+ */
+ ComponentKey target_key(&data->tar->id, DEPSNODE_TYPE_GEOMETRY);
+ ComponentKey pose_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE);
+ add_relation(target_key, pose_key, DEPSREL_TYPE_TRANSFORM,"[Curve.Path -> Spline IK] DepsRel");
}
-
+
+ pchan->flag |= POSE_DONE;
+ OperationKey final_transforms_key(&ob->id, DEPSNODE_TYPE_BONE, pchan->name, "Bone Final Transforms");
+ add_relation(solver_key, final_transforms_key, DEPSREL_TYPE_TRANSFORM, "IK Solver Result");
+
/* Walk to the chain's root */
size_t segcount = 0;
for (bPoseChannel *parchan = pchan->parent; parchan; parchan = parchan->parent) {
@@ -826,9 +852,15 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *ob, bPoseChannel *pch
* bone will ensure that users of this bone only
* grab the result with IK solver results...
*/
- ComponentKey parent_key(&ob->id, DEPSNODE_TYPE_BONE, parchan->name);
- add_relation(parent_key, solver_key, DEPSREL_TYPE_TRANSFORM, "Spline IK Solver Update");
-
+ if (parchan != pchan) {
+ OperationKey parent_key = bone_transforms_key(ob, parchan);
+ add_relation(parent_key, solver_key, DEPSREL_TYPE_TRANSFORM, "Spline IK Solver Update");
+ }
+ parchan->flag |= POSE_DONE;
+
+ OperationKey final_transforms_key(&ob->id, DEPSNODE_TYPE_BONE, parchan->name, "Bone Final Transforms");
+ add_relation(solver_key, final_transforms_key, DEPSREL_TYPE_TRANSFORM, "IK Solver Result");
+
/* continue up chain, until we reach target number of items... */
segcount++;
if ((segcount == data->chainlen) || (segcount > 255)) break; /* 255 is weak */
diff --git a/source/blender/depsgraph/intern/depsgraph_type_defines.cpp b/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
index 503bdaf..3b64ce6 100644
--- a/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
@@ -98,8 +98,6 @@ void BKE_animsys_eval_driver(EvaluationContext *eval_ctx, ID *id, FCurve *fcurve
}
}
-void BKE_pose_splineik_evaluate(EvaluationContext *eval_ctx, Object *ob, bPoseChannel *rootchan) {}
-
void BKE_pose_rebuild_op(EvaluationContext *eval_ctx, Object *ob, bPose *pose)
{
bArmature *arm = (bArmature *)ob->data;
@@ -194,6 +192,16 @@ void BKE_pose_iktree_evaluate(EvaluationContext *eval_ctx,
BIK_execute_tree(scene, ob, rootchan, ctime);
}
+void BKE_pose_splineik_evaluate(EvaluationContext *eval_ctx,
+ Scene *scene,
+ Object *ob,
+ bPoseChannel *rootchan)
+{
+ printf("%s on %s phan %s\n", __func__, ob->id.name, rootchan->name);
+ float ctime = BKE_scene_frame_get(scene); /* not accurate... */
+ BKE_splineik_execute_tree(scene, ob, rootchan, ctime);
+}
+
void BKE_pose_eval_flush(EvaluationContext *eval_ctx,
Scene *scene,
Object *ob,
diff --git a/source/blender/depsgraph/intern/stubs.h b/source/blender/depsgraph/intern/stubs.h
index a95e236..92a6f5b 100644
--- a/source/blender/depsgraph/intern/stubs.h
+++ b/source/blender/depsgraph/intern/stubs.h
@@ -34,7 +34,7 @@ void BKE_pose_iktree_evaluate(struct EvaluationContext *eval_ctx,
Scene *scene,
Object *ob,
bPoseChannel *rootchan);
-void BKE_pose_splineik_evaluate(struct EvaluationContext *eval_ctx, Object *ob, bPoseChannel *rootchan);
+void BKE_pose_splineik_evaluate(struct EvaluationContext *eval_ctx, Scene *scene, Object *ob, bPoseChannel *rootchan);
void BKE_pose_eval_bone(struct EvaluationContext *eval_ctx,
Scene *scene,
Object *ob,
More information about the Bf-blender-cvs
mailing list