Pose: Add a 'pose_ensure' new utils that only rebuilds if needed.

Avoids having to spread the check logic everywhere in the code.
This commit is contained in:
Bastien Montagne 2020-10-22 15:14:28 +02:00
parent cf6c076046
commit fff08e81ea
2 changed files with 21 additions and 5 deletions

View File

@ -180,6 +180,10 @@ void BKE_pose_rebuild(struct Main *bmain,
struct Object *ob,
struct bArmature *arm,
const bool do_id_user);
void BKE_pose_ensure(struct Main *bmain,
struct Object *ob,
struct bArmature *arm,
const bool do_id_user);
void BKE_pose_where_is(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob);
void BKE_pose_where_is_bone(struct Depsgraph *depsgraph,
struct Scene *scene,

View File

@ -2573,6 +2573,20 @@ void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, const bool do_id_
}
}
/**
* Ensures object's pose is rebuilt if needed.
*
* \param bmain: May be NULL, only used to tag depsgraph as being dirty...
*/
void BKE_pose_ensure(Main *bmain, Object *ob, bArmature *arm, const bool do_id_user)
{
BLI_assert(!ELEM(NULL, arm, ob));
if (ob->type == OB_ARMATURE && ((ob->pose == NULL) || (ob->pose->flag & POSE_RECALC))) {
BLI_assert(GS(arm->id.name) == ID_AR);
BKE_pose_rebuild(bmain, ob, arm, do_id_user);
}
}
/** \} */
/* -------------------------------------------------------------------- */
@ -2711,11 +2725,9 @@ void BKE_pose_where_is(struct Depsgraph *depsgraph, Scene *scene, Object *ob)
if (ELEM(NULL, arm, scene)) {
return;
}
if ((ob->pose == NULL) || (ob->pose->flag & POSE_RECALC)) {
/* WARNING! passing NULL bmain here means we won't tag depsgraph's as dirty -
* hopefully this is OK. */
BKE_pose_rebuild(NULL, ob, arm, true);
}
/* WARNING! passing NULL bmain here means we won't tag depsgraph's as dirty -
* hopefully this is OK. */
BKE_pose_ensure(NULL, ob, arm, true);
ctime = BKE_scene_frame_get(scene); /* not accurate... */