[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51381] trunk/blender/source/blender: Fix #32856, Crash in compositor due to deprecated node socket flag in old files.

Lukas Toenne lukas.toenne at googlemail.com
Wed Oct 17 12:49:45 CEST 2012


Revision: 51381
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51381
Author:   lukastoenne
Date:     2012-10-17 10:49:42 +0000 (Wed, 17 Oct 2012)
Log Message:
-----------
Fix #32856, Crash in compositor due to deprecated node socket flag in old files.

Bit flag 5 has apparently been used for another purpose in old versions, then deprecated and was actually removed from DNA (this should never be done), then later it got reused for SOCK_DYNAMIC. Now a one-time check to clean up these flags is done in do_versions.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-10-17 09:49:32 UTC (rev 51380)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-10-17 10:49:42 UTC (rev 51381)
@@ -42,7 +42,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         264
-#define BLENDER_SUBVERSION      3
+#define BLENDER_SUBVERSION      4
 
 /* 262 was the last editmesh release but its has compatibility code for bmesh data,
  * so set the minversion to 2.61 */

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-10-17 09:49:32 UTC (rev 51380)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-10-17 10:49:42 UTC (rev 51381)
@@ -7058,6 +7058,21 @@
 			node->flag |= NODE_OPTIONS;
 }
 
+static void do_version_node_cleanup_dynamic_sockets_264(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+{
+	bNode *node;
+	bNodeSocket *sock;
+	
+	for (node = ntree->nodes.first; node; node = node->next) {
+		if (!ELEM(node->type, NODE_GROUP, CMP_NODE_IMAGE)) {
+			for (sock = node->inputs.first; sock; sock = sock->next)
+				sock->flag &= ~SOCK_DYNAMIC;
+			for (sock = node->outputs.first; sock; sock = sock->next)
+				sock->flag &= ~SOCK_DYNAMIC;
+		}
+	}
+}
+
 static void do_versions(FileData *fd, Library *lib, Main *main)
 {
 	/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -8110,6 +8125,28 @@
 		}
 	}
 
+	if (main->versionfile < 264 || (main->versionfile == 264 && main->subversionfile < 4)) {
+		/* Fix for old node flags: Apparently the SOCK_DYNAMIC flag has been in use for other
+		 * purposes before and then removed and later reused for SOCK_DYNAMIC. This socket should
+		 * only be used by certain node types which don't use template lists, cleaning this up here.
+		 */
+		bNodeTreeType *ntreetype;
+		bNodeTree *ntree;
+		
+		ntreetype = ntreeGetType(NTREE_COMPOSIT);
+		if (ntreetype && ntreetype->foreach_nodetree)
+			ntreetype->foreach_nodetree(main, NULL, do_version_node_cleanup_dynamic_sockets_264);
+		ntreetype = ntreeGetType(NTREE_SHADER);
+		if (ntreetype && ntreetype->foreach_nodetree)
+			ntreetype->foreach_nodetree(main, NULL, do_version_node_cleanup_dynamic_sockets_264);
+		ntreetype = ntreeGetType(NTREE_TEXTURE);
+		if (ntreetype && ntreetype->foreach_nodetree)
+			ntreetype->foreach_nodetree(main, NULL, do_version_node_cleanup_dynamic_sockets_264);
+		
+		for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+			do_version_node_cleanup_dynamic_sockets_264(NULL, NULL, ntree);
+	}
+
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
 	/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
 




More information about the Bf-blender-cvs mailing list