[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