Fix T52835: When driven IK influence change, ik animation have 1 frame delay
This commit is contained in:
parent
ce54d25fa9
commit
675cef0a16
Notes:
blender-bot
2023-02-14 07:25:46 +01:00
Referenced by issue #53683, 2.79a release Referenced by issue #52835, When driven IK influence change, ik animation have 1 frame delay
|
@ -172,6 +172,11 @@ void BKE_pose_eval_init(struct EvaluationContext *eval_ctx,
|
|||
struct Object *ob,
|
||||
struct bPose *pose);
|
||||
|
||||
void BKE_pose_eval_init_ik(struct EvaluationContext *eval_ctx,
|
||||
struct Scene *scene,
|
||||
struct Object *ob,
|
||||
struct bPose *pose);
|
||||
|
||||
void BKE_pose_eval_bone(struct EvaluationContext *eval_ctx,
|
||||
struct Scene *scene,
|
||||
struct Object *ob,
|
||||
|
|
|
@ -559,11 +559,10 @@ void BKE_splineik_execute_tree(Scene *scene, Object *ob, bPoseChannel *pchan_roo
|
|||
/* *************** Depsgraph evaluation callbacks ************ */
|
||||
|
||||
void BKE_pose_eval_init(EvaluationContext *UNUSED(eval_ctx),
|
||||
Scene *scene,
|
||||
Scene *UNUSED(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);
|
||||
|
@ -581,6 +580,16 @@ void BKE_pose_eval_init(EvaluationContext *UNUSED(eval_ctx),
|
|||
for (pchan = pose->chanbase.first; pchan != NULL; pchan = pchan->next) {
|
||||
pchan->flag &= ~(POSE_DONE | POSE_CHAIN | POSE_IKTREE | POSE_IKSPLINE);
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_pose_eval_init_ik(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);
|
||||
|
||||
/* 2a. construct the IK tree (standard IK) */
|
||||
BIK_initialize_tree(scene, ob, ctime);
|
||||
|
|
|
@ -180,6 +180,11 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob)
|
|||
DEG_OPCODE_POSE_INIT);
|
||||
op_node->set_as_entry();
|
||||
|
||||
op_node = add_operation_node(&ob->id,
|
||||
DEG_NODE_TYPE_EVAL_POSE,
|
||||
function_bind(BKE_pose_eval_init_ik, _1, scene, ob, ob->pose),
|
||||
DEG_OPCODE_POSE_INIT_IK);
|
||||
|
||||
op_node = add_operation_node(&ob->id,
|
||||
DEG_NODE_TYPE_EVAL_POSE,
|
||||
function_bind(BKE_pose_eval_flush, _1, scene, ob, ob->pose),
|
||||
|
|
|
@ -83,7 +83,15 @@ void DepsgraphRelationBuilder::build_ik_pose(Object *ob,
|
|||
* - see notes on direction of rel below...
|
||||
*/
|
||||
bPoseChannel *rootchan = BKE_armature_ik_solver_find_root(pchan, data);
|
||||
OperationKey solver_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name, DEG_OPCODE_POSE_IK_SOLVER);
|
||||
OperationKey pchan_local_key(&ob->id, DEG_NODE_TYPE_BONE,
|
||||
pchan->name, DEG_OPCODE_BONE_LOCAL);
|
||||
OperationKey init_ik_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT_IK);
|
||||
OperationKey solver_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE,
|
||||
rootchan->name,
|
||||
DEG_OPCODE_POSE_IK_SOLVER);
|
||||
|
||||
add_relation(pchan_local_key, init_ik_key, "IK Constraint -> Init IK Tree");
|
||||
add_relation(init_ik_key, solver_key, "Init IK -> IK Solver");
|
||||
|
||||
/* IK target */
|
||||
// XXX: this should get handled as part of the constraint code
|
||||
|
@ -300,9 +308,11 @@ void DepsgraphRelationBuilder::build_rig(Scene *scene, Object *ob)
|
|||
|
||||
/* attach links between pose operations */
|
||||
OperationKey init_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT);
|
||||
OperationKey init_ik_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_INIT_IK);
|
||||
OperationKey flush_key(&ob->id, DEG_NODE_TYPE_EVAL_POSE, DEG_OPCODE_POSE_DONE);
|
||||
|
||||
add_relation(init_key, flush_key, "[Pose Init -> Pose Cleanup]");
|
||||
add_relation(init_key, init_ik_key, "Pose Init -> Pose Init IK");
|
||||
add_relation(init_ik_key, flush_key, "Pose Init IK -> Pose Cleanup");
|
||||
|
||||
/* Make sure pose is up-to-date with armature updates. */
|
||||
OperationKey armature_key(&arm->id,
|
||||
|
|
|
@ -109,6 +109,7 @@ static const char *stringify_opcode(eDepsOperation_Code opcode)
|
|||
STRINGIFY_OPCODE(OBJECT_UBEREVAL);
|
||||
STRINGIFY_OPCODE(GEOMETRY_UBEREVAL);
|
||||
STRINGIFY_OPCODE(POSE_INIT);
|
||||
STRINGIFY_OPCODE(POSE_INIT_IK);
|
||||
STRINGIFY_OPCODE(POSE_DONE);
|
||||
STRINGIFY_OPCODE(POSE_IK_SOLVER);
|
||||
STRINGIFY_OPCODE(POSE_SPLINE_IK_SOLVER);
|
||||
|
|
|
@ -178,9 +178,12 @@ typedef enum eDepsOperation_Code {
|
|||
|
||||
/* Pose -------------------------------------------- */
|
||||
|
||||
/* Init IK Trees, etc. */
|
||||
/* Init pose, clear flags, etc. */
|
||||
DEG_OPCODE_POSE_INIT,
|
||||
|
||||
/* Initialize IK solver related pose stuff. */
|
||||
DEG_OPCODE_POSE_INIT_IK,
|
||||
|
||||
/* Free IK Trees + Compute Deform Matrices */
|
||||
DEG_OPCODE_POSE_DONE,
|
||||
|
||||
|
|
Loading…
Reference in New Issue