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:
Lukas Tönne 2014-01-20 12:47:58 +01:00
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
1 changed files with 17 additions and 9 deletions

View File

@ -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;