[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32945] branches/particles-2010/source/ blender: Added back socket verification for group nodes.
Lukas Toenne
lukas.toenne at googlemail.com
Mon Nov 8 14:01:32 CET 2010
Revision: 32945
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32945
Author: lukastoenne
Date: 2010-11-08 14:01:32 +0100 (Mon, 08 Nov 2010)
Log Message:
-----------
Added back socket verification for group nodes. This is needed because group node changes are actually affecting all nodes of this "type".
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/editors/space_node/node_edit.c
branches/particles-2010/source/blender/makesdna/DNA_node_types.h
branches/particles-2010/source/blender/nodes/SConscript
Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h 2010-11-08 11:19:53 UTC (rev 32944)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h 2010-11-08 13:01:32 UTC (rev 32945)
@@ -81,9 +81,16 @@
typedef struct bNodeSocketDefinition {
int type, limit;
- char *name;
+ char name[32];
float val1, val2, val3, val4; /* default alloc value for inputs */
float min, max; /* default range for inputs */
+
+ /* 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 {
Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c 2010-11-08 11:19:53 UTC (rev 32944)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c 2010-11-08 13:01:32 UTC (rev 32945)
@@ -159,24 +159,12 @@
ntree->init |= NTREE_TYPE_INIT;
}
-void ntreeVerifyTypes(bNodeTree *ntree)
+static bNodeSocket *make_socket(int in_out, bNodeType *ntype, const char *name, int type, float *default_value, float min, float max)
{
-// bNode *node;
-
- /* if((ntree->init & NTREE_TYPE_INIT)==0) */
- ntreeInitTypes(ntree);
-
- /* check inputs and outputs, and remove or insert them */
-// for(node= ntree->nodes.first; node; node= node->next)
-// nodeVerifyType(ntree, node);
-}
-
-static bNodeSocket *make_socket(int is_input, const char *name, int type, float *default_value, float min, float max)
-{
bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
BLI_strncpy(sock->name, name, NODE_MAXSTR);
- sock->limit = (is_input ? 1 : 0xFFF);
+ sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
sock->type= type;
sock->intern = 1;
if (type == SOCK_ANY)
@@ -195,40 +183,35 @@
sock->ns.imin = (int)min;
sock->ns.imax = (int)max;
+ if (ntype->initsocketfunc)
+ ntype->initsocketfunc(sock);
+
return sock;
}
bNodeSocket *nodeAddInputSocket(bNode *node, const char *name, int type, float *default_value, float min, float max)
{
- bNodeSocket *sock = make_socket(1, name, type, default_value, min, max);
+ bNodeSocket *sock = make_socket(SOCK_IN, node->typeinfo, name, type, default_value, min, max);
BLI_addtail(&node->inputs, sock);
- if (node->typeinfo->initsocketfunc)
- node->typeinfo->initsocketfunc(sock);
return sock;
}
bNodeSocket *nodeAddOutputSocket(bNode *node, const char *name, int type, float *default_value, float min, float max)
{
- bNodeSocket *sock = make_socket(0, name, type, default_value, min, max);
+ bNodeSocket *sock = make_socket(SOCK_OUT, node->typeinfo, name, type, default_value, min, max);
BLI_addtail(&node->outputs, sock);
- if (node->typeinfo->initsocketfunc)
- node->typeinfo->initsocketfunc(sock);
return sock;
}
bNodeSocket *nodeInsertInputSocket(bNode *node, bNodeSocket *next_sock, const char *name, int type, float *default_value, float min, float max)
{
- bNodeSocket *sock = make_socket(1, name, type, default_value, min, max);
+ bNodeSocket *sock = make_socket(SOCK_IN, node->typeinfo, name, type, default_value, min, max);
BLI_insertlinkbefore(&node->inputs, next_sock, sock);
- if (node->typeinfo->initsocketfunc)
- node->typeinfo->initsocketfunc(sock);
return sock;
}
bNodeSocket *nodeInsertOutputSocket(bNode *node, bNodeSocket *next_sock, const char *name, int type, float *default_value, float min, float max)
{
- bNodeSocket *sock = make_socket(0, name, type, default_value, min, max);
+ bNodeSocket *sock = make_socket(SOCK_OUT, node->typeinfo, name, type, default_value, min, max);
BLI_insertlinkbefore(&node->outputs, next_sock, sock);
- if (node->typeinfo->initsocketfunc)
- node->typeinfo->initsocketfunc(sock);
return sock;
}
@@ -289,6 +272,90 @@
BLI_freelistN(&node->outputs);
}
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocketDefinition *stype)
+{
+ 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;
+
+ break;
+ }
+ }
+ return sock;
+}
+
+static void verify_group_socket_list(bNodeTree *ntree, bNode *node, int in_out)
+{
+ bNodeSocketDefinition *sdef;
+ 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);
+
+ 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;
+ }
+ sdef++;
+ }
+
+ /* 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);
+ }
+
+ /* and we put back the verified sockets */
+ sdef = deflist;
+ while(sdef->type != -1) {
+ BLI_addtail(lb, sdef->sock);
+ sdef++;
+ }
+}
+
+void ntreeVerifyTypes(bNodeTree *ntree)
+{
+ bNode *node;
+
+ /* 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) {
+ if(node->type == NODE_GROUP) {
+ verify_group_socket_list(ntree, node, SOCK_IN);
+ verify_group_socket_list(ntree, node, SOCK_OUT);
+ }
+ }
+}
+
bNodeSocketPanel *nodeFindInputPanel(bNode *node, const char *name)
{
bNodeSocketPanel *panel= node->inpanels.first;
@@ -600,6 +667,8 @@
void ntreeMakeOwnType(bNodeTree *ngroup)
{
bNode *node;
+ bNodeSocket *sock;
+ int totin, totout;
/* counting stats */
for(node= ngroup->nodes.first; node; node= node->next) {
@@ -624,6 +693,76 @@
/* make own type struct */
ngroup->owntype= MEM_callocN(sizeof(bNodeType), "group type");
*ngroup->owntype= node_group_typeinfo; /* copy data, for init */
+
+ /* counting stats */
+ for(node= ngroup->nodes.first; node; node= node->next) {
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ if(sock->intern==0)
+ totin++;
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ if(sock->intern==0)
+ totout++;
+ }
+ /* input socket array */
+ if(totin) {
+ bNodeSocketDefinition *def;
+ bNodeSocketDefinition *inputs= MEM_callocN(sizeof(bNodeSocketDefinition)*(totin+1), "bNodeSocketDefinition");
+
+ def = inputs;
+ for(node= ngroup->nodes.first; node; node= node->next) {
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->intern==0) {
+ strcpy(def->name, sock->name);
+ def->type = sock->type;
+ def->limit = sock->limit;
+ def->own_index= sock->own_index;
+ def->internnode= node;
+ def->internsock= sock;
+
+ def->val1 = sock->ns.vec[0];
+ def->val2 = sock->ns.vec[1];
+ def->val3 = sock->ns.vec[2];
+ def->val4 = sock->ns.vec[3];
+ def->min = sock->ns.min;
+ def->max = sock->ns.max;
+
+ ++def;
+ }
+ }
+ }
+ def->type= -1; /* terminator code */
+ ngroup->owntype->inputs= inputs;
+ }
+ /* output socket array */
+ if(totout) {
+ bNodeSocketDefinition *def;
+ bNodeSocketDefinition *outputs= MEM_callocN(sizeof(bNodeSocketDefinition)*(totout+1), "bNodeSocketDefinition");
+
+ def = outputs;
+ for(node= ngroup->nodes.first; node; node= node->next) {
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(sock->intern==0) {
+ strcpy(def->name, sock->name);
+ def->type = sock->type;
+ def->limit = sock->limit;
+ def->own_index= sock->own_index;
+ def->internnode= node;
+ def->internsock= sock;
+
+ def->val1 = sock->ns.vec[0];
+ def->val2 = sock->ns.vec[1];
+ def->val3 = sock->ns.vec[2];
+ def->val4 = sock->ns.vec[3];
+ def->min = sock->ns.min;
+ def->max = sock->ns.max;
+
+ ++def;
+ }
+ }
+ }
+ def->type= -1; /* terminator code */
+ ngroup->owntype->outputs= outputs;
+ }
}
bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
@@ -988,6 +1127,9 @@
default_value[2] = sockdef->val3;
default_value[3] = sockdef->val4;
sock = nodeAddInputSocket(node, sockdef->name, sockdef->type, default_value, sockdef->min, sockdef->max);
+ sock->to_index = sockdef->own_index;
+ sock->tonode = sockdef->internnode;
+ sock->tosock = sockdef->internsock;
sockdef++;
}
}
@@ -999,6 +1141,9 @@
default_value[2] = sockdef->val3;
default_value[3] = sockdef->val4;
sock = nodeAddOutputSocket(node, sockdef->name, sockdef->type, default_value, sockdef->min, sockdef->max);
+ sock->to_index = sockdef->own_index;
+ sock->tonode = sockdef->internnode;
+ sock->tosock = sockdef->internsock;
sockdef++;
}
}
Modified: branches/particles-2010/source/blender/editors/space_node/node_edit.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/node_edit.c 2010-11-08 11:19:53 UTC (rev 32944)
+++ branches/particles-2010/source/blender/editors/space_node/node_edit.c 2010-11-08 13:01:32 UTC (rev 32945)
@@ -80,9 +80,6 @@
#include "node_intern.h"
-#define SOCK_IN 1
-#define SOCK_OUT 2
-
/* ***************** composite job manager ********************** */
typedef struct CompoJob {
Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list