[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34844] branches/particles-2010/source/ blender: Merged in the nameable group sockets patch (patch tracker id 24883 , version 13).
Lukas Toenne
lukas.toenne at googlemail.com
Mon Feb 14 13:43:31 CET 2011
Revision: 34844
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34844
Author: lukastoenne
Date: 2011-02-14 12:43:28 +0000 (Mon, 14 Feb 2011)
Log Message:
-----------
Merged in the nameable group sockets patch (patch tracker id 24883, version 13).
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/editors/space_node/node_intern.h
branches/particles-2010/source/blender/editors/space_node/node_ops.c
branches/particles-2010/source/blender/editors/space_node/node_select.c
branches/particles-2010/source/blender/makesdna/DNA_node_types.h
branches/particles-2010/source/blender/makesrna/RNA_enum_types.h
branches/particles-2010/source/blender/makesrna/intern/rna_main_api.c
branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c
branches/particles-2010/source/blender/nodes/intern/SHD_nodetree.c
branches/particles-2010/source/blender/nodes/intern/TEX_nodetree.c
branches/particles-2010/source/blender/nodes/intern/node_exec.c
branches/particles-2010/source/blender/nodes/intern/node_exec.h
Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h 2011-02-14 11:30:35 UTC (rev 34843)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h 2011-02-14 12:43:28 UTC (rev 34844)
@@ -184,6 +184,10 @@
int (*verifyLink)(struct bNodeTree *ntree, struct bNodeLink *link);
} bNodeTreeType;
+/* enum values for input/output */
+#define SOCK_IN 1
+#define SOCK_OUT 2
+
/* ************** GENERIC API, TREES *************** */
bNodeTreeType *ntreeGetType(int type);
@@ -192,7 +196,6 @@
void ntreeInitTypes(struct bNodeTree *ntree);
void ntreeVerifyTypes(struct bNodeTree *ntree);
-void ntreeMakeGroupSockets(struct bNodeTree *ntree);
void ntreeFreeTree(struct bNodeTree *ntree);
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
@@ -256,7 +259,7 @@
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);
@@ -292,6 +295,13 @@
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);
+struct bNodeSocket *nodeFindGroupNodeInput(struct bNode *gnode, struct bNodeSocket *gsock);
+struct bNodeSocket *nodeFindGroupNodeOutput(struct bNode *gnode, struct bNodeSocket *gsock);
+
/* ************** COMMON NODES *************** */
/* Init a new node type struct with default values and callbacks */
Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c 2011-02-14 11:30:35 UTC (rev 34843)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c 2011-02-14 12:43:28 UTC (rev 34844)
@@ -31,6 +31,8 @@
#include <Python.h>
#endif
+#include "MEM_guardedalloc.h"
+
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
@@ -62,6 +64,8 @@
//#include "PIL_time.h"
+#include "BLI_listbase.h"
+
#include "RNA_access.h"
#include "intern/node_exec.h"
@@ -148,9 +152,15 @@
BLI_strncpy(sock->name, name, NODE_MAXSTR);
sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
sock->type= type;
- sock->intern = 1;
sock->storage = NULL;
+ zero_v4(sock->ns.vec);
+ sock->ns.min = FLT_MIN;
+ sock->ns.max = FLT_MAX;
+ sock->ns.ival = 0;
+ sock->ns.imin = INT_MIN;
+ sock->ns.imax = INT_MAX;
+
return sock;
}
@@ -180,33 +190,28 @@
return sock;
}
-void nodeRemoveInputSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
+static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
{
bNodeLink *link, *next;
for(link= ntree->links.first; link; link= next) {
next= link->next;
- if(link->tosock==sock) {
+ if(link->fromsock==sock || link->tosock==sock) {
nodeRemLink(ntree, link);
}
}
- BLI_remlink(&node->inputs, sock);
+ BLI_remlink(lb, sock);
MEM_freeN(sock);
}
+
+void nodeRemoveInputSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
+{
+ node_rem_socket(ntree, &node->inputs, sock);
+}
void nodeRemoveOutputSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
{
- bNodeLink *link, *next;
-
- for(link= ntree->links.first; link; link= next) {
- next= link->next;
- if(link->fromsock==sock) {
- nodeRemLink(ntree, link);
- }
- }
-
- BLI_remlink(&node->outputs, sock);
- MEM_freeN(sock);
+ node_rem_socket(ntree, &node->outputs, sock);
}
void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
{
@@ -223,93 +228,89 @@
BLI_freelistN(&node->outputs);
}
-static void copy_socket_properties(bNodeSocket *to, bNodeSocket *from)
+static bNodeSocket *node_add_group_socket(ListBase *lb, bNodeSocket *gsock)
{
- 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;
+ 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 bNodeSocket *verify_group_socket(ListBase *lb, bNodeGroupSocket *gsock)
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocket *gsock)
{
- bNodeSocket *sock = NULL;
+ bNodeSocket *sock;
for(sock= lb->first; sock; sock= sock->next) {
- 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;
-
- break;
- }
+ if(sock->own_index==gsock->own_index)
+ break;
}
- return sock;
+ 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_group_socket_list(bNodeTree *ntree, bNode *node, int in_out)
+static void verify_group_socket_list(bNodeTree *ntree, ListBase *lb, ListBase *glb)
{
- bNodeTree *ngroup= (bNodeTree*)node->id;
- bNodeGroupSocket *gsock;
- bNodeSocket *sock, *nextsock;
- ListBase *lb = (in_out==SOCK_IN ? &node->inputs : &node->outputs);
- bNodeGroupSocket *socklist = (in_out==SOCK_IN ? ngroup->inputs : ngroup->outputs);
+ bNodeSocket *gsock;
- 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(ngroup, SOCK_IN, gsock->name, tosock->type);
- gsock->sock->to_index = gsock->own_index;
- gsock->sock->tonode = gsock->internnode;
- gsock->sock->tosock = gsock->internsock;
- copy_socket_properties(gsock->sock, tosock);
- }
- }
+ /* 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 */
- for (sock=lb->first; sock; sock=nextsock) {
- nextsock = sock->next;
- if (in_out==SOCK_IN)
- nodeRemoveInputSocket(ntree, node, sock);
- else
- nodeRemoveOutputSocket(ntree, node, sock);
- }
-
+ while(lb->first)
+ node_rem_socket(ntree, lb, lb->first);
/* and we put back the verified sockets */
- if (socklist) {
- for (gsock = socklist; gsock->internnode; ++gsock) {
- BLI_addtail(lb, gsock->sock);
- }
+ for (gsock= glb->first; gsock; gsock=gsock->next) {
+ BLI_addtail(lb, gsock->new_sock);
+ gsock->new_sock = NULL;
}
}
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);
+ /* 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);
+ }
}
}
@@ -320,12 +321,10 @@
/* 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) {
+ /* check inputs and outputs, and remove or insert them */
+ for(node= ntree->nodes.first; node; node= node->next)
nodeVerifyType(ntree, node);
- }
+
}
bNodeSocketPanel *nodeFindInputPanel(bNode *node, const char *name)
@@ -462,218 +461,47 @@
/* ************** Group stuff ********** */
-/* tag internal sockets */
-static void group_tag_internal_sockets(bNodeTree *ngroup, int auto_expose)
+/* groups display their internal tree name as label */
+static const char *group_label(bNode *node)
{
- 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) || (sock->intern && !auto_expose);
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->intern= sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL) || (sock->intern && !auto_expose);
- }
- /* set tag */
- for(link= ngroup->links.first; link; link= link->next) {
- link->fromsock->intern= 1;
- link->tosock->intern= 1;
- }
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list