[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32010] branches/particles-2010/source/ blender: Implemented node socket panels, which are a way of grouping sockets collapsible blocks.

Lukas Toenne lukas.toenne at googlemail.com
Sun Sep 19 15:06:25 CEST 2010


Revision: 32010
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32010
Author:   lukastoenne
Date:     2010-09-19 15:06:25 +0200 (Sun, 19 Sep 2010)

Log Message:
-----------
Implemented node socket panels, which are a way of grouping sockets collapsible blocks. Could be useful for complex nodes with lots of sockets.

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/makesrna/RNA_access.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-09-19 12:19:58 UTC (rev 32009)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-09-19 13:06:25 UTC (rev 32010)
@@ -47,6 +47,7 @@
 struct bNodeSocket;
 struct bNodeStack;
 struct bNodeTree;
+struct bNodeSocketPanel;
 struct bNodeSocketIsland;
 struct GPUMaterial;
 struct GPUNode;
@@ -238,12 +239,23 @@
 void			nodeRemoveInputSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
 void			nodeRemoveOutputSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
 void			nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
+
+struct bNodeSocketPanel *nodeFindInputPanel(struct bNode *node, const char *name);
+struct bNodeSocketPanel *nodeFindOutputPanel(struct bNode *node, const char *name);
+struct bNodeSocketPanel *nodeAddInputPanel(struct bNode *node, const char *name, void *storage);
+struct bNodeSocketPanel *nodeAddOutputPanel(struct bNode *node, const char *name, void *storage);
+void			nodeRemoveInputPanel(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketPanel *panel, int remove_sockets);
+void			nodeRemoveOutputPanel(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketPanel *panel, int remove_sockets);
+void			nodeAssignInputPanel(struct bNode *node, struct bNodeSocket *socket, struct bNodeSocketPanel *panel);
+void			nodeAssignOutputPanel(struct bNode *node, struct bNodeSocket *socket, struct bNodeSocketPanel *panel);
+
 void			nodeAddSocketsFromType(struct bNode *node, struct bNodeType *ntype);
 struct bNode	*nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup, struct ID *id);
 void			nodeRegisterType(struct ListBase *typelist, const struct bNodeType *ntype) ;
 void			nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeType *ntype);
 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);
 
@@ -253,7 +265,9 @@
 
 struct bNode	*nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
 int			nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
+int				nodeFindNodeByPanel(struct bNodeTree *ntree, struct bNodeSocketPanel *panel, struct bNode **nodep, int *panelindex);
 
+
 struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
 int				nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
 

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-09-19 12:19:58 UTC (rev 32009)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-09-19 13:06:25 UTC (rev 32010)
@@ -260,6 +260,138 @@
 	BLI_freelistN(&node->outputs);
 }
 
+bNodeSocketPanel *nodeFindInputPanel(bNode *node, const char *name)
+{
+	bNodeSocketPanel *panel= node->inpanels.first;
+	for (; panel; panel = panel->next) {
+		if (strcmp(panel->name, name)==0)
+			return panel;
+	}
+	return NULL;
+}
+
+bNodeSocketPanel *nodeFindOutputPanel(bNode *node, const char *name)
+{
+	bNodeSocketPanel *panel= node->outpanels.first;
+	for (; panel; panel = panel->next) {
+		if (strcmp(panel->name, name)==0)
+			return panel;
+	}
+	return NULL;
+}
+
+bNodeSocketPanel *nodeAddInputPanel(bNode *node, const char *name, void *storage)
+{
+	bNodeSocketPanel *panel= nodeFindInputPanel(node, name);
+	if (panel)
+		return panel;
+	panel = MEM_callocN(sizeof(bNodeSocketPanel), "node socket panel");
+	strcpy(panel->name, name);
+	panel->collapsed = 0;
+	panel->storage = storage;
+	
+	BLI_addtail(&node->inpanels, panel);
+	return panel;
+}
+
+bNodeSocketPanel *nodeAddOutputPanel(bNode *node, const char *name, void *storage)
+{
+	bNodeSocketPanel *panel= nodeFindOutputPanel(node, name);
+	if (panel)
+		return panel;
+	panel = MEM_callocN(sizeof(bNodeSocketPanel), "node socket panel");
+	strcpy(panel->name, name);
+	panel->collapsed = 0;
+	panel->storage = storage;
+	
+	BLI_addtail(&node->outpanels, panel);
+	return panel;
+}
+
+void nodeRemoveInputPanel(bNodeTree *ntree, bNode *node, bNodeSocketPanel *panel, int remove_sockets)
+{
+	bNodeSocket *sock = node->inputs.first;
+	if (remove_sockets) {
+		for (; sock; sock = sock->next)
+			nodeRemoveInputSocket(ntree, node, sock);
+	}
+	else {
+		for (; sock; sock = sock->next)
+			sock->panel = NULL;
+	}
+	
+	BLI_remlink(&node->inpanels, panel);
+	if (panel->storage)
+		MEM_freeN(panel->storage);
+	MEM_freeN(panel);
+}
+
+void nodeRemoveOutputPanel(bNodeTree *ntree, bNode *node, bNodeSocketPanel *panel, int remove_sockets)
+{
+	bNodeSocket *sock = node->outputs.first;
+	if (remove_sockets) {
+		for (; sock; sock = sock->next)
+			nodeRemoveOutputSocket(ntree, node, sock);
+	}
+	else {
+		for (; sock; sock = sock->next)
+			sock->panel = NULL;
+	}
+	
+	BLI_remlink(&node->outpanels, panel);
+	if (panel->storage)
+		MEM_freeN(panel->storage);
+	MEM_freeN(panel);
+}
+
+void nodeAssignInputPanel(bNode *node, bNodeSocket *socket, bNodeSocketPanel *panel)
+{
+	bNodeSocket *list;
+	if (socket->panel == panel)
+		return;
+	
+	/* make sure the socket is inside the panel block (also moves NULL panel out of blocks) */
+	list = socket->prev;
+	while (list && list->panel != panel) list = list->prev;
+	if (list && list != socket->prev) {
+		BLI_remlink(&node->inputs, socket);
+		BLI_insertlinkafter(&node->inputs, list, socket);
+	}
+	else {
+		list = socket->next;
+		while (list && list->panel != panel) list = list->next;
+		if (list && list != socket->next) {
+			BLI_remlink(&node->inputs, socket);
+			BLI_insertlinkbefore(&node->inputs, list, socket);
+		}
+	}
+	socket->panel = panel;
+}
+
+void nodeAssignOutputPanel(bNode *node, bNodeSocket *socket, bNodeSocketPanel *panel)
+{
+	bNodeSocket *list;
+	if (socket->panel == panel)
+		return;
+	
+	/* make sure the socket is inside the panel block (also moves NULL panel out of blocks) */
+	list = socket->prev;
+	while (list && list->panel != panel) list = list->prev;
+	if (list && list != socket->prev) {
+		BLI_remlink(&node->outputs, socket);
+		BLI_insertlinkafter(&node->outputs, list, socket);
+	}
+	else {
+		list = socket->next;
+		while (list && list->panel != panel) list = list->next;
+		if (list && list != socket->next) {
+			BLI_remlink(&node->outputs, socket);
+			BLI_insertlinkbefore(&node->outputs, list, socket);
+		}
+	}
+	socket->panel = panel;
+}
+
 /* ************** Group stuff ********** */
 
 /* tag internal sockets */
@@ -686,6 +818,36 @@
 	return 0;
 }
 
+int nodeFindNodeByPanel(bNodeTree *ntree, bNodeSocketPanel *panel, bNode **nodep, int *panelindex)
+{
+	bNode *node;
+	bNodeSocketPanel *tpanel;
+	int index= 0;
+	
+	for(node= ntree->nodes.first; node; node= node->next) {
+		for(index=0, tpanel= node->inpanels.first; tpanel; tpanel= tpanel->next, index++)
+			if(tpanel==panel)
+				break;
+		if(tpanel)
+			break;
+		for(index=0, tpanel= node->outputs.first; tpanel; tpanel= tpanel->next, index++)
+			if(tpanel==panel)
+				break;
+		if(tpanel)
+			break;
+	}
+	
+	if(node) {
+		*nodep= node;
+		if (panelindex)
+			*panelindex = index;
+		return 1;
+	}
+	
+	*nodep= NULL;
+	return 0;
+}
+
 /* returns 1 if its OK */
 int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
 {
@@ -1218,6 +1380,7 @@
 {
 	bNodeTreeTypeInfo *treetype= ntreeGetTypeInfo(ntree->type);
 	bNodeSocket *sock, *nextsock;
+	bNodeSocketPanel *panel, *nextpanel;
 	
 	nodeUnlinkNode(ntree, node);
 	BLI_remlink(&ntree->nodes, node);
@@ -1241,6 +1404,19 @@
 		MEM_freeN(sock);
 	}
 
+	for (panel=node->inpanels.first; panel; panel = nextpanel) {
+		nextpanel = panel->next;
+		if (panel->storage)
+			MEM_freeN(panel->storage);
+		MEM_freeN(panel);
+	}
+	for (panel=node->outpanels.first; panel; panel = nextpanel) {
+		nextpanel = panel->next;
+		if (panel->storage)
+			MEM_freeN(panel->storage);
+		MEM_freeN(panel);
+	}
+
 	nodeFreePreview(node);
 
 	if(node->typeinfo && node->typeinfo->freestoragefunc) {

Modified: branches/particles-2010/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/readfile.c	2010-09-19 12:19:58 UTC (rev 32009)
+++ branches/particles-2010/source/blender/blenloader/intern/readfile.c	2010-09-19 13:06:25 UTC (rev 32010)
@@ -2152,7 +2152,6 @@
 		
 		node->storage= newdataadr(fd, node->storage);
 		if(node->storage) {
-			
 			/* could be handlerized at some point */
 			if(ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))
 				direct_link_curvemapping(fd, node->storage);
@@ -2170,8 +2169,12 @@
 					direct_link_node_rna_data(fd, ntree, node);
 			}
 		}
+		
 		link_list(fd, &node->inputs);
 		link_list(fd, &node->outputs);
+		
+		link_list(fd, &node->inpanels);
+		link_list(fd, &node->outpanels);
 	}
 	link_list(fd, &ntree->links);
 	
@@ -2182,10 +2185,12 @@
 		for(sock= node->inputs.first; sock; sock= sock->next) {
 			sock->link= newdataadr(fd, sock->link);
 			sock->storage= newdataadr(fd, sock->storage);
+			sock->panel= newdataadr(fd, sock->panel);
 		}
 		for(sock= node->outputs.first; sock; sock= sock->next) {
 			sock->ns.data= NULL;
 			sock->storage= newdataadr(fd, sock->storage);
+			sock->panel= newdataadr(fd, sock->panel);
 		}
 
 		if (node->type==SIM_NODE_GETDATA || node->type==SIM_NODE_SETDATA)

Modified: branches/particles-2010/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-09-19 12:19:58 UTC (rev 32009)
+++ branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-09-19 13:06:25 UTC (rev 32010)
@@ -481,6 +481,7 @@
 {
 	bNode *node;
 	bNodeSocket *sock;
+	bNodeSocketPanel *panel;
 	bNodeLink *link;
 	
 	/* for link_list() speed, we write per list */
@@ -506,6 +507,7 @@
 			else 
 				writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
 		}
+		
 		for(sock= node->inputs.first; sock; sock= sock->next) {
 			writestruct(wd, DATA, "bNodeSocket", 1, sock);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list