Depsgraph: fix hard CTD on dependency cycles through POSE_INIT.
As reported in T63582, it can cause chan_array to be not ready. To reliably avoid crashing, the only easy way seems to be to create the index during COW -- maybe @sergey has a better idea.
This commit is contained in:
parent
f5ea1fc4fb
commit
3731729b96
|
@ -245,6 +245,8 @@ void BKE_splineik_execute_tree(
|
|||
struct Depsgraph *depsgraph, struct Scene *scene,
|
||||
struct Object *ob, struct bPoseChannel *pchan_root, float ctime);
|
||||
|
||||
void BKE_pose_pchan_index_rebuild(struct bPose *pose);
|
||||
|
||||
void BKE_pose_eval_init(
|
||||
struct Depsgraph *depsgraph,
|
||||
struct Scene *scene,
|
||||
|
|
|
@ -825,6 +825,8 @@ void BKE_pose_channels_free_ex(bPose *pose, bool do_id_user)
|
|||
}
|
||||
|
||||
BKE_pose_channels_hash_free(pose);
|
||||
|
||||
MEM_SAFE_FREE(pose->chan_array);
|
||||
}
|
||||
|
||||
void BKE_pose_channels_free(bPose *pose)
|
||||
|
|
|
@ -556,8 +556,9 @@ void BKE_splineik_execute_tree(
|
|||
|
||||
/* *************** Depsgraph evaluation callbacks ************ */
|
||||
|
||||
static void pose_pchan_index_create(bPose *pose)
|
||||
void BKE_pose_pchan_index_rebuild(bPose *pose)
|
||||
{
|
||||
MEM_SAFE_FREE(pose->chan_array);
|
||||
const int num_channels = BLI_listbase_count(&pose->chanbase);
|
||||
pose->chan_array = MEM_malloc_arrayN(
|
||||
num_channels, sizeof(bPoseChannel *), "pose->chan_array");
|
||||
|
@ -605,7 +606,8 @@ void BKE_pose_eval_init(struct Depsgraph *depsgraph,
|
|||
}
|
||||
}
|
||||
|
||||
pose_pchan_index_create(pose);
|
||||
BLI_assert(pose->chan_array != NULL || BLI_listbase_is_empty(&pose->chanbase));
|
||||
|
||||
BKE_armature_cached_bbone_deformation_free_data(object);
|
||||
}
|
||||
|
||||
|
@ -806,7 +808,6 @@ static void pose_eval_cleanup_common(Object *object)
|
|||
bPose *pose = object->pose;
|
||||
BLI_assert(pose != NULL);
|
||||
BLI_assert(pose->chan_array != NULL || BLI_listbase_is_empty(&pose->chanbase));
|
||||
MEM_SAFE_FREE(pose->chan_array);
|
||||
}
|
||||
|
||||
void BKE_pose_eval_done(struct Depsgraph *depsgraph, Object *object)
|
||||
|
@ -839,7 +840,8 @@ void BKE_pose_eval_proxy_init(struct Depsgraph *depsgraph, Object *object)
|
|||
BLI_assert(ID_IS_LINKED(object) && object->proxy_from != NULL);
|
||||
DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
|
||||
|
||||
pose_pchan_index_create(object->pose);
|
||||
BLI_assert(pose->chan_array != NULL || BLI_listbase_is_empty(&pose->chanbase));
|
||||
|
||||
BKE_armature_cached_bbone_deformation_free_data(object);
|
||||
}
|
||||
|
||||
|
|
|
@ -697,6 +697,7 @@ void update_id_after_copy(const Depsgraph *depsgraph,
|
|||
update_pose_orig_pointers(object_orig->pose,
|
||||
object_cow->pose);
|
||||
}
|
||||
BKE_pose_pchan_index_rebuild(object_cow->pose);
|
||||
}
|
||||
update_particles_after_copy(object_orig, object_cow);
|
||||
update_modifiers_orig_pointers(object_orig, object_cow);
|
||||
|
|
Loading…
Reference in New Issue