[Bf-blender-cvs] [42b2ae5f694] master: Fix lost node links when linked node group datablock is temporarily missing

Brecht Van Lommel noreply at git.blender.org
Thu Nov 19 15:55:27 CET 2020


Commit: 42b2ae5f694d554b1f4c58acd0afd26516b9ed20
Author: Brecht Van Lommel
Date:   Thu Nov 19 14:23:48 2020 +0100
Branches: master
https://developer.blender.org/rB42b2ae5f694d554b1f4c58acd0afd26516b9ed20

Fix lost node links when linked node group datablock is temporarily missing

Don't refresh the list of sockets, so that when the .blend file is restored the
links remain valid. Also display such nodes in red to indicate an error, same
as when the node type info is missing.

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.c
M	source/blender/compositor/intern/COM_Converter.cpp
M	source/blender/editors/space_node/node_draw.c
M	source/blender/nodes/intern/node_common.c

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index e3591b8fcd1..e6fb9d86b0a 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -501,7 +501,7 @@ void ntreeInterfaceTypeUpdate(struct bNodeTree *ntree);
 struct bNodeType *nodeTypeFind(const char *idname);
 void nodeRegisterType(struct bNodeType *ntype);
 void nodeUnregisterType(struct bNodeType *ntype);
-bool nodeIsRegistered(struct bNode *node);
+bool nodeTypeUndefined(struct bNode *node);
 struct GHashIterator *nodeTypeGetIterator(void);
 
 /* helper macros for iterating over node types */
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index e2e61284d2e..180cced70ea 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1204,9 +1204,11 @@ void nodeUnregisterType(bNodeType *nt)
   BLI_ghash_remove(nodetypes_hash, nt->idname, NULL, node_free_type);
 }
 
-bool nodeIsRegistered(bNode *node)
+bool nodeTypeUndefined(bNode *node)
 {
-  return (node->typeinfo != &NodeTypeUndefined);
+  return (node->typeinfo == &NodeTypeUndefined) ||
+         (node->type == NODE_GROUP && node->id && ID_IS_LINKED(node->id) &&
+          (node->id->tag & LIB_TAG_MISSING));
 }
 
 GHashIterator *nodeTypeGetIterator(void)
diff --git a/source/blender/compositor/intern/COM_Converter.cpp b/source/blender/compositor/intern/COM_Converter.cpp
index f7250de8566..9b3355f535a 100644
--- a/source/blender/compositor/intern/COM_Converter.cpp
+++ b/source/blender/compositor/intern/COM_Converter.cpp
@@ -136,7 +136,7 @@ Node *Converter::convert(bNode *b_node)
   Node *node = nullptr;
 
   /* ignore undefined nodes with missing or invalid node data */
-  if (!nodeIsRegistered(b_node)) {
+  if (nodeTypeUndefined(b_node)) {
     return nullptr;
   }
 
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index bafd1b9a388..0e68ebe7c03 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -1288,7 +1288,7 @@ static void node_draw_basis(const bContext *C,
   }
 
   /* body */
-  if (!nodeIsRegistered(node)) {
+  if (nodeTypeUndefined(node)) {
     /* use warning color to indicate undefined types */
     UI_GetThemeColor4fv(TH_REDALERT, color);
   }
diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c
index 36b9098d972..0b1ab85c059 100644
--- a/source/blender/nodes/intern/node_common.c
+++ b/source/blender/nodes/intern/node_common.c
@@ -188,6 +188,10 @@ void node_group_update(struct bNodeTree *ntree, struct bNode *node)
   if (node->id == NULL) {
     nodeRemoveAllSockets(ntree, node);
   }
+  else if ((ID_IS_LINKED(node->id) && (node->id->tag & LIB_TAG_MISSING))) {
+    /* Missing datablock, leave sockets unchanged so that when it comes back
+     * the links remain valid. */
+  }
   else {
     bNodeTree *ngroup = (bNodeTree *)node->id;
     group_verify_socket_list(ntree, node, &ngroup->inputs, &node->inputs, SOCK_IN);



More information about the Bf-blender-cvs mailing list