From f70921d90ccbaf6d54f5bcc90a9ef665d9001361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Mon, 20 Jan 2014 12:47:58 +0100 Subject: 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. --- source/blender/blenkernel/intern/node.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'source/blender/blenkernel/intern/node.c') diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 4a4140942c8..34b016a08ba 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -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; -- cgit v1.2.3