diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 6 | ||||
-rw-r--r-- | source/blender/compositor/intern/COM_Converter.cpp | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_draw.c | 2 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_common.c | 4 |
5 files changed, 11 insertions, 5 deletions
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); |