[Bf-blender-cvs] [05b4d8d13a9] blender-v2.83-release: Fix (studio-reported) Armature: bug in handling of custom bone transform.

Bastien Montagne noreply at git.blender.org
Wed Oct 28 09:55:51 CET 2020


Commit: 05b4d8d13a9ca3691c7aa8f2ceebd8155bd31fa7
Author: Bastien Montagne
Date:   Wed Oct 21 15:51:15 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB05b4d8d13a9ca3691c7aa8f2ceebd8155bd31fa7

Fix (studio-reported) Armature: bug in handling of custom bone transform.

This specific pose channel pointer was not handled at all during
rebuilding of poses, meaning that it could end up pointing at some freed
pchan.

===================================================================

M	source/blender/blenkernel/intern/armature.c

===================================================================

diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 04051edd334..27c16d6f1c0 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -2782,6 +2782,13 @@ void BKE_pose_rebuild(Main *bmain, Object *ob, bArmature *arm, const bool do_id_
   for (pchan = pose->chanbase.first; pchan; pchan = pchan->next) {
     /* Find the custom B-Bone handles. */
     BKE_pchan_rebuild_bbone_handles(pose, pchan);
+    /* Re-validate that we are still using a valid pchan form custom transform. */
+    /* Note that we could store pointers of freed pchan in a GSet to speed this up, however this is
+     * supposed to be a rarely used feature, so for now assuming that always building that GSet
+     * would be less optimal. */
+    if (pchan->custom_tx != NULL && BLI_findindex(&pose->chanbase, pchan->custom_tx) == -1) {
+      pchan->custom_tx = NULL;
+    }
   }
 
   /* printf("rebuild pose %s, %d bones\n", ob->id.name, counter); */



More information about the Bf-blender-cvs mailing list