Fix T38221: node fcurves in compositor get deleted when muting a node.
This is because of the animdata cleanup in rBd2e55cb. This works ok in general, but causes issues with the localized node trees used for compo/ shader/texture previews. These localized trees share the same default action as their original trees, and then remove fcurves when removing muted nodes (which should affect the localized tree only). node_free_node_ex now has an argument for disabling animdata cleanup, which is also not necessary when freeing the whole node tree (because animdata is freed in advance anyway). In addition to that it also checks the NTREE_IS_LOCALIZED flag to prevent freeing of fcurves in the action.
This commit is contained in:
parent
1b3fdc4309
commit
f70921d90c
Notes:
blender-bot
2023-02-14 11:20:27 +01:00
Referenced by issue #38221, Keyframes of Compositing Nodes get deleted when muting that node
|
@ -1590,11 +1590,14 @@ static void node_unlink_attached(bNodeTree *ntree, bNode *parent)
|
|||
}
|
||||
|
||||
/** \note caller needs to manage node->id user */
|
||||
static void node_free_node_ex(bNodeTree *ntree, bNode *node, bool use_api_free_cb)
|
||||
static void node_free_node_ex(bNodeTree *ntree, bNode *node, bool remove_animdata, bool use_api_free_cb)
|
||||
{
|
||||
bNodeSocket *sock, *nextsock;
|
||||
char propname_esc[MAX_IDPROP_NAME * 2];
|
||||
char prefix[MAX_IDPROP_NAME * 2];
|
||||
|
||||
/* don't remove node animdata if the tree is localized,
|
||||
* Action is shared with the original tree (T38221)
|
||||
*/
|
||||
remove_animdata &= ntree && !(ntree->flag & NTREE_IS_LOCALIZED);
|
||||
|
||||
/* extra free callback */
|
||||
if (use_api_free_cb && node->typeinfo->freefunc_api) {
|
||||
|
@ -1614,10 +1617,15 @@ static void node_free_node_ex(bNodeTree *ntree, bNode *node, bool use_api_free_c
|
|||
|
||||
BLI_remlink(&ntree->nodes, node);
|
||||
|
||||
BLI_strescape(propname_esc, node->name, sizeof(propname_esc));
|
||||
BLI_snprintf(prefix, sizeof(prefix), "nodes[\"%s\"]", propname_esc);
|
||||
if (remove_animdata) {
|
||||
char propname_esc[MAX_IDPROP_NAME * 2];
|
||||
char prefix[MAX_IDPROP_NAME * 2];
|
||||
|
||||
BKE_animdata_fix_paths_remove((ID *)ntree, prefix);
|
||||
BLI_strescape(propname_esc, node->name, sizeof(propname_esc));
|
||||
BLI_snprintf(prefix, sizeof(prefix), "nodes[\"%s\"]", propname_esc);
|
||||
|
||||
BKE_animdata_fix_paths_remove((ID *)ntree, prefix);
|
||||
}
|
||||
|
||||
if (ntree->typeinfo->free_node_cache)
|
||||
ntree->typeinfo->free_node_cache(ntree, node);
|
||||
|
@ -1658,7 +1666,7 @@ static void node_free_node_ex(bNodeTree *ntree, bNode *node, bool use_api_free_c
|
|||
|
||||
void nodeFreeNode(bNodeTree *ntree, bNode *node)
|
||||
{
|
||||
node_free_node_ex(ntree, node, true);
|
||||
node_free_node_ex(ntree, node, true, true);
|
||||
}
|
||||
|
||||
static void node_socket_interface_free(bNodeTree *UNUSED(ntree), bNodeSocket *sock)
|
||||
|
@ -1748,7 +1756,7 @@ void ntreeFreeTree_ex(bNodeTree *ntree, const short do_id_user)
|
|||
(void)do_id_user;
|
||||
#endif
|
||||
|
||||
node_free_node_ex(ntree, node, false);
|
||||
node_free_node_ex(ntree, node, false, false);
|
||||
}
|
||||
|
||||
/* free interface sockets */
|
||||
|
@ -2519,7 +2527,7 @@ void BKE_node_clipboard_clear(void)
|
|||
|
||||
for (node = node_clipboard.nodes.first; node; node = node_next) {
|
||||
node_next = node->next;
|
||||
node_free_node_ex(NULL, node, false);
|
||||
node_free_node_ex(NULL, node, false, false);
|
||||
}
|
||||
node_clipboard.nodes.first = node_clipboard.nodes.last = NULL;
|
||||
|
||||
|
|
Loading…
Reference in New Issue