[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33305] branches/particles-2010/source/ blender: Ported patch 24883 from trunk.
Lukas Toenne
lukas.toenne at googlemail.com
Thu Nov 25 13:09:37 CET 2010
Revision: 33305
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33305
Author: lukastoenne
Date: 2010-11-25 13:09:37 +0100 (Thu, 25 Nov 2010)
Log Message:
-----------
Ported patch 24883 from trunk. This adds the ability to rename group node sockets and allows the explicit selection of exposed sockets (by dragging a link out of the group node box in edit mode). See the patch notes on the tracker for more details.
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/nodes/intern/SIM_nodetree.c
Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h 2010-11-25 11:38:55 UTC (rev 33304)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h 2010-11-25 12:09:37 UTC (rev 33305)
@@ -87,10 +87,6 @@
/* 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 {
@@ -212,7 +208,7 @@
void ntreeInitTypes(struct bNodeTree *ntree);
void ntreeVerifyTypes(struct bNodeTree *ntree);
-void ntreeMakeOwnType(struct bNodeTree *ntree);
+void ntreeMakeGroupSockets(struct bNodeTree *ntree);
void ntreeFreeTree(struct bNodeTree *ntree);
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
@@ -246,7 +242,7 @@
/* ************** GENERIC API, NODES *************** */
-//void nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
+void nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
void nodeAddToPreview(struct bNode *, float *, int, int);
Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c 2010-11-25 11:38:55 UTC (rev 33304)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c 2010-11-25 12:09:37 UTC (rev 33305)
@@ -104,22 +104,14 @@
}
}
-static bNodeType *node_get_type(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
-{
- if(type==NODE_GROUP) {
- if(ngroup && GS(ngroup->id.name)==ID_NT) {
- return ngroup->owntype;
- }
- return NULL;
- }
- else {
- bNodeType *ntype = ntreeGetTypeInfo(ntree->type)->node_types.first;
- for(; ntype; ntype= ntype->next)
- if(ntype->type==type && id==ntype->id )
- return ntype;
-
- return NULL;
- }
+static bNodeType *node_get_type(bNodeTree *ntree, int type, ID *id)
+ {
+ bNodeType *ntype = ntreeGetTypeInfo(ntree->type)->node_types.first;
+ for(; ntype; ntype= ntype->next)
+ if(ntype->type==type && id==ntype->id )
+ return ntype;
+
+ return NULL;
}
void ntreeInitTypes(bNodeTree *ntree)
@@ -131,11 +123,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 {
@@ -147,7 +139,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) {
@@ -172,10 +164,6 @@
sock->flag |= SOCK_ADAPT_CONTEXT;
sock->storage = NULL;
- sock->to_index= 0;
- sock->tonode= NULL;
- sock->tosock= NULL;
-
copy_v4_v4(sock->ns.vec, default_value);
sock->ns.min= min;
sock->ns.max= max;
@@ -272,20 +260,39 @@
BLI_freelistN(&node->outputs);
}
-static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocketDefinition *stype)
+static void copy_socket_properties(bNodeSocket *to, bNodeSocket *from)
{
+ 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;
+}
+
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeGroupSocket *gsock)
+{
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;
+ 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;
+ copy_m4_m4(sock->default_matrix, sock->tosock->default_matrix);
+ strcpy(sock->default_string, sock->tosock->default_string);
+
break;
}
}
@@ -294,33 +301,32 @@
static void verify_group_socket_list(bNodeTree *ntree, bNode *node, int in_out)
{
- bNodeSocketDefinition *sdef;
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ bNodeGroupSocket *gsock;
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);
+ bNodeGroupSocket *socklist = (in_out==SOCK_IN ? ngroup->inputs : ngroup->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;
+ 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(SOCK_IN, node->typeinfo, gsock->name, tosock->type, tosock->ns.vec, tosock->ns.min, tosock->ns.max);
+ gsock->sock->to_index = gsock->own_index;
+ gsock->sock->tonode = gsock->internnode;
+ gsock->sock->tosock = gsock->internsock;
+ copy_socket_properties(gsock->sock, tosock);
+ }
}
- sdef++;
}
-
+
/* leftovers are removed */
for (sock=lb->first; sock; sock=nextsock) {
nextsock = sock->next;
@@ -331,13 +337,21 @@
}
/* and we put back the verified sockets */
- sdef = deflist;
- while(sdef->type != -1) {
- BLI_addtail(lb, sdef->sock);
- sdef++;
+ if (socklist) {
+ for (gsock = socklist; gsock->internnode; ++gsock) {
+ BLI_addtail(lb, gsock->sock);
+ }
}
}
+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);
+ }
+}
+
void ntreeVerifyTypes(bNodeTree *ntree)
{
bNode *node;
@@ -349,10 +363,7 @@
* 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);
- }
+ nodeVerifyType(ntree, node);
}
}
@@ -491,7 +502,7 @@
/* ************** Group stuff ********** */
/* tag internal sockets */
-static void group_tag_internal_sockets(bNodeTree *ngroup)
+static void group_tag_internal_sockets(bNodeTree *ngroup, int auto_expose)
{
bNode *node;
bNodeSocket *sock;
@@ -500,9 +511,9 @@
/* 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= (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= sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL) || (sock->intern && !auto_expose);
}
/* set tag */
for(link= ngroup->links.first; link; link= link->next) {
@@ -566,86 +577,6 @@
return NULL;
}
-static void groupnode_verify_sockets(bNodeTree *ntree, bNode *group)
-{
- bNodeTree *ngroup = (bNodeTree*)group->id;
- bNode *node;
- bNodeSocket *sock, *gsock;
-
- /* tags socket when internal linked */
- group_tag_internal_sockets(ngroup);
-
- /* ensure all sockets have own unique id */
- group_verify_own_indices(ngroup);
-
- /* first clear all the pointers to internal nodes, we reset them later */
- for (gsock= group->inputs.first; gsock; gsock = gsock->next) {
- gsock->tonode = NULL;
- gsock->tosock = NULL;
- }
- for (gsock= group->outputs.first; gsock; gsock = gsock->next) {
- gsock->tonode = NULL;
- gsock->tosock = NULL;
- }
-
- /* now find all existing group sockets for the internal nodes, add new ones if they don't exist */
- for (node= ngroup->nodes.first; node; node= node->next) {
- for (sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->intern==0) {
- gsock = groupnode_find_input(group, sock->own_index);
-
- /* create new group socket if none exists */
- if (gsock == NULL) {
- gsock = nodeAddInputSocket(group, sock->name, sock->type, sock->ns.vec, sock->ns.min, sock->ns.max);
- }
-
- /* link to the internal socket */
- gsock->tonode = node;
- gsock->tosock = sock;
- }
- }
- for (sock= node->outputs.first; sock; sock= sock->next) {
- if(sock->intern==0) {
- gsock = groupnode_find_output(group, sock->own_index);
-
- /* create new group socket if none exists */
- if (gsock == NULL) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list