Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / library.c
index 64c888943f48eea9757f87e2af0279939c0d1886..93ac50a932407bccbac3aaff842f8869edaf8299 100644 (file)
@@ -1947,7 +1947,7 @@ void BKE_library_make_local(
 
        /* Note: Keeping both version of the code (old one being safer, since it still has checks against unused IDs)
         * for now, we can remove old one once it has been tested for some time in master... */
 
        /* Note: Keeping both version of the code (old one being safer, since it still has checks against unused IDs)
         * for now, we can remove old one once it has been tested for some time in master... */
-#if 1
+#if 0
        /* Step 5: proxy 'remapping' hack. */
        for (LinkNode *it = copied_ids; it; it = it->next) {
                /* Attempt to re-link copied proxy objects. This allows appending of an entire scene
        /* Step 5: proxy 'remapping' hack. */
        for (LinkNode *it = copied_ids; it; it = it->next) {
                /* Attempt to re-link copied proxy objects. This allows appending of an entire scene
@@ -2117,9 +2117,26 @@ void BKE_library_make_local(
 
 #ifdef DEBUG_TIME
        printf("Step 6: Try to find circle dependencies between indirectly-linked-only datablocks: Done.\n");
 
 #ifdef DEBUG_TIME
        printf("Step 6: Try to find circle dependencies between indirectly-linked-only datablocks: Done.\n");
-       TIMEIT_END(make_local);
+       TIMEIT_VALUE_PRINT(make_local);
+#endif
+
 #endif
 
 #endif
 
+       /* This is probably more of a hack than something we should do here, but...
+        * Issue is, the whole copying + remapping done in complex cases above may leave pose channels of armatures
+        * in complete invalid state (more precisely, the bone pointers of the pchans - very crappy cross-datablocks
+        * relationship), se we tag it to be fully recomputed, but this does not seems to be enough in some cases,
+        * and evaluation code ends up trying to evaluate a not-yet-updated armature object's deformations.
+        * Try "make all local" in 04_01_H.lighting.blend from Agent327 without this, e.g. */
+       for (Object *ob = bmain->object.first; ob; ob = ob->id.next) {
+               if (ob->data != NULL && ob->type == OB_ARMATURE && ob->pose != NULL && ob->pose->flag & POSE_RECALC) {
+                       BKE_pose_rebuild(ob, ob->data);
+               }
+       }
+
+#ifdef DEBUG_TIME
+       printf("Hack: Forcefully rebuild armature object poses: Done.\n");
+       TIMEIT_VALUE_PRINT(make_local);
 #endif
 
        BKE_main_id_clear_newpoins(bmain);
 #endif
 
        BKE_main_id_clear_newpoins(bmain);