[Bf-blender-cvs] [c2f7d4efc3f] master: Fix T62134: duplicating a material won't update node group's node tree user count anymore.
Bastien Montagne
noreply at git.blender.org
Mon Mar 4 16:20:08 CET 2019
Commit: c2f7d4efc3f0fa421dd0ced473ed3024c9e0f907
Author: Bastien Montagne
Date: Mon Mar 4 16:14:36 2019 +0100
Branches: master
https://developer.blender.org/rBc2f7d4efc3f0fa421dd0ced473ed3024c9e0f907
Fix T62134: duplicating a material won't update node group's node tree user count anymore.
Yet again we have to twist and curl like insane worms to cope with
IDs-not-in-main infamous issue... :(
===================================================================
M source/blender/blenkernel/intern/library_query.c
===================================================================
diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index cbc8588c45c..d4ded5458c1 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -144,6 +144,11 @@ typedef struct LibraryForeachIDData {
BLI_LINKSTACK_DECLARE(ids_todo, ID *);
} LibraryForeachIDData;
+static void library_foreach_ID_link(
+ Main *bmain, ID *id,
+ LibraryIDLinkCallback callback, void *user_data, int flag,
+ LibraryForeachIDData *inherit_data);
+
static void library_foreach_idproperty_ID_link(LibraryForeachIDData *data, IDProperty *prop, int flag)
{
if (!prop)
@@ -331,18 +336,16 @@ static void library_foreach_ID_as_subdata_link(
}
}
else {
- BKE_library_foreach_ID_link(NULL, id, callback, user_data, flag);
+ library_foreach_ID_link(NULL, id, callback, user_data, flag, data);
}
FOREACH_FINALIZE_VOID;
}
-/**
- * Loop over all of the ID's this datablock links to.
- *
- * \note: May be extended to be recursive in the future.
- */
-void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback callback, void *user_data, int flag)
+static void library_foreach_ID_link(
+ Main *bmain, ID *id,
+ LibraryIDLinkCallback callback, void *user_data, int flag,
+ LibraryForeachIDData *inherit_data)
{
LibraryForeachIDData data;
int i;
@@ -372,9 +375,21 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
for (; id != NULL; id = (flag & IDWALK_RECURSE) ? BLI_LINKSTACK_POP(data.ids_todo) : NULL) {
data.self_id = id;
- data.cb_flag = ID_IS_LINKED(id) ? IDWALK_CB_INDIRECT_USAGE : 0;
- /* When an ID is not in Main database, it should never refcount IDs it is using. */
- data.cb_flag_clear = (id->tag & LIB_TAG_NO_MAIN) ? IDWALK_CB_USER | IDWALK_CB_USER_ONE : 0;
+
+ /* inherit_data is non-NULL when this function is called for some sub-data ID
+ * (like root nodetree of a material).
+ * In that case, we do not want to generate those 'generic flags' from our current sub-data ID (the node tree),
+ * but re-use those generated for the 'owner' ID (the material)... */
+ if (inherit_data == NULL) {
+ data.cb_flag = ID_IS_LINKED(id) ? IDWALK_CB_INDIRECT_USAGE : 0;
+ /* When an ID is not in Main database, it should never refcount IDs it is using.
+ * Exceptions: NodeTrees (yeeahhh!) directly used by Materials. */
+ data.cb_flag_clear = (id->tag & LIB_TAG_NO_MAIN) ? IDWALK_CB_USER | IDWALK_CB_USER_ONE : 0;
+ }
+ else {
+ data.cb_flag = inherit_data->cb_flag;
+ data.cb_flag_clear = inherit_data->cb_flag_clear;
+ }
if (bmain != NULL && bmain->relations != NULL && (flag & IDWALK_READONLY)) {
/* Note that this is minor optimization, even in worst cases (like id being an object with lots of
@@ -1037,6 +1052,14 @@ FOREACH_FINALIZE:
#undef FOREACH_CALLBACK_INVOKE_ID
#undef FOREACH_CALLBACK_INVOKE
+/**
+ * Loop over all of the ID's this datablock links to.
+ */
+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);
+}
+
/**
* re-usable function, use when replacing ID's
*/
More information about the Bf-blender-cvs
mailing list