[Bf-blender-cvs] [df8a63bb9c0] blender-v2.90-release: Fix T80078: Overrides: Crash with animated IK control on linked armature.

Bastien Montagne noreply at git.blender.org
Fri Aug 28 15:08:51 CEST 2020


Commit: df8a63bb9c0a7090562e3f33c5da80d5dafa386d
Author: Bastien Montagne
Date:   Thu Aug 27 16:50:01 2020 +0200
Branches: blender-v2.90-release
https://developer.blender.org/rBdf8a63bb9c0a7090562e3f33c5da80d5dafa386d

Fix T80078: Overrides: Crash with animated IK control on linked armature.

Issue was with our dear posebones again... when applying overrides we
keep the same address/pointer for the IDs themselves, (which avoids us
the need to remap their usages), but their inner data is often
re-allocated.

Therefore, we need once again to go over armature objects and invalidate
their posebone pointers.

This should also be back-ported to Blender LTS 2.83.

Maniphest Tasks: T80078

Differential Revision: https://developer.blender.org/D8734

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

M	source/blender/blenkernel/intern/lib_override.c
M	source/blender/blenkernel/intern/lib_remap.c

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

diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index 6929d3a3c4b..6475535a22e 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -1475,6 +1475,20 @@ void BKE_lib_override_library_update(Main *bmain, ID *local)
   /* XXX And crashing in complex cases (e.g. because depsgraph uses same data...). */
   BKE_id_free_ex(bmain, tmp_id, LIB_ID_FREE_NO_UI_USER, true);
 
+  if (GS(local->name) == ID_AR) {
+    /* Funtime again, thanks to bone pointers in pose data of objects. We keep same ID addresses,
+     * but internal data has changed for sure, so we need to invalidate posebones caches. */
+    LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
+      if (ob->pose != NULL && ob->data == local) {
+        BLI_assert(ob->type == OB_ARMATURE);
+        ob->pose->flag |= POSE_RECALC;
+        /* We need to clear pose bone pointers immediately, some code may access those before pose
+         * is actually recomputed, which can lead to segfault. */
+        BKE_pose_clear_pointers(ob->pose);
+      }
+    }
+  }
+
   if (local->override_library->storage) {
     /* We know this datablock is not used anywhere besides local->override->storage. */
     /* XXX For until we get fully shadow copies, we still need to ensure storage releases
diff --git a/source/blender/blenkernel/intern/lib_remap.c b/source/blender/blenkernel/intern/lib_remap.c
index d4246056efe..c88513ec2af 100644
--- a/source/blender/blenkernel/intern/lib_remap.c
+++ b/source/blender/blenkernel/intern/lib_remap.c
@@ -244,17 +244,17 @@ static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data)
       ID *old_id = r_id_remap_data->old_id;
       if (!old_id || GS(old_id->name) == ID_AR) {
         Object *ob = (Object *)r_id_remap_data->id_owner;
-        /* Object's pose holds reference to armature bones... sic */
-        /* Note that in theory, we should have to bother about
-         * linked/non-linked/never-null/etc. flags/states.
+        /* Object's pose holds reference to armature bones. sic */
+        /* Note that in theory, we should have to bother about linked/non-linked/never-null/etc.
+         * flags/states.
          * Fortunately, this is just a tag, so we can accept to 'over-tag' a bit for pose recalc,
          * and avoid another complex and risky condition nightmare like the one we have in
-         * foreach_libblock_remap_callback()... */
+         * foreach_libblock_remap_callback(). */
         if (ob->pose && (!old_id || ob->data == old_id)) {
           BLI_assert(ob->type == OB_ARMATURE);
           ob->pose->flag |= POSE_RECALC;
-          /* We need to clear pose bone pointers immediately, things like undo writefile may be
-           * called before pose is actually recomputed, can lead to segfault... */
+          /* We need to clear pose bone pointers immediately, some code may access those before
+           * pose is actually recomputed, which can lead to segfault. */
           BKE_pose_clear_pointers(ob->pose);
         }
       }



More information about the Bf-blender-cvs mailing list