Commit: ceb0e7fceae52d317833ed05e6ee0b2852ad170d
Author: Bastien Montagne
Date:   Wed Oct 19 16:47:57 2022 +0200
Branches: master
https://developer.blender.org/rBceb0e7fceae52d317833ed05e6ee0b2852ad170d

Fix (devs-reported) mistake in batch delete code in recent change.

Mistake in own rB358155a8da60, change ended up discarding the case where
we need to also delete IDs using a tagged-to-be-deleted ID in a 'never
NULL' way. Typical example: Whene deleting a Mesh ID, one also needs to
delete all the Objects using that mesh, since obdata pointer is of type
'never NULL'.

Note that luckily, this fix does not affect the performance improvements
from rB358155a8da60.

Noted by Brecht and Clement because of failing unittests, shame on me.

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

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

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

diff --git a/source/blender/blenkernel/intern/lib_id_delete.c 
b/source/blender/blenkernel/intern/lib_id_delete.c
index ae5dc75c36a..1a80376f482 100644
--- a/source/blender/blenkernel/intern/lib_id_delete.c
+++ b/source/blender/blenkernel/intern/lib_id_delete.c
@@ -218,6 +218,7 @@ static size_t id_delete(Main *bmain, const bool 
do_tagged_deletion)
   BKE_main_lock(bmain);
   if (do_tagged_deletion) {
     struct IDRemapper *id_remapper = BKE_id_remapper_create();
+    BKE_layer_collection_resync_forbid();
 
     /* Main idea of batch deletion is to remove all IDs to be deleted from 
Main database.
      * This means that we won't have to loop over all deleted IDs to remove 
usages
@@ -253,22 +254,20 @@ static size_t id_delete(Main *bmain, const bool 
do_tagged_deletion)
           }
         }
       }
-    }
-
-    BKE_layer_collection_resync_forbid();
 
-    /* Will tag 'never NULL' users of this ID too.
-     *
-     * NOTE: #BKE_libblock_unlink() cannot be used here, since it would ignore 
indirect
-     * links, this can lead to nasty crashing here in second, actual deleting 
loop.
-     * Also, this will also flag users of deleted data that cannot be unlinked
-     * (object using deleted obdata, etc.), so that they also get deleted. */
-    BKE_libblock_remap_multiple_locked(bmain,
-                                       id_remapper,
-                                       ID_REMAP_FLAG_NEVER_NULL_USAGE |
-                                           ID_REMAP_FORCE_NEVER_NULL_USAGE |
-                                           
ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS);
-    BKE_id_remapper_clear(id_remapper);
+      /* Will tag 'never NULL' users of this ID too.
+       *
+       * NOTE: #BKE_libblock_unlink() cannot be used here, since it would 
ignore indirect
+       * links, this can lead to nasty crashing here in second, actual 
deleting loop.
+       * Also, this will also flag users of deleted data that cannot be 
unlinked
+       * (object using deleted obdata, etc.), so that they also get deleted. */
+      BKE_libblock_remap_multiple_locked(bmain,
+                                         id_remapper,
+                                         ID_REMAP_FLAG_NEVER_NULL_USAGE |
+                                             ID_REMAP_FORCE_NEVER_NULL_USAGE |
+                                             
ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS);
+      BKE_id_remapper_clear(id_remapper);
+    }
 
     /* Since we removed IDs from Main, their own other IDs usages need to be 
removed 'manually'. */
     LinkNode *cleanup_ids = NULL;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to