Commit: c9c013f53bad4c344491768cb89c867f12a8244d
Author: Bastien Montagne
Date:   Thu Feb 13 15:13:19 2020 +0100
Branches: master
https://developer.blender.org/rBc9c013f53bad4c344491768cb89c867f12a8244d

libquery: Add 'owner id' to callback data.

In some cases it's important to always have a proper ID as reference,
e.g. whene generating data supposed to represent main data-base...

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

M       source/blender/blenkernel/BKE_lib_query.h
M       source/blender/blenkernel/intern/lib_query.c

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

diff --git a/source/blender/blenkernel/BKE_lib_query.h 
b/source/blender/blenkernel/BKE_lib_query.h
index 4d1b924b0d3..d47ba2497d4 100644
--- a/source/blender/blenkernel/BKE_lib_query.h
+++ b/source/blender/blenkernel/BKE_lib_query.h
@@ -85,6 +85,11 @@ enum {
 
 typedef struct LibraryIDLinkCallbackData {
   void *user_data;
+  /* 'Real' ID, the one that might be in bmain, only differs from self_id when 
the later is a
+   * private one. */
+  struct ID *id_owner;
+  /* ID from which the current ID pointer is being processed. It may be a 
'private' ID like master
+   * collection or root node tree. */
   struct ID *id_self;
   struct ID **id_pointer;
   int cb_flag;
diff --git a/source/blender/blenkernel/intern/lib_query.c 
b/source/blender/blenkernel/intern/lib_query.c
index 44a8647fceb..4b075520b21 100644
--- a/source/blender/blenkernel/intern/lib_query.c
+++ b/source/blender/blenkernel/intern/lib_query.c
@@ -90,6 +90,7 @@
     ID *old_id = *(id_pp); \
     const int callback_return = (_data)->callback(&(struct 
LibraryIDLinkCallbackData){ \
         .user_data = (_data)->user_data, \
+        .id_owner = (_data)->owner_id, \
         .id_self = (_data)->self_id, \
         .id_pointer = id_pp, \
         .cb_flag = ((_cb_flag | (_data)->cb_flag) & 
~(_data)->cb_flag_clear)}); \
@@ -133,7 +134,14 @@ enum {
 };
 
 typedef struct LibraryForeachIDData {
+  Main *bmain;
+  /* 'Real' ID, the one that might be in bmain, only differs from self_id when 
the later is a
+   * private one. */
+  ID *owner_id;
+  /* ID from which the current ID pointer is being processed. It may be a 
'private' ID like master
+   * collection or root node tree. */
   ID *self_id;
+
   int flag;
   int cb_flag;
   int cb_flag_clear;
@@ -147,6 +155,7 @@ typedef struct LibraryForeachIDData {
 } LibraryForeachIDData;
 
 static void library_foreach_ID_link(Main *bmain,
+                                    ID *id_owner,
                                     ID *id,
                                     LibraryIDLinkCallback callback,
                                     void *user_data,
@@ -367,27 +376,32 @@ static void library_foreach_ID_as_subdata_link(ID **id_pp,
   if (flag & IDWALK_RECURSE) {
     /* Defer handling into main loop, recursively calling 
BKE_library_foreach_ID_link in
      * IDWALK_RECURSE case is troublesome, see T49553. */
+    /* XXX note that this breaks the 'owner id' thing now, we likely want to 
handle that
+     * differently at some point, but for now it should not be a problem in 
practice. */
     if (BLI_gset_add(data->ids_handled, id)) {
       BLI_LINKSTACK_PUSH(data->ids_todo, id);
     }
   }
   else {
-    library_foreach_ID_link(NULL, id, callback, user_data, flag, data);
+    library_foreach_ID_link(data->bmain, data->owner_id, id, callback, 
user_data, flag, data);
   }
 
   FOREACH_FINALIZE_VOID;
 }
 
 static void library_foreach_ID_link(Main *bmain,
+                                    ID *id_owner,
                                     ID *id,
                                     LibraryIDLinkCallback callback,
                                     void *user_data,
                                     int flag,
                                     LibraryForeachIDData *inherit_data)
 {
-  LibraryForeachIDData data;
+  LibraryForeachIDData data = {.bmain = bmain};
   int i;
 
+  BLI_assert(inherit_data == NULL || data.bmain == inherit_data->bmain);
+
   if (flag & IDWALK_RECURSE) {
     /* For now, recursion implies read-only. */
     flag |= IDWALK_READONLY;
@@ -412,6 +426,7 @@ static void library_foreach_ID_link(Main *bmain,
 
   for (; id != NULL; id = (flag & IDWALK_RECURSE) ? 
BLI_LINKSTACK_POP(data.ids_todo) : NULL) {
     data.self_id = id;
+    data.owner_id = (id->flag & LIB_PRIVATE_DATA) ? id_owner : data.self_id;
 
     /* inherit_data is non-NULL when this function is called for some sub-data 
ID
      * (like root nodetree of a material).
@@ -1077,7 +1092,7 @@ FOREACH_FINALIZE:
 void BKE_library_foreach_ID_link(
     Main *bmain, ID *id, LibraryIDLinkCallback callback, void *user_data, int 
flag)
 {
-  library_foreach_ID_link(bmain, id, callback, user_data, flag, NULL);
+  library_foreach_ID_link(bmain, NULL, id, callback, user_data, flag, NULL);
 }
 
 /**

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to