[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35033] trunk/blender/source/blender: Big node groups improvement patch.
Lukas Toenne
lukas.toenne at googlemail.com
Mon Feb 21 14:47:49 CET 2011
Revision: 35033
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35033
Author: lukastoenne
Date: 2011-02-21 13:47:49 +0000 (Mon, 21 Feb 2011)
Log Message:
-----------
Big node groups improvement patch. Node group trees now have their own lists of input/output sockets. Those can be linked to internal nodes just like links between regular nodes. In addition group sockets can be renamed and have a defined order, which can be modified, and they can be removed again.
More details can be found in the patch tracker description (#24883) and on the code.blender.org development blog.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_blender.h
trunk/blender/source/blender/blenkernel/BKE_node.h
trunk/blender/source/blender/blenkernel/intern/node.c
trunk/blender/source/blender/blenloader/intern/readfile.c
trunk/blender/source/blender/blenloader/intern/writefile.c
trunk/blender/source/blender/editors/space_node/drawnode.c
trunk/blender/source/blender/editors/space_node/node_draw.c
trunk/blender/source/blender/editors/space_node/node_edit.c
trunk/blender/source/blender/editors/space_node/node_intern.h
trunk/blender/source/blender/editors/space_node/node_ops.c
trunk/blender/source/blender/editors/space_node/node_select.c
trunk/blender/source/blender/makesdna/DNA_node_types.h
trunk/blender/source/blender/makesrna/RNA_enum_types.h
trunk/blender/source/blender/makesrna/intern/rna_main_api.c
trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h 2011-02-21 13:13:08 UTC (rev 35032)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h 2011-02-21 13:47:49 UTC (rev 35033)
@@ -44,7 +44,7 @@
* and keep comment above the defines.
* Use STRINGIFY() rather then defining with quotes */
#define BLENDER_VERSION 256
-#define BLENDER_SUBVERSION 1
+#define BLENDER_SUBVERSION 2
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h 2011-02-21 13:13:08 UTC (rev 35032)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h 2011-02-21 13:47:49 UTC (rev 35033)
@@ -71,9 +71,6 @@
/* after this line is used internal only */
struct bNodeSocket *sock; /* used during verify_types */
- struct bNodeSocket *internsock; /* group nodes, the internal socket counterpart */
- int own_index; /* verify group nodes */
-
} bNodeSocketType;
typedef struct bNodeType {
@@ -130,6 +127,10 @@
#define NODE_CLASS_PATTERN 12
#define NODE_CLASS_TEXTURE 13
+/* enum values for input/output */
+#define SOCK_IN 1
+#define SOCK_OUT 2
+
/* ************** GENERIC API, TREES *************** */
void ntreeVerifyTypes(struct bNodeTree *ntree);
@@ -137,7 +138,7 @@
struct bNodeTree *ntreeAddTree(const char *name, int type, const short is_group);
void ntreeInitTypes(struct bNodeTree *ntree);
-void ntreeMakeOwnType(struct bNodeTree *ntree);
+//void ntreeMakeGroupSockets(struct bNodeTree *ntree);
void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
void ntreeFreeTree(struct bNodeTree *ntree);
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
@@ -178,7 +179,7 @@
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);
+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);
@@ -210,6 +211,11 @@
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);
+
/* ************** COMMON NODES *************** */
/* Init a new node type struct with default values and callbacks */
Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c 2011-02-21 13:13:08 UTC (rev 35032)
+++ trunk/blender/source/blender/blenkernel/intern/node.c 2011-02-21 13:47:49 UTC (rev 35033)
@@ -31,13 +31,18 @@
#include <Python.h>
#endif
+#include "MEM_guardedalloc.h"
+
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include "DNA_anim_types.h"
#include "DNA_action_types.h"
+#include "DNA_node_types.h"
+#include "BLI_listbase.h"
+
#include "RNA_access.h"
#include "BKE_animsys.h"
@@ -45,6 +50,7 @@
#include "BKE_fcurve.h"
#include "BKE_node.h"
#include "BKE_utildefines.h"
+#include "BKE_node.h"
#include "PIL_time.h"
@@ -64,22 +70,14 @@
/* ************** Type stuff ********** */
-static bNodeType *node_get_type(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
+static bNodeType *node_get_type(bNodeTree *ntree, int type, ID *id)
{
- if(type==NODE_GROUP) {
- if(ngroup && GS(ngroup->id.name)==ID_NT) {
- return ngroup->owntype;
- }
- return NULL;
- }
- else {
- bNodeType *ntype = ntree->alltypes.first;
- for(; ntype; ntype= ntype->next)
- if(ntype->type==type && id==ntype->id )
- return ntype;
-
- return NULL;
- }
+ bNodeType *ntype = ntree->alltypes.first;
+ for(; ntype; ntype= ntype->next)
+ if(ntype->type==type && id==ntype->id )
+ return ntype;
+
+ return NULL;
}
void ntreeInitTypes(bNodeTree *ntree)
@@ -102,11 +100,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 {
@@ -118,7 +116,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) {
@@ -152,9 +150,6 @@
else sock->limit= stype->limit;
sock->type= stype->type;
- sock->to_index= stype->own_index;
- sock->tosock= stype->internsock;
-
sock->ns.vec[0]= stype->val1;
sock->ns.vec[1]= stype->val2;
sock->ns.vec[2]= stype->val3;
@@ -168,6 +163,30 @@
return sock;
}
+static bNodeSocket *node_add_group_socket(ListBase *lb, bNodeSocket *gsock)
+{
+ 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 void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
{
bNodeLink *link, *next;
@@ -188,18 +207,16 @@
bNodeSocket *sock;
for(sock= lb->first; sock; sock= sock->next) {
- /* both indices are zero for non-groups, otherwise it's a unique index */
- if(sock->to_index==stype->own_index)
- if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0)
- break;
+ if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0)
+ break;
}
if(sock) {
sock->type= stype->type; /* in future, read this from tydefs! */
if(stype->limit==0) sock->limit= 0xFFF;
else sock->limit= stype->limit;
+
sock->ns.min= stype->min;
sock->ns.max= stype->max;
- sock->tosock= stype->internsock;
BLI_remlink(lb, sock);
@@ -210,6 +227,37 @@
}
}
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+
+ for(sock= lb->first; sock; sock= sock->next) {
+ if(sock->own_index==gsock->own_index)
+ break;
+ }
+ 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_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first)
{
bNodeSocketType *stype;
@@ -238,18 +286,44 @@
}
}
-void nodeVerifyType(bNodeTree *ntree, bNode *node)
+static void verify_group_socket_list(bNodeTree *ntree, ListBase *lb, ListBase *glb)
{
- bNodeType *ntype= node->typeinfo;
+ bNodeSocket *gsock;
- if(ntype) {
- /* might add some other verify stuff here */
-
- verify_socket_list(ntree, &node->inputs, ntype->inputs);
- verify_socket_list(ntree, &node->outputs, ntype->outputs);
+ /* 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 */
+ while(lb->first)
+ node_rem_socket(ntree, lb, lb->first);
+ /* and we put back the verified sockets */
+ for (gsock= glb->first; gsock; gsock=gsock->next) {
+ BLI_addtail(lb, gsock->new_sock);
+ gsock->new_sock = NULL;
+ }
}
+void nodeVerifyType(bNodeTree *ntree, bNode *node)
+{
+ /* 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);
+ }
+ }
+ else {
+ bNodeType *ntype= node->typeinfo;
+ if(ntype) {
+ verify_socket_list(ntree, &node->inputs, ntype->inputs);
+ verify_socket_list(ntree, &node->outputs, ntype->outputs);
+ }
+ }
+}
+
void ntreeVerifyTypes(bNodeTree *ntree)
{
bNode *node;
@@ -283,176 +357,20 @@
nodeRegisterType(lb, &ntype_group);
}
-/* tag internal sockets */
-static void group_tag_internal_sockets(bNodeTree *ngroup)
+static bNodeSocket *find_group_node_input(bNode *gnode, bNodeSocket *gsock)
{
- 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;
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->intern= sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL);
- }
- /* set tag */
- for(link= ngroup->links.first; link; link= link->next) {
- link->fromsock->intern= 1;
- link->tosock->intern= 1;
- }
-
- /* remove link pointer to external links (only happens on create group) */
- for(node= ngroup->nodes.first; node; node= node->next) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list