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.
This commit is contained in:
parent
c5306dd0cd
commit
42b2ae5f69
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue