[Bf-blender-cvs] [6a850f3cc84] blender-v2.83-release: Fix duplicate ID's being created when appending/linking

Campbell Barton noreply at git.blender.org
Fri May 15 09:47:32 CEST 2020


Commit: 6a850f3cc840a574d3b5b5af7b608ae3536f96ec
Author: Campbell Barton
Date:   Fri May 15 16:53:43 2020 +1000
Branches: blender-v2.83-release
https://developer.blender.org/rB6a850f3cc840a574d3b5b5af7b608ae3536f96ec

Fix duplicate ID's being created when appending/linking

This removes grease pencil brush creation/dat-block delete on load,
since this causes duplicate data-blocks.

Add assert to prevent this happening in the future
since the error is isn't obvious.

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

M	source/blender/blenkernel/BKE_main.h
M	source/blender/blenkernel/intern/lib_id.c
M	source/blender/blenkernel/intern/lib_id_delete.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c

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

diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index ed1f67350c3..62f50fb8ff6 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -105,6 +105,12 @@ typedef struct Main {
    */
   char use_memfile_full_barrier;
 
+  /**
+   * When linking, disallow creation of new data-blocks.
+   * Make sure we don't do this by accident, see T76738.
+   */
+  char is_locked_for_linking;
+
   BlendThumbnail *blen_thumb;
 
   struct Library *curlib;
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c
index e976d59ce16..cd10d8b1670 100644
--- a/source/blender/blenkernel/intern/lib_id.c
+++ b/source/blender/blenkernel/intern/lib_id.c
@@ -1018,6 +1018,8 @@ void *BKE_libblock_alloc(Main *bmain, short type, const char *name, const int fl
       id->us = 1;
     }
     if ((flag & LIB_ID_CREATE_NO_MAIN) == 0) {
+      /* Note that 2.8x versioning has tested not to cause conflicts. */
+      BLI_assert(bmain->is_locked_for_linking == false || ELEM(type, ID_WS, ID_GR));
       ListBase *lb = which_libbase(bmain, type);
 
       BKE_main_lock(bmain);
diff --git a/source/blender/blenkernel/intern/lib_id_delete.c b/source/blender/blenkernel/intern/lib_id_delete.c
index 245e4f43452..9b1abf4d76c 100644
--- a/source/blender/blenkernel/intern/lib_id_delete.c
+++ b/source/blender/blenkernel/intern/lib_id_delete.c
@@ -188,6 +188,8 @@ void BKE_id_free_ex(Main *bmain, void *idv, int flag, const bool use_flag_from_i
   const short type = GS(id->name);
 
   if (bmain && (flag & LIB_ID_FREE_NO_DEG_TAG) == 0) {
+    BLI_assert(bmain->is_locked_for_linking == false);
+
     DEG_id_type_tag(bmain, type);
   }
 
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index cb567147224..f60250bf7fd 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -9909,6 +9909,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
 {
   /* WATCH IT!!!: pointers from libdata have not been converted */
 
+  /* Don't allow versioning to create new data-blocks. */
+  main->is_locked_for_linking = true;
+
   if (G.debug & G_DEBUG) {
     char build_commit_datetime[32];
     time_t temp_time = main->build_commit_timestamp;
@@ -9939,6 +9942,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
   /* WATCH IT 2!: Userdef struct init see do_versions_userdef() above! */
 
   /* don't forget to set version number in BKE_blender_version.h! */
+
+  main->is_locked_for_linking = false;
 }
 
 static void do_versions_after_linking(Main *main, ReportList *reports)
@@ -9946,11 +9951,16 @@ static void do_versions_after_linking(Main *main, ReportList *reports)
   //  printf("%s for %s (%s), %d.%d\n", __func__, main->curlib ? main->curlib->name : main->name,
   //         main->curlib ? "LIB" : "MAIN", main->versionfile, main->subversionfile);
 
+  /* Don't allow versioning to create new data-blocks. */
+  main->is_locked_for_linking = true;
+
   do_versions_after_linking_250(main);
   do_versions_after_linking_260(main);
   do_versions_after_linking_270(main);
   do_versions_after_linking_280(main, reports);
   do_versions_after_linking_cycles(main);
+
+  main->is_locked_for_linking = false;
 }
 
 /** \} */
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index df6d1ee3c46..2c4cc544e2a 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -159,6 +159,8 @@ static bScreen *screen_parent_find(const bScreen *screen)
 
 static void do_version_workspaces_create_from_screens(Main *bmain)
 {
+  bmain->is_locked_for_linking = false;
+
   for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
     const bScreen *screen_parent = screen_parent_find(screen);
     WorkSpace *workspace;
@@ -180,6 +182,8 @@ static void do_version_workspaces_create_from_screens(Main *bmain)
     }
     BKE_workspace_layout_add(bmain, workspace, screen, screen->id.name + 2);
   }
+
+  bmain->is_locked_for_linking = true;
 }
 
 static void do_version_area_change_space_to_space_action(ScrArea *area, const Scene *scene)
@@ -1694,21 +1698,11 @@ void do_versions_after_linking_280(Main *bmain, ReportList *UNUSED(reports))
       rename_id_for_versioning(bmain, ID_MA, "Black Dots", "Dots Stroke");
     }
 
-    /* Remove useless Fill Area.001 brush. */
-    brush = BLI_findstring(&bmain->brushes, "Fill Area.001", offsetof(ID, name) + 2);
-    if (brush) {
-      BKE_id_delete(bmain, brush);
-    }
-
     brush = BLI_findstring(&bmain->brushes, "Pencil", offsetof(ID, name) + 2);
 
     for (Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
       ToolSettings *ts = scene->toolsettings;
 
-      BKE_brush_gpencil_vertex_presets(bmain, ts);
-      BKE_brush_gpencil_sculpt_presets(bmain, ts);
-      BKE_brush_gpencil_weight_presets(bmain, ts);
-
       /* Ensure new Paint modes. */
       BKE_paint_ensure_from_paintmode(scene, PAINT_MODE_GPENCIL);
       BKE_paint_ensure_from_paintmode(scene, PAINT_MODE_VERTEX_GPENCIL);
@@ -1722,8 +1716,6 @@ void do_versions_after_linking_280(Main *bmain, ReportList *UNUSED(reports))
         /* Enable cursor by default. */
         paint->flags |= PAINT_SHOW_BRUSH;
       }
-      /* Ensure Palette by default. */
-      BKE_gpencil_palette_ensure(bmain, scene);
     }
   }
 
@@ -1737,11 +1729,6 @@ void do_versions_after_linking_280(Main *bmain, ReportList *UNUSED(reports))
 
     /* Reset all grease pencil brushes. */
     LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
-      BKE_brush_gpencil_paint_presets(bmain, scene->toolsettings);
-      BKE_brush_gpencil_sculpt_presets(bmain, scene->toolsettings);
-      BKE_brush_gpencil_weight_presets(bmain, scene->toolsettings);
-      BKE_brush_gpencil_vertex_presets(bmain, scene->toolsettings);
-
       /* Ensure new Paint modes. */
       BKE_paint_ensure_from_paintmode(scene, PAINT_MODE_VERTEX_GPENCIL);
       BKE_paint_ensure_from_paintmode(scene, PAINT_MODE_SCULPT_GPENCIL);



More information about the Bf-blender-cvs mailing list