diff options
Diffstat (limited to 'source/blender/blenkernel/intern/armature_update.c')
-rw-r--r-- | source/blender/blenkernel/intern/armature_update.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/armature_update.c b/source/blender/blenkernel/intern/armature_update.c index f7aee3fa2d4..44ffb6a6697 100644 --- a/source/blender/blenkernel/intern/armature_update.c +++ b/source/blender/blenkernel/intern/armature_update.c @@ -51,6 +51,12 @@ #include "BKE_global.h" #include "BKE_main.h" +#ifdef WITH_LEGACY_DEPSGRAPH +# define DEBUG_PRINT if (!DEG_depsgraph_use_legacy() && G.debug & G_DEBUG_DEPSGRAPH) printf +#else +# define DEBUG_PRINT if (G.debug & G_DEBUG_DEPSGRAPH) printf +#endif + /* ********************** SPLINE IK SOLVER ******************* */ /* Temporary evaluation tree data used for Spline IK */ @@ -547,3 +553,143 @@ void BKE_splineik_execute_tree(Scene *scene, Object *ob, bPoseChannel *pchan_roo { splineik_execute_tree(scene, ob, pchan_root, ctime); } + +/* *************** Depsgraph evaluation callbacks ************ */ + +void BKE_pose_eval_init(EvaluationContext *UNUSED(eval_ctx), + Scene *scene, + Object *ob, + bPose *pose) +{ + float ctime = BKE_scene_frame_get(scene); /* not accurate... */ + bPoseChannel *pchan; + + DEBUG_PRINT("%s on %s\n", __func__, ob->id.name); + + BLI_assert(ob->type == OB_ARMATURE); + + /* We demand having proper pose. */ + BLI_assert(ob->pose != NULL); + BLI_assert((ob->pose->flag & POSE_RECALC) == 0); + + /* imat is needed for solvers. */ + invert_m4_m4(ob->imat, ob->obmat); + + /* 1. clear flags */ + for (pchan = pose->chanbase.first; pchan != NULL; pchan = pchan->next) { + pchan->flag &= ~(POSE_DONE | POSE_CHAIN | POSE_IKTREE | POSE_IKSPLINE); + } + + /* 2a. construct the IK tree (standard IK) */ + BIK_initialize_tree(scene, ob, ctime); + + /* 2b. construct the Spline IK trees + * - this is not integrated as an IK plugin, since it should be able + * to function in conjunction with standard IK + */ + BKE_pose_splineik_init_tree(scene, ob, ctime); +} + +void BKE_pose_eval_bone(EvaluationContext *UNUSED(eval_ctx), + Scene *scene, + Object *ob, + bPoseChannel *pchan) +{ + bArmature *arm = (bArmature *)ob->data; + DEBUG_PRINT("%s on %s pchan %s\n", __func__, ob->id.name, pchan->name); + BLI_assert(ob->type == OB_ARMATURE); + if (arm->edbo || (arm->flag & ARM_RESTPOS)) { + Bone *bone = pchan->bone; + if (bone) { + copy_m4_m4(pchan->pose_mat, bone->arm_mat); + copy_v3_v3(pchan->pose_head, bone->arm_head); + copy_v3_v3(pchan->pose_tail, bone->arm_tail); + } + } + else { + /* TODO(sergey): Currently if there are constraints full transform is being + * evaluated in BKE_pose_constraints_evaluate. + */ + if (pchan->constraints.first == NULL) { + if (pchan->flag & POSE_IKTREE || pchan->flag & POSE_IKSPLINE) { + /* pass */ + } + else { + /* TODO(sergey): Use time source node for time. */ + float ctime = BKE_scene_frame_get(scene); /* not accurate... */ + BKE_pose_where_is_bone(scene, ob, pchan, ctime, 1); + } + } + } +} + +void BKE_pose_constraints_evaluate(EvaluationContext *UNUSED(eval_ctx), + Object *ob, + bPoseChannel *pchan) +{ + Scene *scene = (Scene*)G.main->scene.first; + DEBUG_PRINT("%s on %s pchan %s\n", __func__, ob->id.name, pchan->name); + if (pchan->flag & POSE_IKTREE || pchan->flag & POSE_IKSPLINE) { + /* IK are being solved separately/ */ + } + else { + float ctime = BKE_scene_frame_get(scene); /* not accurate... */ + BKE_pose_where_is_bone(scene, ob, pchan, ctime, 1); + } +} + +void BKE_pose_bone_done(EvaluationContext *UNUSED(eval_ctx), + bPoseChannel *pchan) +{ + float imat[4][4]; + DEBUG_PRINT("%s on pchan %s\n", __func__, pchan->name); + if (pchan->bone) { + invert_m4_m4(imat, pchan->bone->arm_mat); + mul_m4_m4m4(pchan->chan_mat, pchan->pose_mat, imat); + } +} + +void BKE_pose_iktree_evaluate(EvaluationContext *UNUSED(eval_ctx), + Scene *scene, + Object *ob, + bPoseChannel *rootchan) +{ + float ctime = BKE_scene_frame_get(scene); /* not accurate... */ + DEBUG_PRINT("%s on %s pchan %s\n", __func__, ob->id.name, rootchan->name); + BIK_execute_tree(scene, ob, rootchan, ctime); +} + +void BKE_pose_splineik_evaluate(EvaluationContext *UNUSED(eval_ctx), + Scene *scene, + Object *ob, + bPoseChannel *rootchan) +{ + float ctime = BKE_scene_frame_get(scene); /* not accurate... */ + DEBUG_PRINT("%s on %s pchan %s\n", __func__, ob->id.name, rootchan->name); + BKE_splineik_execute_tree(scene, ob, rootchan, ctime); +} + +void BKE_pose_eval_flush(EvaluationContext *UNUSED(eval_ctx), + Scene *scene, + Object *ob, + bPose *UNUSED(pose)) +{ + float ctime = BKE_scene_frame_get(scene); /* not accurate... */ + DEBUG_PRINT("%s on %s\n", __func__, ob->id.name); + BLI_assert(ob->type == OB_ARMATURE); + + /* 6. release the IK tree */ + BIK_release_tree(scene, ob, ctime); + + ob->recalc &= ~OB_RECALC_ALL; +} + +void BKE_pose_eval_proxy_copy(EvaluationContext *UNUSED(eval_ctx), Object *ob) +{ + BLI_assert(ob->id.lib != NULL && ob->proxy_from != NULL); + DEBUG_PRINT("%s on %s\n", __func__, ob->id.name); + if (BKE_pose_copy_result(ob->pose, ob->proxy_from->pose) == false) { + printf("Proxy copy error, lib Object: %s proxy Object: %s\n", + ob->id.name + 2, ob->proxy_from->id.name + 2); + } +} |