[Bf-blender-cvs] [0613697fd9a] temp-T94185-id_remapping-experiment-a: Modified st->id_remap to new interface.

Jeroen Bakker noreply at git.blender.org
Mon Dec 20 10:24:46 CET 2021


Commit: 0613697fd9a5b32e41ff1b6939d2e6ae62180dba
Author: Jeroen Bakker
Date:   Mon Dec 20 10:24:09 2021 +0100
Branches: temp-T94185-id_remapping-experiment-a
https://developer.blender.org/rB0613697fd9a5b32e41ff1b6939d2e6ae62180dba

Modified st->id_remap to new interface.

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

M	source/blender/blenkernel/BKE_lib_remap.h
M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/intern/lib_id_remapper.cc
M	source/blender/blenkernel/intern/lib_id_remapper_test.cc
M	source/blender/editors/space_action/space_action.c
M	source/blender/editors/space_buttons/space_buttons.c
M	source/blender/editors/space_clip/space_clip.c
M	source/blender/editors/space_graph/space_graph.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/editors/space_nla/space_nla.c
M	source/blender/editors/space_node/space_node.cc
M	source/blender/editors/space_sequencer/space_sequencer.c
M	source/blender/editors/space_spreadsheet/space_spreadsheet.cc
M	source/blender/editors/space_text/space_text.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/util/ed_util.c

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

diff --git a/source/blender/blenkernel/BKE_lib_remap.h b/source/blender/blenkernel/BKE_lib_remap.h
index f360717a804..0703a99f830 100644
--- a/source/blender/blenkernel/BKE_lib_remap.h
+++ b/source/blender/blenkernel/BKE_lib_remap.h
@@ -38,6 +38,8 @@
 extern "C" {
 #endif
 
+struct ID;
+
 /* BKE_libblock_free, delete are declared in BKE_lib_id.h for convenience. */
 
 /* Also IDRemap->flag. */
@@ -163,8 +165,16 @@ typedef enum IDRemapperApplyResult {
   ID_REMAP_SOURCE_NOT_MAPPABLE,
   /** Source has been remapped to a new pointer. */
   ID_REMAP_SOURCE_REMAPPED,
+  /** Source has been set to NULL. */
+  ID_REMAP_SOURCE_UNASSIGNED,
 } IDRemapperApplyResult;
 
+typedef enum IDRemapperApplyOptions {
+  ID_REMAP_APPLY_DEFAULT = 0,
+  ID_REMAP_APPLY_UPDATE_REFCOUNT = (1 << 0),
+  ID_REMAP_APPLY_ENSURE_REAL = (1 << 1),
+} IDRemapperApplyOptions;
+
 /**
  * \brief Create a new ID Remapper.
  *
@@ -182,7 +192,9 @@ void BKE_id_remapper_add(struct IDRemapper *id_remapper, struct ID *old_id, stru
  * Update the id pointer stored in the given id_ptr_ptr id a remapping rule exists.
  */
 IDRemapperApplyResult BKE_id_remapper_apply(const struct IDRemapper *id_remapper,
-                                            struct ID **id_ptr_ptr);
+                                            struct ID **id_ptr_ptr,
+                                            IDRemapperApplyOptions options);
+bool BKE_id_remapper_has_mapping_for(const struct IDRemapper *id_remapper, uint64_t type_filter);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index fd0682ee8f0..4ef7d64a57c 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -38,6 +38,7 @@ struct BlendLibReader;
 struct BlendWriter;
 struct Header;
 struct ID;
+struct IDRemapper;
 struct LibraryForeachIDData;
 struct ListBase;
 struct Menu;
@@ -117,10 +118,7 @@ typedef struct SpaceType {
   bContextDataCallback context;
 
   /* Used when we want to replace an ID by another (or NULL). */
-  void (*id_remap)(struct ScrArea *area,
-                   struct SpaceLink *sl,
-                   struct ID *old_id,
-                   struct ID *new_id);
+  void (*id_remap)(struct ScrArea *area, struct SpaceLink *sl, const struct IDRemapper *mappings);
 
   int (*space_subtype_get)(struct ScrArea *area);
   void (*space_subtype_set)(struct ScrArea *area, int value);
diff --git a/source/blender/blenkernel/intern/lib_id_remapper.cc b/source/blender/blenkernel/intern/lib_id_remapper.cc
index a020f35596c..fc9318a8fdb 100644
--- a/source/blender/blenkernel/intern/lib_id_remapper.cc
+++ b/source/blender/blenkernel/intern/lib_id_remapper.cc
@@ -1,23 +1,36 @@
 
+#include "DNA_ID.h"
+
+#include "BKE_idtype.h"
+#include "BKE_lib_id.h"
 #include "BKE_lib_remap.h"
 
 #include "MEM_guardedalloc.h"
 
 #include "BLI_map.hh"
 
+using IDTypeFilter = uint64_t;
+
 namespace blender::bke::id::remapper {
 struct IDRemapper {
  private:
   Map<ID *, ID *> mappings;
+  IDTypeFilter source_types = 0;
 
  public:
   void add(ID *old_id, ID *new_id)
   {
     BLI_assert(old_id != nullptr);
     mappings.add_as(old_id, new_id);
+    source_types |= BKE_idtype_idcode_to_idfilter(GS(old_id->name));
+  }
+
+  bool contains_mappings_for_any(IDTypeFilter filter) const
+  {
+    return (source_types & filter) != 0;
   }
 
-  IDRemapperApplyResult apply(ID **id_ptr_ptr) const
+  IDRemapperApplyResult apply(ID **id_ptr_ptr, IDRemapperApplyOptions options) const
   {
     BLI_assert(id_ptr_ptr != nullptr);
     if (*id_ptr_ptr == nullptr) {
@@ -28,7 +41,22 @@ struct IDRemapper {
       return ID_REMAP_SOURCE_UNAVAILABLE;
     }
 
+    if (options & ID_REMAP_APPLY_UPDATE_REFCOUNT) {
+      id_us_min(*id_ptr_ptr);
+    }
+
     *id_ptr_ptr = mappings.lookup(*id_ptr_ptr);
+    if (*id_ptr_ptr == nullptr) {
+      return ID_REMAP_SOURCE_UNASSIGNED;
+    }
+
+    if (options & ID_REMAP_APPLY_UPDATE_REFCOUNT) {
+      id_us_plus(*id_ptr_ptr);
+    }
+
+    if (options & ID_REMAP_APPLY_ENSURE_REAL) {
+      id_us_ensure_real(*id_ptr_ptr);
+    }
     return ID_REMAP_SOURCE_REMAPPED;
   }
 };
@@ -74,9 +102,17 @@ void BKE_id_remapper_add(IDRemapper *id_remapper, ID *old_id, ID *new_id)
   remapper->add(old_id, new_id);
 }
 
-IDRemapperApplyResult BKE_id_remapper_apply(const IDRemapper *id_remapper, ID **id_ptr_ptr)
+bool BKE_id_remapper_has_mapping_for(const struct IDRemapper *id_remapper, uint64_t type_filter)
+{
+  const blender::bke::id::remapper::IDRemapper *remapper = unwrap_const(id_remapper);
+  return remapper->contains_mappings_for_any(type_filter);
+}
+
+IDRemapperApplyResult BKE_id_remapper_apply(const IDRemapper *id_remapper,
+                                            ID **id_ptr_ptr,
+                                            const IDRemapperApplyOptions options)
 {
   const blender::bke::id::remapper::IDRemapper *remapper = unwrap_const(id_remapper);
-  return remapper->apply(id_ptr_ptr);
+  return remapper->apply(id_ptr_ptr, options);
 }
 }
\ No newline at end of file
diff --git a/source/blender/blenkernel/intern/lib_id_remapper_test.cc b/source/blender/blenkernel/intern/lib_id_remapper_test.cc
index d802a59d869..ba99fdaca05 100644
--- a/source/blender/blenkernel/intern/lib_id_remapper_test.cc
+++ b/source/blender/blenkernel/intern/lib_id_remapper_test.cc
@@ -29,7 +29,7 @@ TEST(lib_id_remapper, unavailable)
   ID *idp = &id1;
 
   IDRemapper *remapper = BKE_id_remapper_create();
-  IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp);
+  IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp, ID_REMAP_APPLY_DEFAULT);
   EXPECT_EQ(result, ID_REMAP_SOURCE_UNAVAILABLE);
 
   BKE_id_remapper_free(remapper);
@@ -40,7 +40,7 @@ TEST(lib_id_remapper, not_mappable)
   ID *idp = nullptr;
 
   IDRemapper *remapper = BKE_id_remapper_create();
-  IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp);
+  IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp, ID_REMAP_APPLY_DEFAULT);
   EXPECT_EQ(result, ID_REMAP_SOURCE_NOT_MAPPABLE);
 
   BKE_id_remapper_free(remapper);
@@ -54,22 +54,22 @@ TEST(lib_id_remapper, mapped)
 
   IDRemapper *remapper = BKE_id_remapper_create();
   BKE_id_remapper_add(remapper, &id1, &id2);
-  IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp);
+  IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp, ID_REMAP_APPLY_DEFAULT);
   EXPECT_EQ(result, ID_REMAP_SOURCE_REMAPPED);
   EXPECT_EQ(idp, &id2);
 
   BKE_id_remapper_free(remapper);
 }
 
-TEST(lib_id_remapper, mapped_to_nullptr)
+TEST(lib_id_remapper, unassigned)
 {
   ID id1;
   ID *idp = &id1;
 
   IDRemapper *remapper = BKE_id_remapper_create();
   BKE_id_remapper_add(remapper, &id1, nullptr);
-  IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp);
-  EXPECT_EQ(result, ID_REMAP_SOURCE_REMAPPED);
+  IDRemapperApplyResult result = BKE_id_remapper_apply(remapper, &idp, ID_REMAP_APPLY_DEFAULT);
+  EXPECT_EQ(result, ID_REMAP_SOURCE_UNASSIGNED);
   EXPECT_EQ(idp, nullptr);
 
   BKE_id_remapper_free(remapper);
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index 4463856f40a..96bf25c3ba3 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -36,6 +36,7 @@
 #include "BLI_utildefines.h"
 
 #include "BKE_context.h"
+#include "BKE_lib_remap.h"
 #include "BKE_nla.h"
 #include "BKE_screen.h"
 
@@ -814,20 +815,15 @@ static void action_refresh(const bContext *C, ScrArea *area)
   /* XXX re-sizing y-extents of tot should go here? */
 }
 
-static void action_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_id, ID *new_id)
+static void action_id_remap(ScrArea *UNUSED(area),
+                            SpaceLink *slink,
+                            const struct IDRemapper *mappings)
 {
   SpaceAction *sact = (SpaceAction *)slink;
 
-  if ((ID *)sact->action == old_id) {
-    sact->action = (bAction *)new_id;
-  }
-
-  if ((ID *)sact->ads.filter_grp == old_id) {
-    sact->ads.filter_grp = (Collection *)new_id;
-  }
-  if ((ID *)sact->ads.source == old_id) {
-    sact->ads.source = new_id;
-  }
+  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, &sact->ads.source, ID_REMAP_APPLY_DEFAULT);
 }
 
 /**
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 007a9105c76..cf9fb7f1b27 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -32,6 +32,7 @@
 
 #include "BKE_context.h"
 #include "BKE_gpencil_modifier.h" /* Types for registering panels. */
+#include "BKE_lib_remap.h"
 #include "BKE_modifier.h"
 #include "BKE_screen.h"
 #include "BKE_shader_fx.h"
@@ -860,54 +861,54 @@ static void buttons_area_listener(const wmSpaceTypeListenerParams *params)
   }
 }
 
-static void buttons_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, ID *old_id, ID *new_id)
+static void buttons_id_remap(ScrArea *UNUSED(area),
+                             SpaceLink *slink,
+                             const struct IDRemapper *mappings)
 {
   SpaceProperties *sbuts = (SpaceProperties *)slink;
 
-  if (sbuts->pinid == old_id) {
-    sbuts->pinid = new_id;
-    if (new_id == NULL) {
-      sbuts->flag &= ~SB_PIN_CONTEXT;
-    }
+  if (BKE_id_remapper_apply(mappings, &sbuts->pinid, ID_REMAP_APPLY_DEFAULT) ==
+      ID_REMAP_SOURCE_UNASSIGNED) {
+    sbuts->flag &= ~SB_PIN_CONTEXT;
   }
 
   if (sbuts->path) {
     ButsContextPath *path = sbuts->path;
 
-    int i;
-    for (i = 0; i < path->len; i++) {
-      if (path->ptr[i].owner_id == old_id) {
-        break;
-      }
-    }
+    for (int i = 0; i < path->len; i++) {
+      switch (BKE_id_remapper_apply(mappings, &path->ptr[i].owner_id, ID_REMAP_APPLY_DEFAULT)) {
+        case ID_REMAP_SOURCE_UNASSIGNED: {
+          if (i == 0) {
+            MEM_SAFE_FREE(sbuts->path);
+          }
+          else {
+            memset(&path->ptr[i], 0, s

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list