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 Toenne <lukas.toenne@googlemail.com>2013-10-01 13:29:56 +0400
committerLukas Toenne <lukas.toenne@googlemail.com>2013-10-01 13:29:56 +0400
commitff9f799d8b7f2141f09d87d8c494229f3a378911 (patch)
treef3693b4529544f1435093a9eec4d055eb1a3fe2e /source/blender/blenkernel/intern/node.c
parent3073a5b1c46b2c607099f9783d043299b224ef3d (diff)
Yet another fix for node groups localization: The ntreeLocalMerge function can not be used to free localized node groups, because it is not commonly called to free the localized node trees. Instead these
data blocks are freed using the standard ntreeFreeTree function, so freeing localized node groups has to be done there. This means an ugly loop over G.main to detect localized groups, but should not be a big problem in practice.
Diffstat (limited to 'source/blender/blenkernel/intern/node.c')
-rw-r--r--source/blender/blenkernel/intern/node.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 9c026815eb9..ebafb98f6ec 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1663,6 +1663,28 @@ static void node_socket_interface_free(bNodeTree *UNUSED(ntree), bNodeSocket *so
MEM_freeN(sock->default_value);
}
+static void free_localized_node_groups(bNodeTree *ntree)
+{
+ bNode *node;
+
+ for (node = ntree->nodes.first; node; node = node->next) {
+ if (node->type == NODE_GROUP && node->id) {
+ bNodeTree *ngroup = (bNodeTree *)node->id, *tntree;
+
+ /* is ntree part of library? */
+ for (tntree = G.main->nodetree.first; tntree; tntree = tntree->id.next)
+ if (tntree == ngroup)
+ break;
+
+ if (tntree == NULL) {
+ /* ntree is not in library, i.e. localized node group: free it */
+ ntreeFreeTree_ex(ngroup, false);
+ MEM_freeN(ngroup);
+ }
+ }
+ }
+}
+
/* do not free ntree itself here, BKE_libblock_free calls this function too */
void ntreeFreeTree_ex(bNodeTree *ntree, const short do_id_user)
{
@@ -1689,6 +1711,9 @@ void ntreeFreeTree_ex(bNodeTree *ntree, const short do_id_user)
}
}
+ /* XXX not nice, but needed to free localized node groups properly */
+ free_localized_node_groups(ntree);
+
/* unregister associated RNA types */
ntreeInterfaceTypeFree(ntree);
@@ -1990,23 +2015,9 @@ void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
/* we have to assume the editor already changed completely */
void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
{
- bNode *node;
-
- if (localtree) {
- if (ntree) {
- if (ntree->typeinfo->local_merge)
- ntree->typeinfo->local_merge(localtree, ntree);
- }
-
- for (node = localtree->nodes.first; node; node = node->next) {
- if (node->type == NODE_GROUP && node->id) {
- bNodeTree *localgroup = (bNodeTree *)node->id;
- /* not passing original node tree for node group merge,
- * because there may be multiple instances using the same group tree.
- */
- ntreeLocalMerge(localgroup, NULL);
- }
- }
+ if (ntree && localtree) {
+ if (ntree->typeinfo->local_merge)
+ ntree->typeinfo->local_merge(localtree, ntree);
ntreeFreeTree_ex(localtree, FALSE);
MEM_freeN(localtree);