[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33305] branches/particles-2010/source/ blender: Ported patch 24883 from trunk.

Lukas Toenne lukas.toenne at googlemail.com
Thu Nov 25 13:09:37 CET 2010


Revision: 33305
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33305
Author:   lukastoenne
Date:     2010-11-25 13:09:37 +0100 (Thu, 25 Nov 2010)

Log Message:
-----------
Ported patch 24883 from trunk. This adds the ability to rename group node sockets and allows the explicit selection of exposed sockets (by dragging a link out of the group node box in edit mode). See the patch notes on the tracker for more details.

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/blenloader/intern/readfile.c
    branches/particles-2010/source/blender/blenloader/intern/writefile.c
    branches/particles-2010/source/blender/editors/space_node/drawnode.c
    branches/particles-2010/source/blender/editors/space_node/node_draw.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/intern/SIM_nodetree.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-11-25 11:38:55 UTC (rev 33304)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-11-25 12:09:37 UTC (rev 33305)
@@ -87,10 +87,6 @@
 	
 	/* 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 {
@@ -212,7 +208,7 @@
 void			ntreeInitTypes(struct bNodeTree *ntree);
 void			ntreeVerifyTypes(struct bNodeTree *ntree);
 
-void			ntreeMakeOwnType(struct bNodeTree *ntree);
+void			ntreeMakeGroupSockets(struct bNodeTree *ntree);
 void			ntreeFreeTree(struct bNodeTree *ntree);
 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
 void			ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
@@ -246,7 +242,7 @@
 
 /* ************** GENERIC API, NODES *************** */
 
-//void			nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
+void			nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
 
 void			nodeAddToPreview(struct bNode *, float *, int, int);
 

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-11-25 11:38:55 UTC (rev 33304)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-11-25 12:09:37 UTC (rev 33305)
@@ -104,22 +104,14 @@
 	}
 }
 
-static bNodeType *node_get_type(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
-{
-	if(type==NODE_GROUP) {
-		if(ngroup && GS(ngroup->id.name)==ID_NT) {
-			return ngroup->owntype;
-		}
-		return NULL;
-	}
-	else {
-		bNodeType *ntype = ntreeGetTypeInfo(ntree->type)->node_types.first;
-		for(; ntype; ntype= ntype->next)
-			if(ntype->type==type && id==ntype->id )
-				return ntype;
-		
-		return NULL;
-	}
+static bNodeType *node_get_type(bNodeTree *ntree, int type, ID *id)
+ {
+	bNodeType *ntype = ntreeGetTypeInfo(ntree->type)->node_types.first;
+	for(; ntype; ntype= ntype->next)
+		if(ntype->type==type && id==ntype->id )
+			return ntype;
+	
+	return NULL;
 }
 
 void ntreeInitTypes(bNodeTree *ntree)
@@ -131,11 +123,11 @@
 		if(node->type==NODE_DYNAMIC) {
 			bNodeType *stype= NULL;
 			if(node->id==NULL) { /* empty script node */
-				stype= node_get_type(ntree, node->type, NULL, NULL);
+				stype= node_get_type(ntree, node->type, NULL);
 			} else { /* not an empty script node */
-				stype= node_get_type(ntree, node->type, NULL, node->id);
+				stype= node_get_type(ntree, node->type, node->id);
 				if(!stype) {
-					stype= node_get_type(ntree, node->type, NULL, NULL);
+					stype= node_get_type(ntree, node->type, NULL);
 					/* needed info if the pynode script fails now: */
 					if (node->id) node->storage= ntree;
 				} else {
@@ -147,7 +139,7 @@
 			if(node->typeinfo)
 				node->typeinfo->initfunc(node);
 		} else {
-			node->typeinfo= node_get_type(ntree, node->type, (bNodeTree *)node->id, NULL);
+			node->typeinfo= node_get_type(ntree, node->type, NULL);
 		}
 
 		if(node->typeinfo==NULL) {
@@ -172,10 +164,6 @@
 	sock->flag |= SOCK_ADAPT_CONTEXT;
 	sock->storage = NULL;
 	
-	sock->to_index= 0;
-	sock->tonode= NULL;
-	sock->tosock= NULL;
-	
 	copy_v4_v4(sock->ns.vec, default_value);
 	sock->ns.min= min;
 	sock->ns.max= max;
@@ -272,20 +260,39 @@
 	BLI_freelistN(&node->outputs);
 }
 
-static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocketDefinition *stype)
+static void copy_socket_properties(bNodeSocket *to, bNodeSocket *from)
 {
+	to->type= from->type;
+	to->limit= from->limit;
+	to->ns.min= from->ns.min;
+	to->ns.max= from->ns.max;
+	to->ns.imin= from->ns.imin;
+	to->ns.imax= from->ns.imax;
+}
+
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeGroupSocket *gsock)
+{
 	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;
+		if(sock->to_index==gsock->own_index) {
+			BLI_strncpy(sock->name, gsock->name, NODE_MAXSTR);
+			sock->to_index= gsock->own_index;
+			sock->tonode= gsock->internnode;
+			sock->tosock= gsock->internsock;
+			sock->intern = 1;
 			
+			copy_socket_properties(sock, sock->tosock);
+			
+			/* initialise the default socket value */
+			sock->ns.vec[0]= sock->tosock->ns.vec[0];
+			sock->ns.vec[1]= sock->tosock->ns.vec[1];
+			sock->ns.vec[2]= sock->tosock->ns.vec[2];
+			sock->ns.vec[3]= sock->tosock->ns.vec[3];
+			sock->ns.ival= sock->tosock->ns.ival;
+			copy_m4_m4(sock->default_matrix, sock->tosock->default_matrix);
+			strcpy(sock->default_string, sock->tosock->default_string);
+			
 			break;
 		}
 	}
@@ -294,33 +301,32 @@
 
 static void verify_group_socket_list(bNodeTree *ntree, bNode *node, int in_out)
 {
-	bNodeSocketDefinition *sdef;
+	bNodeTree *ngroup= (bNodeTree*)node->id;
+	bNodeGroupSocket *gsock;
 	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);
+	bNodeGroupSocket *socklist = (in_out==SOCK_IN ? ngroup->inputs : ngroup->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;
+	if (socklist) {
+		/* step by step compare */
+		for (gsock = socklist; gsock->internnode; ++gsock) {
+			bNodeSocket *tosock= gsock->internsock;
+			gsock->sock = verify_group_socket(lb, gsock);
+			if (gsock->sock) {
+				/* exclude from socket list to avoid deletion */
+				BLI_remlink(lb, gsock->sock);
+			}
+			else {
+				/* create a new socket */
+				gsock->sock = make_socket(SOCK_IN, node->typeinfo, gsock->name, tosock->type, tosock->ns.vec, tosock->ns.min, tosock->ns.max);
+				gsock->sock->to_index = gsock->own_index;
+				gsock->sock->tonode = gsock->internnode;
+				gsock->sock->tosock = gsock->internsock;
+				copy_socket_properties(gsock->sock, tosock);
+			}
 		}
-		sdef++;
 	}
-	
+		
 	/* leftovers are removed */
 	for (sock=lb->first; sock; sock=nextsock) {
 		nextsock = sock->next;
@@ -331,13 +337,21 @@
 	}
 	
 	/* and we put back the verified sockets */
-	sdef = deflist;
-	while(sdef->type != -1) {
-		BLI_addtail(lb, sdef->sock);
-		sdef++;
+	if (socklist) {
+		for (gsock = socklist; gsock->internnode; ++gsock) {
+			BLI_addtail(lb, gsock->sock);
+		}
 	}
 }
 
+void nodeVerifyType(bNodeTree *ntree, bNode *node)
+{
+	if(node->type == NODE_GROUP) {
+		verify_group_socket_list(ntree, node, SOCK_IN);
+		verify_group_socket_list(ntree, node, SOCK_OUT);
+	}
+}
+
 void ntreeVerifyTypes(bNodeTree *ntree)
 {
 	bNode *node;
@@ -349,10 +363,7 @@
 	 * 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);
-		}
+		nodeVerifyType(ntree, node);
 	}
 }
 
@@ -491,7 +502,7 @@
 /* ************** Group stuff ********** */
 
 /* tag internal sockets */
-static void group_tag_internal_sockets(bNodeTree *ngroup)
+static void group_tag_internal_sockets(bNodeTree *ngroup, int auto_expose)
 {
 	bNode *node;
 	bNodeSocket *sock;
@@ -500,9 +511,9 @@
 	/* clear intern tag, but check already for hidden sockets */
 	for(node= ngroup->nodes.first; node; node= node->next) {
 		for(sock= node->inputs.first; sock; sock= sock->next)
-			sock->intern= sock->flag & SOCK_HIDDEN;
+			sock->intern= (sock->flag & SOCK_HIDDEN) || (sock->intern && !auto_expose);
 		for(sock= node->outputs.first; sock; sock= sock->next)
-			sock->intern= sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL);
+			sock->intern= sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL) || (sock->intern && !auto_expose);
 	}
 	/* set tag */
 	for(link= ngroup->links.first; link; link= link->next) {
@@ -566,86 +577,6 @@
 	return NULL;
 }
 
-static void groupnode_verify_sockets(bNodeTree *ntree, bNode *group)
-{
-	bNodeTree *ngroup = (bNodeTree*)group->id;
-	bNode *node;
-	bNodeSocket *sock, *gsock;
-	
-	/* tags socket when internal linked */
-	group_tag_internal_sockets(ngroup);
-	
-	/* ensure all sockets have own unique id */
-	group_verify_own_indices(ngroup);
-	
-	/* first clear all the pointers to internal nodes, we reset them later */
-	for (gsock= group->inputs.first; gsock; gsock = gsock->next) {
-		gsock->tonode = NULL;
-		gsock->tosock = NULL;
-	}
-	for (gsock= group->outputs.first; gsock; gsock = gsock->next) {
-		gsock->tonode = NULL;
-		gsock->tosock = NULL;
-	}
-	
-	/* now find all existing group sockets for the internal nodes, add new ones if they don't exist */
-	for (node= ngroup->nodes.first; node; node= node->next) {
-		for (sock= node->inputs.first; sock; sock= sock->next) {
-			if(sock->intern==0) {
-				gsock = groupnode_find_input(group, sock->own_index);
-				
-				/* create new group socket if none exists */
-				if (gsock == NULL) {
-					gsock = nodeAddInputSocket(group, sock->name, sock->type, sock->ns.vec, sock->ns.min, sock->ns.max);
-				}
-				
-				/* link to the internal socket */
-				gsock->tonode = node;
-				gsock->tosock = sock;
-			}
-		}
-		for (sock= node->outputs.first; sock; sock= sock->next) {
-			if(sock->intern==0) {
-				gsock = groupnode_find_output(group, sock->own_index);
-				
-				/* create new group socket if none exists */
-				if (gsock == NULL) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list