[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35033] trunk/blender/source/blender: Big node groups improvement patch.

Lukas Toenne lukas.toenne at googlemail.com
Mon Feb 21 14:47:49 CET 2011


Revision: 35033
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35033
Author:   lukastoenne
Date:     2011-02-21 13:47:49 +0000 (Mon, 21 Feb 2011)
Log Message:
-----------
Big node groups improvement patch. Node group trees now have their own lists of input/output sockets. Those can be linked to internal nodes just like links between regular nodes. In addition group sockets can be renamed and have a defined order, which can be modified, and they can be removed again.
More details can be found in the patch tracker description (#24883) and on the code.blender.org development blog.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_intern.h
    trunk/blender/source/blender/editors/space_node/node_ops.c
    trunk/blender/source/blender/editors/space_node/node_select.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesrna/RNA_enum_types.h
    trunk/blender/source/blender/makesrna/intern/rna_main_api.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2011-02-21 13:13:08 UTC (rev 35032)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2011-02-21 13:47:49 UTC (rev 35033)
@@ -44,7 +44,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather then defining with quotes */
 #define BLENDER_VERSION			256
-#define BLENDER_SUBVERSION		1
+#define BLENDER_SUBVERSION		2
 
 #define BLENDER_MINVERSION		250
 #define BLENDER_MINSUBVERSION	0

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2011-02-21 13:13:08 UTC (rev 35032)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2011-02-21 13:47:49 UTC (rev 35033)
@@ -71,9 +71,6 @@
 	
 	/* after this line is used internal only */
 	struct bNodeSocket *sock;		/* used during verify_types */
-	struct bNodeSocket *internsock;	/* group nodes, the internal socket counterpart */
-	int own_index;					/* verify group nodes */
-	
 } bNodeSocketType;
 
 typedef struct bNodeType {
@@ -130,6 +127,10 @@
 #define NODE_CLASS_PATTERN 12
 #define NODE_CLASS_TEXTURE 13
 
+/* enum values for input/output */
+#define SOCK_IN		1
+#define SOCK_OUT	2
+
 /* ************** GENERIC API, TREES *************** */
 
 void			ntreeVerifyTypes(struct bNodeTree *ntree);
@@ -137,7 +138,7 @@
 struct bNodeTree *ntreeAddTree(const char *name, int type, const short is_group);
 void			ntreeInitTypes(struct bNodeTree *ntree);
 
-void			ntreeMakeOwnType(struct bNodeTree *ntree);
+//void			ntreeMakeGroupSockets(struct bNodeTree *ntree);
 void			ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
 void			ntreeFreeTree(struct bNodeTree *ntree);
 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
@@ -178,7 +179,7 @@
 void			nodeMakeDynamicType(struct bNode *node);
 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);
@@ -210,6 +211,11 @@
 
 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);
+
 /* ************** COMMON NODES *************** */
 
 /* Init a new node type struct with default values and callbacks */

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2011-02-21 13:13:08 UTC (rev 35032)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2011-02-21 13:47:49 UTC (rev 35033)
@@ -31,13 +31,18 @@
 #include <Python.h>
 #endif
 
+#include "MEM_guardedalloc.h"
+
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
 
 #include "DNA_anim_types.h"
 #include "DNA_action_types.h"
+#include "DNA_node_types.h"
 
+#include "BLI_listbase.h"
+
 #include "RNA_access.h"
 
 #include "BKE_animsys.h"
@@ -45,6 +50,7 @@
 #include "BKE_fcurve.h"
 #include "BKE_node.h"
 #include "BKE_utildefines.h"
+#include "BKE_node.h"
 
 #include "PIL_time.h"
 
@@ -64,22 +70,14 @@
 
 /* ************** Type stuff **********  */
 
-static bNodeType *node_get_type(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
+static bNodeType *node_get_type(bNodeTree *ntree, int type, ID *id)
 {
-	if(type==NODE_GROUP) {
-		if(ngroup && GS(ngroup->id.name)==ID_NT) {
-			return ngroup->owntype;
-		}
-		return NULL;
-	}
-	else {
-		bNodeType *ntype = ntree->alltypes.first;
-		for(; ntype; ntype= ntype->next)
-			if(ntype->type==type && id==ntype->id )
-				return ntype;
-		
-		return NULL;
-	}
+	bNodeType *ntype = ntree->alltypes.first;
+	for(; ntype; ntype= ntype->next)
+		if(ntype->type==type && id==ntype->id )
+			return ntype;
+	
+	return NULL;
 }
 
 void ntreeInitTypes(bNodeTree *ntree)
@@ -102,11 +100,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 {
@@ -118,7 +116,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) {
@@ -152,9 +150,6 @@
 	else sock->limit= stype->limit;
 	sock->type= stype->type;
 	
-	sock->to_index= stype->own_index;
-	sock->tosock= stype->internsock;
-	
 	sock->ns.vec[0]= stype->val1;
 	sock->ns.vec[1]= stype->val2;
 	sock->ns.vec[2]= stype->val3;
@@ -168,6 +163,30 @@
 	return sock;
 }
 
+static bNodeSocket *node_add_group_socket(ListBase *lb, bNodeSocket *gsock)
+{
+	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 void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
 {
 	bNodeLink *link, *next;
@@ -188,18 +207,16 @@
 	bNodeSocket *sock;
 	
 	for(sock= lb->first; sock; sock= sock->next) {
-		/* both indices are zero for non-groups, otherwise it's a unique index */
-		if(sock->to_index==stype->own_index)
-			if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0)
-				break;
+		if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0)
+			break;
 	}
 	if(sock) {
 		sock->type= stype->type;		/* in future, read this from tydefs! */
 		if(stype->limit==0) sock->limit= 0xFFF;
 		else sock->limit= stype->limit;
+		
 		sock->ns.min= stype->min;
 		sock->ns.max= stype->max;
-		sock->tosock= stype->internsock;
 		
 		BLI_remlink(lb, sock);
 		
@@ -210,6 +227,37 @@
 	}
 }
 
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocket *gsock)
+{
+	bNodeSocket *sock;
+	
+	for(sock= lb->first; sock; sock= sock->next) {
+		if(sock->own_index==gsock->own_index)
+				break;
+	}
+	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_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first)
 {
 	bNodeSocketType *stype;
@@ -238,18 +286,44 @@
 	}
 }
 
-void nodeVerifyType(bNodeTree *ntree, bNode *node)
+static void verify_group_socket_list(bNodeTree *ntree, ListBase *lb, ListBase *glb)
 {
-	bNodeType *ntype= node->typeinfo;
+	bNodeSocket *gsock;
 	
-	if(ntype) {
-		/* might add some other verify stuff here */
-		
-		verify_socket_list(ntree, &node->inputs, ntype->inputs);
-		verify_socket_list(ntree, &node->outputs, ntype->outputs);
+	/* 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 */
+	while(lb->first)
+		node_rem_socket(ntree, lb, lb->first);
+	/* and we put back the verified sockets */
+	for (gsock= glb->first; gsock; gsock=gsock->next) {
+		BLI_addtail(lb, gsock->new_sock);
+		gsock->new_sock = NULL;
+	}
 }
 
+void nodeVerifyType(bNodeTree *ntree, bNode *node)
+{
+	/* 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);
+		}
+	}
+	else {
+		bNodeType *ntype= node->typeinfo;
+		if(ntype) {
+			verify_socket_list(ntree, &node->inputs, ntype->inputs);
+			verify_socket_list(ntree, &node->outputs, ntype->outputs);
+		}
+	}
+}
+
 void ntreeVerifyTypes(bNodeTree *ntree)
 {
 	bNode *node;
@@ -283,176 +357,20 @@
 	nodeRegisterType(lb, &ntype_group);
 }
 
-/* tag internal sockets */
-static void group_tag_internal_sockets(bNodeTree *ngroup)
+static bNodeSocket *find_group_node_input(bNode *gnode, bNodeSocket *gsock)
 {
-	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;
-		for(sock= node->outputs.first; sock; sock= sock->next)
-			sock->intern= sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL);
-	}
-	/* set tag */
-	for(link= ngroup->links.first; link; link= link->next) {
-		link->fromsock->intern= 1;
-		link->tosock->intern= 1;
-	}
-	
-	/* remove link pointer to external links (only happens on create group) */
-	for(node= ngroup->nodes.first; node; node= node->next) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list