From 7ec6bca92fd0ee4a3b1dcdf90fdba1f9d0aec11a Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Thu, 18 Apr 2019 21:19:57 +0300 Subject: Fix T63332: backup and restore bPoseChannel_Runtime data during COW. --- source/blender/blenkernel/intern/action.c | 20 +++++++++++++++----- source/blender/blenkernel/intern/armature.c | 6 ++---- source/blender/blenkernel/intern/armature_update.c | 4 ++-- 3 files changed, 19 insertions(+), 11 deletions(-) (limited to 'source/blender/blenkernel/intern') diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index a3b7df6b020..885ddc5b9c2 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -793,15 +793,25 @@ void BKE_pose_channel_free_ex(bPoseChannel *pchan, bool do_id_user) /* Cached data, for new draw manager rendering code. */ MEM_SAFE_FREE(pchan->draw_data); - /* Cached B-Bone shape data. */ - BKE_pose_channel_free_bbone_cache(pchan); + /* Cached B-Bone shape and other data. */ + BKE_pose_channel_runtime_free(&pchan->runtime); } -/** Deallocates runtime cache of a pose channel's B-Bone shape. */ -void BKE_pose_channel_free_bbone_cache(bPoseChannel *pchan) +/** Clears the runtime cache of a pose channel without free. */ +void BKE_pose_channel_runtime_reset(bPoseChannel_Runtime *runtime) { - bPoseChannel_Runtime *runtime = &pchan->runtime; + memset(runtime, 0, sizeof(*runtime)); +} +/** Deallocates runtime cache of a pose channel */ +void BKE_pose_channel_runtime_free(bPoseChannel_Runtime *runtime) +{ + BKE_pose_channel_free_bbone_cache(runtime); +} + +/** Deallocates runtime cache of a pose channel's B-Bone shape. */ +void BKE_pose_channel_free_bbone_cache(bPoseChannel_Runtime *runtime) +{ runtime->bbone_segments = 0; MEM_SAFE_FREE(runtime->bbone_rest_mats); MEM_SAFE_FREE(runtime->bbone_pose_mats); diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 69721651a45..91c760223aa 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -948,9 +948,7 @@ static void allocate_bbone_cache(bPoseChannel *pchan, int segments) bPoseChannel_Runtime *runtime = &pchan->runtime; if (runtime->bbone_segments != segments) { - if (runtime->bbone_segments != 0) { - BKE_pose_channel_free_bbone_cache(pchan); - } + BKE_pose_channel_free_bbone_cache(runtime); runtime->bbone_segments = segments; runtime->bbone_rest_mats = MEM_malloc_arrayN( @@ -1020,7 +1018,7 @@ void BKE_pchan_bbone_segments_cache_copy(bPoseChannel *pchan, bPoseChannel *pcha int segments = runtime_from->bbone_segments; if (segments <= 1) { - BKE_pose_channel_free_bbone_cache(pchan); + BKE_pose_channel_free_bbone_cache(&pchan->runtime); } else { allocate_bbone_cache(pchan, segments); diff --git a/source/blender/blenkernel/intern/armature_update.c b/source/blender/blenkernel/intern/armature_update.c index e6e9b561e78..bf33b1c7c50 100644 --- a/source/blender/blenkernel/intern/armature_update.c +++ b/source/blender/blenkernel/intern/armature_update.c @@ -613,7 +613,7 @@ void BKE_pose_eval_init(struct Depsgraph *depsgraph, Scene *UNUSED(scene), Objec /* Free B-Bone shape data cache if it's not a B-Bone. */ if (pchan->bone == NULL || pchan->bone->segments <= 1) { - BKE_pose_channel_free_bbone_cache(pchan); + BKE_pose_channel_free_bbone_cache(&pchan->runtime); } } @@ -723,7 +723,7 @@ void BKE_pose_bone_done(struct Depsgraph *depsgraph, struct Object *object, int copy_m4_m4(pchan_orig->constinv, pchan->constinv); BKE_pose_where_is_bone_tail(pchan_orig); if (pchan->bone == NULL || pchan->bone->segments <= 1) { - BKE_pose_channel_free_bbone_cache(pchan_orig); + BKE_pose_channel_free_bbone_cache(&pchan_orig->runtime); } } } -- cgit v1.2.3