[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33005] branches/particles-2010/source/ blender: Fix for socket type adaptation in and node groups.

Lukas Toenne lukas.toenne at googlemail.com
Thu Nov 11 12:16:02 CET 2010


Revision: 33005
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33005
Author:   lukastoenne
Date:     2010-11-11 12:16:02 +0100 (Thu, 11 Nov 2010)

Log Message:
-----------
Fix for socket type adaptation in and node groups. During type adaptation the sockets now use a temporary type variable, so that the internal type resolution of node groups is not affected and the order of updates for node trees does not matter.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-11-11 11:06:15 UTC (rev 33004)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-11-11 11:16:02 UTC (rev 33005)
@@ -695,6 +695,7 @@
 	*ngroup->owntype= node_group_typeinfo; /* copy data, for init */
 	
 	/* counting stats */
+	totin = totout = 0;
 	for(node= ngroup->nodes.first; node; node= node->next) {
 		for(sock= node->inputs.first; sock; sock= sock->next)
 			if(sock->intern==0) 

Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-11-11 11:06:15 UTC (rev 33004)
+++ branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-11-11 11:16:02 UTC (rev 33005)
@@ -99,6 +99,8 @@
 	short need_exec;
 	
 	short resolved;				/* adaptable socket type has been resolved */
+	int restype;				/* temporary type during updates */
+	int pad;
 	
 	void *storage;				/* custom storage */
 	

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c	2010-11-11 11:06:15 UTC (rev 33004)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodetree.c	2010-11-11 11:16:02 UTC (rev 33005)
@@ -394,6 +394,12 @@
 	return 0;
 }
 
+/* standard method of adapting socket types in a node:
+ * -find the best type from input sockets
+ * -if input sockets did not resolve types, look among outputs
+ * -set the resolved type to all adaptable sockets
+ * XXX this should take limited socket types into account.
+ */
 static void adapt_socket_types_default(bNode *node)
 {
 	bNodeSocket *sock;
@@ -403,11 +409,11 @@
 	restype = SOCK_ANY;
 	for (sock=node->inputs.first; sock; sock=sock->next) {
 		if (sock->flag & SOCK_ADAPT_TYPE) {
-//			if (!socket_types_compatible(sock->type, restype))
+//			if (!socket_types_compatible(sock->restype, restype))
 //				restype = -1;
 //			else
-			if (socket_type_priority(sock->type) > socket_type_priority(restype))
-				restype = sock->type;
+			if (socket_type_priority(sock->restype) > socket_type_priority(restype))
+				restype = sock->restype;
 			if (sock->resolved)
 				resolved = 1;
 		}
@@ -416,11 +422,11 @@
 	if (!resolved) {
 		for (sock=node->outputs.first; sock; sock=sock->next) {
 			if (sock->flag & SOCK_ADAPT_TYPE) {
-//				if (!socket_types_compatible(sock->type, restype))
+//				if (!socket_types_compatible(sock->restype, restype))
 //					restype = -1;
 //				else
-				if (socket_type_priority(sock->type) > socket_type_priority(restype))
-					restype = sock->type;
+				if (socket_type_priority(sock->restype) > socket_type_priority(restype))
+					restype = sock->restype;
 //				if (sock->resolved)		/* never happens */
 //					resolved = 1;
 			}
@@ -430,36 +436,52 @@
 	/* update types */
 	for (sock=node->inputs.first; sock; sock=sock->next)
 		if (sock->flag & SOCK_ADAPT_TYPE) {
-			sock->type = restype;
+			sock->restype = restype;
 			sock->resolved = resolved;
 		}
 	for (sock=node->outputs.first; sock; sock=sock->next)
 		if (sock->flag & SOCK_ADAPT_TYPE) {
-			sock->type = restype;
+			sock->restype = restype;
 			sock->resolved = resolved;
 		}
 }
 
-static void clear_socket_types(bNodeTree *ntree)
+/* reset the temporary socket resolution types */
+static void clear_socket_restypes(bNodeTree *ntree)
 {
 	bNode *node;
 	bNodeSocket *sock;
 	
 	for (node=ntree->nodes.first; node; node=node->next) {
 		node->updated = 0;
+		for (sock=node->inputs.first; sock; sock=sock->next) {
+			sock->restype = (sock->flag & SOCK_ADAPT_TYPE ? SOCK_ANY : sock->type);
+			sock->resolved = 0;
+		}
+		for (sock=node->outputs.first; sock; sock=sock->next) {
+			sock->restype = (sock->flag & SOCK_ADAPT_TYPE ? SOCK_ANY : sock->type);
+			sock->resolved = 0;
+		}
+	}
+}
+
+/* set the socket resolution type to be the actual type */
+static void apply_socket_restypes(bNodeTree *ntree)
+{
+	bNode *node;
+	bNodeSocket *sock;
+	
+	for (node=ntree->nodes.first; node; node=node->next) {
 		for (sock=node->inputs.first; sock; sock=sock->next)
-			if (sock->flag & SOCK_ADAPT_TYPE) {
-				sock->type = SOCK_ANY;
-				sock->resolved = 0;
-			}
+			if (sock->flag & SOCK_ADAPT_TYPE)
+				sock->type = sock->restype;
 		for (sock=node->outputs.first; sock; sock=sock->next)
-			if (sock->flag & SOCK_ADAPT_TYPE) {
-				sock->type = SOCK_ANY;
-				sock->resolved = 0;
-			}
+			if (sock->flag & SOCK_ADAPT_TYPE)
+				sock->type = sock->restype;
 	}
 }
 
+/* initialise a group trees inner socket types from the instance node */
 static void init_group_socket_types(bNode *groupnode)
 {
 	bNodeSocket *sock;
@@ -467,20 +489,21 @@
 	/* initialize internal types from outer sockets */
 	for (sock=groupnode->inputs.first; sock; sock=sock->next) {
 		if (sock->tosock && (sock->tosock->flag & SOCK_ADAPT_TYPE)) {
-			sock->tosock->type = sock->type;
+			sock->tosock->restype = sock->restype;
 			sock->tosock->resolved = sock->resolved;
 			sock->tonode->updated = 1;
 		}
 	}
 	for (sock=groupnode->outputs.first; sock; sock=sock->next) {
 		if (sock->tosock && (sock->tosock->flag & SOCK_ADAPT_TYPE)) {
-			sock->tosock->type = sock->type;
+			sock->tosock->restype = sock->restype;
 //			sock->tosock->resolved = sock->resolved;		/* output adaptation does not resolve (also internal nodes?) */
 			sock->tonode->updated = 1;
 		}
 	}
 }
 
+/* update instance node sockets after node group instance has been resolved */
 static void adapt_socket_types_group(bNode *groupnode)
 {
 	bNodeSocket *sock;
@@ -488,34 +511,34 @@
 	/* update external types from internal sockets */
 	for (sock=groupnode->inputs.first; sock; sock=sock->next) {
 		if (sock->tosock && (sock->tosock->flag & SOCK_ADAPT_TYPE)) {
-			sock->type = sock->tosock->type;
+			sock->restype = sock->tosock->restype;
 			sock->resolved = sock->tosock->resolved;
 //			if (sock->tosock->resolved) {
-//				if (!sock->resolved || socket_type_priority(sock->tosock->type) > socket_type_priority(sock->type)) {
-//					sock->type = sock->tosock->type;
+//				if (!sock->resolved || socket_type_priority(sock->tosock->restype) > socket_type_priority(sock->restype)) {
+//					sock->restype = sock->tosock->restype;
 //					sock->resolved = 1;
 //					groupnode->updated = 1;
 //				}
 //			}
-//			else if (!sock->resolved && socket_type_priority(sock->tosock->type) > socket_type_priority(sock->type)) {
-//				sock->type = sock->tosock->type;
+//			else if (!sock->resolved && socket_type_priority(sock->tosock->restype) > socket_type_priority(sock->restype)) {
+//				sock->restype = sock->tosock->restype;
 //				groupnode->updated = 1;
 //			}
 		}
 	}
 	for (sock=groupnode->outputs.first; sock; sock=sock->next) {
 		if (sock->tosock && (sock->tosock->flag & SOCK_ADAPT_TYPE)) {
-			sock->type = sock->tosock->type;
+			sock->restype = sock->tosock->restype;
 			sock->resolved = sock->tosock->resolved;
 //			if (sock->tosock->resolved) {
-//				if (!sock->resolved || socket_type_priority(sock->tosock->type) > socket_type_priority(sock->type)) {
-//					sock->type = sock->tosock->type;
+//				if (!sock->resolved || socket_type_priority(sock->tosock->restype) > socket_type_priority(sock->restype)) {
+//					sock->restype = sock->tosock->restype;
 //					sock->resolved = 1;
 //					groupnode->updated = 1;
 //				}
 //			}
-//			else if (!sock->resolved && socket_type_priority(sock->tosock->type) > socket_type_priority(sock->type)) {
-//				sock->type = sock->tosock->type;
+//			else if (!sock->resolved && socket_type_priority(sock->tosock->restype) > socket_type_priority(sock->restype)) {
+//				sock->restype = sock->tosock->restype;
 //				groupnode->updated = 1;
 //			}
 		}
@@ -546,10 +569,10 @@
 			for (sock=node->inputs.first; sock; sock=sock->next) {
 				if (sock->link && sock->link->fromsock) {
 					fromsock = sock->link->fromsock;
-					if ((sock->flag & SOCK_ADAPT_TYPE) && sock->type >= 0
+					if ((sock->flag & SOCK_ADAPT_TYPE) && sock->restype >= 0
 						&& (!sock->resolved || fromsock->resolved || !(fromsock->flag & SOCK_ADAPT_TYPE))
-						&& socket_type_priority(fromsock->type) > socket_type_priority(sock->type)) {
-						sock->type = fromsock->type;
+						&& socket_type_priority(fromsock->restype) > socket_type_priority(sock->restype)) {
+						sock->restype = fromsock->restype;
 						sock->resolved = (fromsock->resolved || !(fromsock->flag & SOCK_ADAPT_TYPE));
 						node->updated = 1;
 					}
@@ -559,7 +582,7 @@
 			if (node->updated) {
 				if (node->type == NODE_GROUP) {
 					if (node->id) {
-						clear_socket_types((bNodeTree*)node->id);
+						clear_socket_restypes((bNodeTree*)node->id);
 						init_group_socket_types(node);
 						resolve_socket_types_recursive((bNodeTree*)node->id);
 						adapt_socket_types_group(node);
@@ -581,7 +604,7 @@
 			if (node->updated) {
 				if (node->type == NODE_GROUP) {
 					if (node->id) {
-						clear_socket_types((bNodeTree*)node->id);
+						clear_socket_restypes((bNodeTree*)node->id);
 						init_group_socket_types(node);
 						resolve_socket_types_recursive((bNodeTree*)node->id);
 						adapt_socket_types_group(node);
@@ -602,10 +625,10 @@
 				if (sock->link && sock->link->fromsock) {
 					fromsock = sock->link->fromsock;
 					/* output resolution only takes place for unresolved sockets! */
-					if ((fromsock->flag & SOCK_ADAPT_TYPE) && fromsock->type >= 0
+					if ((fromsock->flag & SOCK_ADAPT_TYPE) && fromsock->restype >= 0
 						&& (!fromsock->resolved)
-						&& socket_type_priority(sock->type) > socket_type_priority(fromsock->type)) {
-						fromsock->type = sock->type;
+						&& socket_type_priority(sock->restype) > socket_type_priority(fromsock->restype)) {
+						fromsock->restype = sock->restype;
 						sock->link->fromnode->updated = 1;
 					}
 				}
@@ -625,8 +648,9 @@
 	 * The socket type resolution has to take each group node instance into account,
 	 * which may be resolved differently to other instances of the same group.
 	 */
-	clear_socket_types(ntree);
+	clear_socket_restypes(ntree);
 	resolve_socket_types_recursive(ntree);
+	apply_socket_restypes(ntree);
 	ntreeValidateLinks(ntree);
 	
 	/* update nested trees recursively */
@@ -880,8 +904,9 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list