[Bf-blender-cvs] [37eb7fa46c6] temp-T94185-id_remapping-experiment-a: Small fixes to crashes.

Jeroen Bakker noreply at git.blender.org
Mon Dec 20 15:53:42 CET 2021


Commit: 37eb7fa46c689e36901b942c5eb3a0b2680b1373
Author: Jeroen Bakker
Date:   Mon Dec 20 14:06:05 2021 +0100
Branches: temp-T94185-id_remapping-experiment-a
https://developer.blender.org/rB37eb7fa46c689e36901b942c5eb3a0b2680b1373

Small fixes to crashes.

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

M	source/blender/editors/space_action/space_action.c
M	source/blender/editors/space_file/space_file.c
M	source/blender/editors/space_outliner/space_outliner.c
M	source/blender/editors/space_sequencer/space_sequencer.c
M	source/blender/editors/space_view3d/space_view3d.c

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

diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index 96bf25c3ba3..ba96ac52f1f 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -821,8 +821,8 @@ static void action_id_remap(ScrArea *UNUSED(area),
 {
   SpaceAction *sact = (SpaceAction *)slink;
 
-  BKE_id_remapper_apply(mappings, &sact->action, ID_REMAP_APPLY_DEFAULT);
-  BKE_id_remapper_apply(mappings, &sact->ads.filter_grp, ID_REMAP_APPLY_DEFAULT);
+  BKE_id_remapper_apply(mappings, (ID **)&sact->action, ID_REMAP_APPLY_DEFAULT);
+  BKE_id_remapper_apply(mappings, (ID **)&sact->ads.filter_grp, ID_REMAP_APPLY_DEFAULT);
   BKE_id_remapper_apply(mappings, &sact->ads.source, ID_REMAP_APPLY_DEFAULT);
 }
 
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index bbf3c6f768c..f79b8cdc241 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -33,6 +33,7 @@
 #include "BKE_appdir.h"
 #include "BKE_context.h"
 #include "BKE_global.h"
+#include "BKE_lib_remap.h"
 #include "BKE_main.h"
 #include "BKE_screen.h"
 
@@ -992,7 +993,7 @@ static int /*eContextResult*/ file_context(const bContext *C,
   return CTX_RESULT_MEMBER_NOT_FOUND;
 }
 
-static void file_id_remap(ScrArea *area, SpaceLink *sl, ID *UNUSED(old_id), ID *UNUSED(new_id))
+static void file_id_remap(ScrArea *area, SpaceLink *sl, const struct IDRemapper *UNUSED(mappings))
 {
   SpaceFile *sfile = (SpaceFile *)sl;
 
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index 6c45d39e0d8..0cc9ffb26ed 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -31,6 +31,7 @@
 #include "BLI_utildefines.h"
 
 #include "BKE_context.h"
+#include "BKE_lib_remap.h"
 #include "BKE_outliner_treehash.h"
 #include "BKE_screen.h"
 
@@ -398,45 +399,49 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl)
   return (SpaceLink *)space_outliner_new;
 }
 
-static void outliner_id_remap(ScrArea *area, SpaceLink *slink, ID *old_id, ID *new_id)
+static void outliner_id_remap(ScrArea *area, SpaceLink *slink, const struct IDRemapper *mappings)
 {
   SpaceOutliner *space_outliner = (SpaceOutliner *)slink;
 
-  /* Some early out checks. */
-  if (!TREESTORE_ID_TYPE(old_id)) {
-    return; /* ID type is not used by outliner. */
-  }
+  BKE_id_remapper_apply(mappings, (ID **)&space_outliner->search_tse.id, ID_REMAP_APPLY_DEFAULT);
 
-  if (space_outliner->search_tse.id == old_id) {
-    space_outliner->search_tse.id = new_id;
+  if (!space_outliner->treestore) {
+    return;
   }
 
-  if (space_outliner->treestore) {
-    TreeStoreElem *tselem;
-    BLI_mempool_iter iter;
-    bool changed = false;
-
-    BLI_mempool_iternew(space_outliner->treestore, &iter);
-    while ((tselem = BLI_mempool_iterstep(&iter))) {
-      if (tselem->id == old_id) {
-        tselem->id = new_id;
+  TreeStoreElem *tselem;
+  BLI_mempool_iter iter;
+  bool changed = false;
+  bool unassigned = false;
+
+  BLI_mempool_iternew(space_outliner->treestore, &iter);
+  while ((tselem = BLI_mempool_iterstep(&iter))) {
+    switch (BKE_id_remapper_apply(mappings, &tselem->id, ID_REMAP_APPLY_DEFAULT)) {
+      case ID_REMAP_SOURCE_REMAPPED:
         changed = true;
-      }
+        break;
+      case ID_REMAP_SOURCE_UNASSIGNED:
+        changed = true;
+        unassigned = true;
+        break;
+      case ID_REMAP_SOURCE_UNAVAILABLE:
+      case ID_REMAP_SOURCE_NOT_MAPPABLE:
+        break;
     }
+  }
 
-    /* Note that the Outliner may not be the active editor of the area, and hence not initialized.
-     * So runtime data might not have been created yet. */
-    if (space_outliner->runtime && space_outliner->runtime->treehash && changed) {
-      /* rebuild hash table, because it depends on ids too */
-      /* postpone a full rebuild because this can be called many times on-free */
-      space_outliner->storeflag |= SO_TREESTORE_REBUILD;
-
-      if (new_id == NULL) {
-        /* Redraw is needed when removing data for multiple outlines show the same data.
-         * without this, the stale data won't get fully flushed when this outliner
-         * is not the active outliner the user is interacting with. See T85976. */
-        ED_area_tag_redraw(area);
-      }
+  /* Note that the Outliner may not be the active editor of the area, and hence not initialized.
+   * So runtime data might not have been created yet. */
+  if (space_outliner->runtime && space_outliner->runtime->treehash && changed) {
+    /* rebuild hash table, because it depends on ids too */
+    /* postpone a full rebuild because this can be called many times on-free */
+    space_outliner->storeflag |= SO_TREESTORE_REBUILD;
+
+    if (unassigned) {
+      /* Redraw is needed when removing data for multiple outlines show the same data.
+       * without this, the stale data won't get fully flushed when this outliner
+       * is not the active outliner the user is interacting with. See T85976. */
+      ED_area_tag_redraw(area);
     }
   }
 }
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index 3a0ca0cf989..b294fdf4820 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -991,7 +991,7 @@ static void sequencer_buttons_region_listener(const wmRegionListenerParams *para
 
 static void sequencer_id_remap(ScrArea *UNUSED(area),
                                SpaceLink *slink,
-                               const struct IDMappings *mappings)
+                               const struct IDRemapper *mappings)
 {
   SpaceSeq *sseq = (SpaceSeq *)slink;
   BKE_id_remapper_apply(mappings, (ID **)&sseq->gpd, ID_REMAP_APPLY_DEFAULT);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 8f0672e5f16..b9bd9ca1f5e 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -1816,7 +1816,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
 
 static void view3d_id_remap_v3d_ob_centers(View3D *v3d, const struct IDRemapper *mappings)
 {
-  if (BKE_id_remapper_apply(mappings, (ID **)v3d->ob_center, ID_REMAP_APPLY_DEFAULT) ==
+  if (BKE_id_remapper_apply(mappings, (ID **)&v3d->ob_center, ID_REMAP_APPLY_DEFAULT) ==
       ID_REMAP_SOURCE_UNASSIGNED) {
     /* Otherwise, bonename may remain valid...
      * We could be smart and check this, too? */
@@ -1831,7 +1831,7 @@ static void view3d_id_remap_v3d(ScrArea *area,
                                 const bool is_local)
 {
   ARegion *region;
-  if (BKE_id_remapper_apply(mappings, (ID **)v3d->camera, ID_REMAP_APPLY_DEFAULT) ==
+  if (BKE_id_remapper_apply(mappings, (ID **)&v3d->camera, ID_REMAP_APPLY_DEFAULT) ==
       ID_REMAP_SOURCE_UNASSIGNED) {
     /* 3D view might be inactive, in that case needs to use slink->regionbase */
     ListBase *regionbase = (slink == area->spacedata.first) ? &area->regionbase :



More information about the Bf-blender-cvs mailing list