[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32945] branches/particles-2010/source/ blender: Added back socket verification for group nodes.

Lukas Toenne lukas.toenne at googlemail.com
Mon Nov 8 14:01:32 CET 2010


Revision: 32945
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32945
Author:   lukastoenne
Date:     2010-11-08 14:01:32 +0100 (Mon, 08 Nov 2010)

Log Message:
-----------
Added back socket verification for group nodes. This is needed because group node changes are actually affecting all nodes of this "type".

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/editors/space_node/node_edit.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/nodes/SConscript

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-11-08 11:19:53 UTC (rev 32944)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-11-08 13:01:32 UTC (rev 32945)
@@ -81,9 +81,16 @@
 
 typedef struct bNodeSocketDefinition {
 	int type, limit;
-	char *name;
+	char name[32];
 	float val1, val2, val3, val4;	/* default alloc value for inputs */
 	float min, max;					/* default range for inputs */
+	
+	/* after this line is used internal only */
+	struct bNodeSocket *sock;		/* used to hold verified socket */
+	/* group nodes, the internal socket counterpart */
+	struct bNode *internnode;
+	struct bNodeSocket *internsock;
+	int own_index;					/* verify group nodes */
 } bNodeSocketDefinition;
 
 typedef struct bNodeType {

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-11-08 11:19:53 UTC (rev 32944)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-11-08 13:01:32 UTC (rev 32945)
@@ -159,24 +159,12 @@
 	ntree->init |= NTREE_TYPE_INIT;
 }
 
-void ntreeVerifyTypes(bNodeTree *ntree)
+static bNodeSocket *make_socket(int in_out, bNodeType *ntype, const char *name, int type, float *default_value, float min, float max)
 {
-//	bNode *node;
-	
-	/* if((ntree->init & NTREE_TYPE_INIT)==0) */
-	ntreeInitTypes(ntree);
-
-	/* check inputs and outputs, and remove or insert them */
-//	for(node= ntree->nodes.first; node; node= node->next)
-//		nodeVerifyType(ntree, node);
-}
-
-static bNodeSocket *make_socket(int is_input, const char *name, int type, float *default_value, float min, float max)
-{
 	bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
 	
 	BLI_strncpy(sock->name, name, NODE_MAXSTR);
-	sock->limit = (is_input ? 1 : 0xFFF);
+	sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
 	sock->type= type;
 	sock->intern = 1;
 	if (type == SOCK_ANY)
@@ -195,40 +183,35 @@
 	sock->ns.imin = (int)min;
 	sock->ns.imax = (int)max;
 	
+	if (ntype->initsocketfunc)
+		ntype->initsocketfunc(sock);
+	
 	return sock;
 }
 
 bNodeSocket *nodeAddInputSocket(bNode *node, const char *name, int type, float *default_value, float min, float max)
 {
-	bNodeSocket *sock = make_socket(1, name, type, default_value, min, max);
+	bNodeSocket *sock = make_socket(SOCK_IN, node->typeinfo, name, type, default_value, min, max);
 	BLI_addtail(&node->inputs, sock);
-	if (node->typeinfo->initsocketfunc)
-		node->typeinfo->initsocketfunc(sock);
 	return sock;
 }
 bNodeSocket *nodeAddOutputSocket(bNode *node, const char *name, int type, float *default_value, float min, float max)
 {
-	bNodeSocket *sock = make_socket(0, name, type, default_value, min, max);
+	bNodeSocket *sock = make_socket(SOCK_OUT, node->typeinfo, name, type, default_value, min, max);
 	BLI_addtail(&node->outputs, sock);
-	if (node->typeinfo->initsocketfunc)
-		node->typeinfo->initsocketfunc(sock);
 	return sock;
 }
 
 bNodeSocket *nodeInsertInputSocket(bNode *node, bNodeSocket *next_sock, const char *name, int type, float *default_value, float min, float max)
 {
-	bNodeSocket *sock = make_socket(1, name, type, default_value, min, max);
+	bNodeSocket *sock = make_socket(SOCK_IN, node->typeinfo, name, type, default_value, min, max);
 	BLI_insertlinkbefore(&node->inputs, next_sock, sock);
-	if (node->typeinfo->initsocketfunc)
-		node->typeinfo->initsocketfunc(sock);
 	return sock;
 }
 bNodeSocket *nodeInsertOutputSocket(bNode *node, bNodeSocket *next_sock, const char *name, int type, float *default_value, float min, float max)
 {
-	bNodeSocket *sock = make_socket(0, name, type, default_value, min, max);
+	bNodeSocket *sock = make_socket(SOCK_OUT, node->typeinfo, name, type, default_value, min, max);
 	BLI_insertlinkbefore(&node->outputs, next_sock, sock);
-	if (node->typeinfo->initsocketfunc)
-		node->typeinfo->initsocketfunc(sock);
 	return sock;
 }
 
@@ -289,6 +272,90 @@
 	BLI_freelistN(&node->outputs);
 }
 
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocketDefinition *stype)
+{
+	bNodeSocket *sock = NULL;
+	
+	for(sock= lb->first; sock; sock= sock->next) {
+		if(sock->to_index==stype->own_index) {
+			sock->type= stype->type;
+			if(stype->limit==0) sock->limit= 0xFFF;
+			else sock->limit= stype->limit;
+//			sock->ns.min= stype->min;
+//			sock->ns.max= stype->max;
+			sock->tonode= stype->internnode;
+			sock->tosock= stype->internsock;
+			
+			break;
+		}
+	}
+	return sock;
+}
+
+static void verify_group_socket_list(bNodeTree *ntree, bNode *node, int in_out)
+{
+	bNodeSocketDefinition *sdef;
+	bNodeSocket *sock, *nextsock;
+	ListBase *lb = (in_out==SOCK_IN ? &node->inputs : &node->outputs);
+	bNodeSocketDefinition *deflist = (in_out==SOCK_IN ? node->typeinfo->inputs : node->typeinfo->outputs);
+	
+	sdef = deflist;
+	/* step by step compare */
+	while(sdef->type != -1) {
+		sdef->sock = verify_group_socket(lb, sdef);
+		if (sdef->sock)
+			/* exclude from socket list to avoid deletion */
+			BLI_remlink(lb, sdef->sock);
+		else {
+			/* create a new socket */
+			float defaultval[4];
+			defaultval[0] = sdef->val1;
+			defaultval[1] = sdef->val2;
+			defaultval[2] = sdef->val3;
+			defaultval[3] = sdef->val4;
+			sdef->sock = make_socket(SOCK_IN, node->typeinfo, sdef->name, sdef->type, defaultval, sdef->min, sdef->max);
+			sdef->sock->to_index = sdef->own_index;
+			sdef->sock->tonode = sdef->internnode;
+			sdef->sock->tosock = sdef->internsock;
+		}
+		sdef++;
+	}
+	
+	/* leftovers are removed */
+	for (sock=lb->first; sock; sock=nextsock) {
+		nextsock = sock->next;
+		if (in_out==SOCK_IN)
+			nodeRemoveInputSocket(ntree, node, sock);
+		else
+			nodeRemoveOutputSocket(ntree, node, sock);
+	}
+	
+	/* and we put back the verified sockets */
+	sdef = deflist;
+	while(sdef->type != -1) {
+		BLI_addtail(lb, sdef->sock);
+		sdef++;
+	}
+}
+
+void ntreeVerifyTypes(bNodeTree *ntree)
+{
+	bNode *node;
+	
+	/* if((ntree->init & NTREE_TYPE_INIT)==0) */
+	ntreeInitTypes(ntree);
+
+	/* For group nodes: update the socket lists based on
+	 * the definition lists in the groups own type struct.
+	 */
+	for(node= ntree->nodes.first; node; node= node->next) {
+		if(node->type == NODE_GROUP) {
+			verify_group_socket_list(ntree, node, SOCK_IN);
+			verify_group_socket_list(ntree, node, SOCK_OUT);
+		}
+	}
+}
+
 bNodeSocketPanel *nodeFindInputPanel(bNode *node, const char *name)
 {
 	bNodeSocketPanel *panel= node->inpanels.first;
@@ -600,6 +667,8 @@
 void ntreeMakeOwnType(bNodeTree *ngroup)
 {
 	bNode *node;
+	bNodeSocket *sock;
+	int totin, totout;
 
 	/* counting stats */
 	for(node= ngroup->nodes.first; node; node= node->next) {
@@ -624,6 +693,76 @@
 	/* make own type struct */
 	ngroup->owntype= MEM_callocN(sizeof(bNodeType), "group type");
 	*ngroup->owntype= node_group_typeinfo; /* copy data, for init */
+	
+	/* counting stats */
+	for(node= ngroup->nodes.first; node; node= node->next) {
+		for(sock= node->inputs.first; sock; sock= sock->next)
+			if(sock->intern==0) 
+				totin++;
+		for(sock= node->outputs.first; sock; sock= sock->next)
+			if(sock->intern==0) 
+				totout++;
+	}
+	/* input socket array */
+	if(totin) {
+		bNodeSocketDefinition *def;
+		bNodeSocketDefinition *inputs= MEM_callocN(sizeof(bNodeSocketDefinition)*(totin+1), "bNodeSocketDefinition");
+		
+		def = inputs;
+		for(node= ngroup->nodes.first; node; node= node->next) {
+			for(sock= node->inputs.first; sock; sock= sock->next) {
+				if(sock->intern==0) {
+					strcpy(def->name, sock->name);
+					def->type = sock->type;
+					def->limit = sock->limit;
+					def->own_index= sock->own_index;
+					def->internnode= node;
+					def->internsock= sock;	
+					
+					def->val1 = sock->ns.vec[0];
+					def->val2 = sock->ns.vec[1];
+					def->val3 = sock->ns.vec[2];
+					def->val4 = sock->ns.vec[3];
+					def->min = sock->ns.min;
+					def->max = sock->ns.max;
+					
+					++def;
+				}
+			}
+		}
+		def->type= -1;	/* terminator code */
+		ngroup->owntype->inputs= inputs;
+	}
+	/* output socket array */
+	if(totout) {
+		bNodeSocketDefinition *def;
+		bNodeSocketDefinition *outputs= MEM_callocN(sizeof(bNodeSocketDefinition)*(totout+1), "bNodeSocketDefinition");
+		
+		def = outputs;
+		for(node= ngroup->nodes.first; node; node= node->next) {
+			for(sock= node->outputs.first; sock; sock= sock->next) {
+				if(sock->intern==0) {
+					strcpy(def->name, sock->name);
+					def->type = sock->type;
+					def->limit = sock->limit;
+					def->own_index= sock->own_index;
+					def->internnode= node;
+					def->internsock= sock;	
+					
+					def->val1 = sock->ns.vec[0];
+					def->val2 = sock->ns.vec[1];
+					def->val3 = sock->ns.vec[2];
+					def->val4 = sock->ns.vec[3];
+					def->min = sock->ns.min;
+					def->max = sock->ns.max;
+					
+					++def;
+				}
+			}
+		}
+		def->type= -1;	/* terminator code */
+		ngroup->owntype->outputs= outputs;
+	}
 }
 
 bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
@@ -988,6 +1127,9 @@
 			default_value[2] = sockdef->val3;
 			default_value[3] = sockdef->val4;
 			sock = nodeAddInputSocket(node, sockdef->name, sockdef->type, default_value, sockdef->min, sockdef->max);
+			sock->to_index = sockdef->own_index;
+			sock->tonode = sockdef->internnode;
+			sock->tosock = sockdef->internsock;
 			sockdef++;
 		}
 	}
@@ -999,6 +1141,9 @@
 			default_value[2] = sockdef->val3;
 			default_value[3] = sockdef->val4;
 			sock = nodeAddOutputSocket(node, sockdef->name, sockdef->type, default_value, sockdef->min, sockdef->max);
+			sock->to_index = sockdef->own_index;
+			sock->tonode = sockdef->internnode;
+			sock->tosock = sockdef->internsock;
 			sockdef++;
 		}
 	}

Modified: branches/particles-2010/source/blender/editors/space_node/node_edit.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/node_edit.c	2010-11-08 11:19:53 UTC (rev 32944)
+++ branches/particles-2010/source/blender/editors/space_node/node_edit.c	2010-11-08 13:01:32 UTC (rev 32945)
@@ -80,9 +80,6 @@
 
 #include "node_intern.h"
 
-#define SOCK_IN		1
-#define SOCK_OUT	2
-
 /* ***************** composite job manager ********************** */
 
 typedef struct CompoJob {

Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list