[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34844] branches/particles-2010/source/ blender: Merged in the nameable group sockets patch (patch tracker id 24883 , version 13).

Lukas Toenne lukas.toenne at googlemail.com
Mon Feb 14 13:43:31 CET 2011


Revision: 34844
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34844
Author:   lukastoenne
Date:     2011-02-14 12:43:28 +0000 (Mon, 14 Feb 2011)
Log Message:
-----------
Merged in the nameable group sockets patch (patch tracker id 24883, version 13).

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/editors/space_node/node_intern.h
    branches/particles-2010/source/blender/editors/space_node/node_ops.c
    branches/particles-2010/source/blender/editors/space_node/node_select.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/RNA_enum_types.h
    branches/particles-2010/source/blender/makesrna/intern/rna_main_api.c
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/SHD_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/TEX_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/node_exec.c
    branches/particles-2010/source/blender/nodes/intern/node_exec.h

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-02-14 11:30:35 UTC (rev 34843)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-02-14 12:43:28 UTC (rev 34844)
@@ -184,6 +184,10 @@
 	int (*verifyLink)(struct bNodeTree *ntree, struct bNodeLink *link);
 } bNodeTreeType;
 
+/* enum values for input/output */
+#define SOCK_IN		1
+#define SOCK_OUT	2
+
 /* ************** GENERIC API, TREES *************** */
 
 bNodeTreeType	*ntreeGetType(int type);
@@ -192,7 +196,6 @@
 void			ntreeInitTypes(struct bNodeTree *ntree);
 void			ntreeVerifyTypes(struct bNodeTree *ntree);
 
-void			ntreeMakeGroupSockets(struct bNodeTree *ntree);
 void			ntreeFreeTree(struct bNodeTree *ntree);
 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
 void			ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
@@ -256,7 +259,7 @@
 int				nodeDynamicUnlinkText(struct ID *txtid);
 
 void			nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
-struct bNode	*nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal);
+struct bNode	*nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
 
 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
 void			nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
@@ -292,6 +295,13 @@
 
 void			nodeCopyGroup(struct bNode *gnode);
 
+struct bNodeSocket *nodeAddGroupSocket(struct bNodeTree *ngroup, const char *name, int type, int in_out);
+struct bNodeSocket *nodeAddGroupSocketCopy(struct bNodeTree *ngroup, struct bNodeSocket *copy, int in_out);
+void			nodeAddAllGroupSockets(struct bNodeTree *ngroup);
+void			nodeRemGroupSocket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out);
+struct bNodeSocket *nodeFindGroupNodeInput(struct bNode *gnode, struct bNodeSocket *gsock);
+struct bNodeSocket *nodeFindGroupNodeOutput(struct bNode *gnode, struct bNodeSocket *gsock);
+
 /* ************** COMMON NODES *************** */
 
 /* Init a new node type struct with default values and callbacks */

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-02-14 11:30:35 UTC (rev 34843)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-02-14 12:43:28 UTC (rev 34844)
@@ -31,6 +31,8 @@
 #include <Python.h>
 #endif
 
+#include "MEM_guardedalloc.h"
+
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
@@ -62,6 +64,8 @@
 
 //#include "PIL_time.h"
 
+#include "BLI_listbase.h"
+
 #include "RNA_access.h"
 
 #include "intern/node_exec.h"
@@ -148,9 +152,15 @@
 	BLI_strncpy(sock->name, name, NODE_MAXSTR);
 	sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
 	sock->type= type;
-	sock->intern = 1;
 	sock->storage = NULL;
 	
+	zero_v4(sock->ns.vec);
+	sock->ns.min = FLT_MIN;
+	sock->ns.max = FLT_MAX;
+	sock->ns.ival = 0;
+	sock->ns.imin = INT_MIN;
+	sock->ns.imax = INT_MAX;
+	
 	return sock;
 }
 
@@ -180,33 +190,28 @@
 	return sock;
 }
 
-void nodeRemoveInputSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
+static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
 {
 	bNodeLink *link, *next;
 	
 	for(link= ntree->links.first; link; link= next) {
 		next= link->next;
-		if(link->tosock==sock) {
+		if(link->fromsock==sock || link->tosock==sock) {
 			nodeRemLink(ntree, link);
 		}
 	}
 	
-	BLI_remlink(&node->inputs, sock);
+	BLI_remlink(lb, sock);
 	MEM_freeN(sock);
 }
+
+void nodeRemoveInputSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
+{
+	node_rem_socket(ntree, &node->inputs, sock);
+}
 void nodeRemoveOutputSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
 {
-	bNodeLink *link, *next;
-	
-	for(link= ntree->links.first; link; link= next) {
-		next= link->next;
-		if(link->fromsock==sock) {
-			nodeRemLink(ntree, link);
-		}
-	}
-	
-	BLI_remlink(&node->outputs, sock);
-	MEM_freeN(sock);
+	node_rem_socket(ntree, &node->outputs, sock);
 }
 void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
 {
@@ -223,93 +228,89 @@
 	BLI_freelistN(&node->outputs);
 }
 
-static void copy_socket_properties(bNodeSocket *to, bNodeSocket *from)
+static bNodeSocket *node_add_group_socket(ListBase *lb, bNodeSocket *gsock)
 {
-	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;
+	bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+	
+	/* make a copy of the group socket */
+	*sock = *gsock;
+	sock->link = NULL;
+	sock->next = sock->prev = NULL;
+	sock->new_sock = NULL;
+	sock->ns.data = NULL;
+	
+	sock->own_index = gsock->own_index;
+	sock->groupsock = gsock;
+	/* XXX hack: group socket input/output roles are inverted internally,
+	 * need to change the limit value when making actual node sockets from them.
+	 */
+	sock->limit = (gsock->limit==1 ? 0xFFF : 1);
+	
+	if(lb)
+		BLI_addtail(lb, sock);
+	
+	return sock;
 }
 
-static bNodeSocket *verify_group_socket(ListBase *lb, bNodeGroupSocket *gsock)
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocket *gsock)
 {
-	bNodeSocket *sock = NULL;
+	bNodeSocket *sock;
 	
 	for(sock= lb->first; sock; sock= sock->next) {
-		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;
-			
-			break;
-		}
+		if(sock->own_index==gsock->own_index)
+				break;
 	}
-	return sock;
+	if(sock) {
+		sock->groupsock = gsock;
+		
+		strcpy(sock->name, gsock->name);
+		sock->type= gsock->type;
+		
+		/* XXX hack: group socket input/output roles are inverted internally,
+		 * need to change the limit value when making actual node sockets from them.
+		 */
+		sock->limit = (gsock->limit==1 ? 0xFFF : 1);
+		
+		sock->ns.min= gsock->ns.min;
+		sock->ns.max= gsock->ns.max;
+		
+		BLI_remlink(lb, sock);
+		
+		return sock;
+	}
+	else {
+		return node_add_group_socket(NULL, gsock);
+	}
 }
 
-static void verify_group_socket_list(bNodeTree *ntree, bNode *node, int in_out)
+static void verify_group_socket_list(bNodeTree *ntree, ListBase *lb, ListBase *glb)
 {
-	bNodeTree *ngroup= (bNodeTree*)node->id;
-	bNodeGroupSocket *gsock;
-	bNodeSocket *sock, *nextsock;
-	ListBase *lb = (in_out==SOCK_IN ? &node->inputs : &node->outputs);
-	bNodeGroupSocket *socklist = (in_out==SOCK_IN ? ngroup->inputs : ngroup->outputs);
+	bNodeSocket *gsock;
 	
-	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(ngroup, SOCK_IN, gsock->name, tosock->type);
-				gsock->sock->to_index = gsock->own_index;
-				gsock->sock->tonode = gsock->internnode;
-				gsock->sock->tosock = gsock->internsock;
-				copy_socket_properties(gsock->sock, tosock);
-			}
-		}
+	/* step by step compare */
+	for (gsock= glb->first; gsock; gsock=gsock->next) {
+		/* abusing new_sock pointer for verification here! only used inside this function */
+		gsock->new_sock= verify_group_socket(lb, gsock);
 	}
-		
 	/* 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);
-	}
-	
+	while(lb->first)
+		node_rem_socket(ntree, lb, lb->first);
 	/* and we put back the verified sockets */
-	if (socklist) {
-		for (gsock = socklist; gsock->internnode; ++gsock) {
-			BLI_addtail(lb, gsock->sock);
-		}
+	for (gsock= glb->first; gsock; gsock=gsock->next) {
+		BLI_addtail(lb, gsock->new_sock);
+		gsock->new_sock = NULL;
 	}
 }
 
 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);
+	/* node groups don't have static sock lists, but use external sockets from the tree instead */
+	if (node->type==NODE_GROUP) {
+		bNodeTree *ngroup= (bNodeTree*)node->id;
+		if (ngroup) {
+			verify_group_socket_list(ntree, &node->inputs, &ngroup->inputs);
+			verify_group_socket_list(ntree, &node->outputs, &ngroup->outputs);
+		}
 	}
 }
 
@@ -320,12 +321,10 @@
 	/* 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) {
+	/* check inputs and outputs, and remove or insert them */
+	for(node= ntree->nodes.first; node; node= node->next)
 		nodeVerifyType(ntree, node);
-	}
+	
 }
 
 bNodeSocketPanel *nodeFindInputPanel(bNode *node, const char *name)
@@ -462,218 +461,47 @@
 
 /* ************** Group stuff ********** */
 
-/* tag internal sockets */
-static void group_tag_internal_sockets(bNodeTree *ngroup, int auto_expose)
+/* groups display their internal tree name as label */
+static const char *group_label(bNode *node)
 {
-	bNode *node;
-	bNodeSocket *sock;
-	bNodeLink *link;
-	
-	/* 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 && !auto_expose);
-		for(sock= node->outputs.first; sock; sock= sock->next)
-			sock->intern= sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL) || (sock->intern && !auto_expose);
-	}
-	/* set tag */
-	for(link= ngroup->links.first; link; link= link->next) {
-		link->fromsock->intern= 1;
-		link->tosock->intern= 1;
-	}
-	

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list