Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2014-01-20 15:47:58 +0400
committerLukas Tönne <lukas.toenne@gmail.com>2014-01-20 15:52:30 +0400
commitf70921d90ccbaf6d54f5bcc90a9ef665d9001361 (patch)
treef4663e692cffdfe13325d18ebf6975171f26a7e0 /source/blender/blenkernel/intern/node.c
parent1b3fdc43095d8d0a7dff9adf5c93dbad81a85576 (diff)
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.
Diffstat (limited to 'source/blender/blenkernel/intern/node.c')
-rw-r--r--source/blender/blenkernel/intern/node.c26
1 files changed, 17 insertions, 9 deletions
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;