[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51717] trunk/blender/source/blender/ blenkernel: Fix for freeing node trees that are part of other data blocks ( material, world, lamp, texture, scene).

Lukas Toenne lukas.toenne at googlemail.com
Sun Oct 28 18:09:51 CET 2012


Revision: 51717
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51717
Author:   lukastoenne
Date:     2012-10-28 17:09:50 +0000 (Sun, 28 Oct 2012)
Log Message:
-----------
Fix for freeing node trees that are part of other data blocks (material, world, lamp, texture, scene). These node trees were not properly freeing the IDProperty data, due to not being called from BKE_libblock_free.

Now there is an extra function BKE_libblock_free_data, which is called explicitly in ntreeFreeTree if the tree is not part of the library data (ntreeCopyTree does a similar thing using BKE_libblock_copy_data).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_library.h
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/blenkernel/intern/node.c

Modified: trunk/blender/source/blender/blenkernel/BKE_library.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_library.h	2012-10-28 17:04:32 UTC (rev 51716)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h	2012-10-28 17:09:50 UTC (rev 51717)
@@ -81,6 +81,7 @@
 
 void BKE_libblock_free(struct ListBase *lb, void *idv);
 void BKE_libblock_free_us(struct ListBase *lb, void *idv);
+void BKE_libblock_free_data(struct ID *id);
 void free_main(struct Main *mainvar);
 
 void tag_main_idcode(struct Main *mainvar, const short type, const short tag);

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2012-10-28 17:04:32 UTC (rev 51716)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2012-10-28 17:09:50 UTC (rev 51717)
@@ -796,6 +796,18 @@
 	}
 }
 
+void BKE_libblock_free_data(ID *id)
+{
+	Main *bmain = G.main;  /* should eventually be an arg */
+	
+	if (id->properties) {
+		IDP_FreeProperty(id->properties);
+		MEM_freeN(id->properties);
+	}
+	
+	/* this ID may be a driver target! */
+	BKE_animdata_main_cb(bmain, animdata_dtar_clear_cb, (void *)id);
+}
 
 /* used in headerbuttons.c image.c mesh.c screen.c sound.c and library.c */
 void BKE_libblock_free(ListBase *lb, void *idv)
@@ -904,15 +916,9 @@
 			break;
 	}
 
-	if (id->properties) {
-		IDP_FreeProperty(id->properties);
-		MEM_freeN(id->properties);
-	}
-
 	BLI_remlink(lb, id);
 
-	/* this ID may be a driver target! */
-	BKE_animdata_main_cb(bmain, animdata_dtar_clear_cb, (void *)id);
+	BKE_libblock_free_data(id);
 
 	MEM_freeN(id);
 }

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2012-10-28 17:04:32 UTC (rev 51716)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2012-10-28 17:09:50 UTC (rev 51717)
@@ -1013,6 +1013,7 @@
 /* do not free ntree itself here, BKE_libblock_free calls this function too */
 void ntreeFreeTree_ex(bNodeTree *ntree, const short do_id_user)
 {
+	bNodeTree *tntree;
 	bNode *node, *next;
 	bNodeSocket *sock;
 	
@@ -1069,6 +1070,14 @@
 	for (sock = ntree->outputs.first; sock; sock = sock->next)
 		node_socket_free_default_value(sock->type, sock->default_value);
 	BLI_freelistN(&ntree->outputs);
+	
+	/* if ntree is not part of library, free the libblock data explicitly */
+	for (tntree = G.main->nodetree.first; tntree; tntree = tntree->id.next)
+		if (tntree == ntree)
+			break;
+	if (tntree == NULL) {
+		BKE_libblock_free_data(&ntree->id);
+	}
 }
 /* same as ntreeFreeTree_ex but always manage users */
 void ntreeFreeTree(bNodeTree *ntree)




More information about the Bf-blender-cvs mailing list