[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35751] branches/particles-2010/source/ blender: New node type 'Frame' with several other improvements.

Lukas Toenne lukas.toenne at googlemail.com
Thu Mar 24 14:15:11 CET 2011


Revision: 35751
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35751
Author:   lukastoenne
Date:     2011-03-24 13:15:11 +0000 (Thu, 24 Mar 2011)
Log Message:
-----------
New node type 'Frame' with several other improvements.
The Frame node type can be used to group nodes in the same tree, unlike the Group type, which uses a separate node tree. Several new features have been implemented for this to work:
* Stable Z order: instead of sorting nodes by their link dependencies and artificially drawing selected nodes first, the order in the nodetree->nodes list is now by definition the Z order of nodes. Selecting nodes will move them to the end of the list (i.e. the top), while still maintaining their relative order. The relative order of all other nodes will also be unchanged. For execution of trees a separate list is build and sorted by the link dependencies (as it happened before during every update).
* Hierarchy: Nodes can now have parents to which they are attached. When transformed, the attached nodes will move together with the parent nodes. Attached nodes will always be drawn in front of their parents.
* Background nodes: This is a simple flag, which causes special types of nodes (such as frames) to always stay behind non-background nodes. The relative ordering among these nodes still works as usual.

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/editors/include/ED_node.h
    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_header.c
    branches/particles-2010/source/blender/editors/space_node/node_intern.h
    branches/particles-2010/source/blender/editors/space_node/node_select.c
    branches/particles-2010/source/blender/editors/space_node/node_state.c
    branches/particles-2010/source/blender/editors/space_node/space_node.c
    branches/particles-2010/source/blender/editors/transform/transform_conversions.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/node_common.c
    branches/particles-2010/source/blender/nodes/intern/node_exec.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-03-24 12:36:12 UTC (rev 35750)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-03-24 13:15:11 UTC (rev 35751)
@@ -105,6 +105,7 @@
 	int type;
 	const char *name; /* can be allocated too */
 	float width, minwidth, maxwidth;
+	float height, minheight, maxheight;
 	short nclass, flag;
 	
 	bNodeSocketTemplate *inputs, *outputs;
@@ -120,6 +121,7 @@
 	/* detail buttons on panel */
 	void (*buttonfunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
 	const char *(*labelfunc)(struct bNode *);
+	int (*resize_area_func)(struct bNode *node, int x, int y);
 	
 	/* called when the node is updated (e.g. linked) in the editor. */
 	void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
@@ -192,6 +194,7 @@
 #define NODE_CLASS_MATH_ROTATION	19
 #define NODE_CLASS_PARTICLES		25
 #define NODE_CLASS_TRANSFORM		30
+#define NODE_CLASS_LAYOUT			100
 
 /* enum values for input/output */
 #define SOCK_IN		1
@@ -251,6 +254,8 @@
  */
 void			ntreeVerifyNodes(struct Main *main, struct ID *id);
 
+void			ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
+
 void			ntreeSetOutput(struct bNodeTree *ntree);
 void			ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
 void			ntreeClearPreview(struct bNodeTree *ntree);
@@ -291,6 +296,10 @@
 void			nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
 void			nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
 
+void			nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
+void			nodeAttachNode(struct bNode *node, struct bNode *parent);
+void			nodeDetachNode(struct bNode *node);
+
 struct bNode	*nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
 int				nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex, int *in_out);
 int				nodeFindNodeByPanel(struct bNodeTree *ntree, struct bNodeSocketPanel *panel, struct bNode **nodep, int *panelindex);
@@ -368,6 +377,7 @@
 #define NODE_GROUP		2
 #define NODE_FORLOOP	3
 #define NODE_WHILELOOP	4
+#define NODE_FRAME		5
 #define NODE_GROUP_MENU		10000
 #define NODE_DYNAMIC_MENU	20000
 
@@ -383,6 +393,9 @@
 struct bNode	*node_group_make_from_selected(struct bNodeTree *ntree);
 int				node_group_ungroup(struct bNodeTree *ntree, struct bNode *gnode);
 
+/* in node_common.c */
+void register_node_type_frame(ListBase *lb);
+
 /* ************** SHADER NODES *************** */
 
 struct ShadeInput;

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-03-24 12:36:12 UTC (rev 35750)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-03-24 13:15:11 UTC (rev 35751)
@@ -493,7 +493,8 @@
 	node->typeinfo= ntype;
 	node->flag= NODE_SELECT|ntype->flag;
 	node->width= ntype->width;
-	node->miniwidth= 42.0f;		/* small value only, allows print of first chars */
+	node->miniwidth= 42.0f;
+	node->height= ntype->height;
 	
 	node_add_sockets_from_type(ntree, node, ntype);
 	
@@ -681,6 +682,44 @@
 	ntree->update |= NTREE_UPDATE_LINKS;
 }
 
+/* transforms node location to area coords */
+void nodeSpaceCoords(bNode *node, float *locx, float *locy)
+{
+	if (node->parent) {
+		nodeSpaceCoords(node->parent, locx, locy);
+		*locx += node->locx;
+		*locy += node->locy;
+	}
+	else {
+		*locx = node->locx;
+		*locy = node->locy;
+	}
+}
+
+void nodeAttachNode(bNode *node, bNode *parent)
+{
+	float parentx, parenty;
+	
+	node->parent = parent;
+	/* transform to parent space */
+	nodeSpaceCoords(parent, &parentx, &parenty);
+	node->locx -= parentx;
+	node->locy -= parenty;
+}
+
+void nodeDetachNode(struct bNode *node)
+{
+	float parentx, parenty;
+	
+	if (node->parent) {
+		/* transform to "global" (area) space */
+		nodeSpaceCoords(node->parent, &parentx, &parenty);
+		node->locx += parentx;
+		node->locy += parenty;
+		node->parent = NULL;
+	}
+}
+
 bNodeTree *ntreeAddTree(const char *name, int type, int nodetype)
 {
 	bNodeTree *ntree;
@@ -773,6 +812,12 @@
 			link->tosock->link = link;
 	}
 	
+	/* update node->parent pointers */
+	for (node=newtree->nodes.first; node; node=node->next) {
+		if (node->parent)
+			node->parent = node->parent->new_node;
+	}
+	
 	return newtree;
 }
 
@@ -929,19 +974,32 @@
 	}
 }
 
+static void node_unlink_attached(bNodeTree *ntree, bNode *parent)
+{
+	bNode *node;
+	for (node=ntree->nodes.first; node; node=node->next) {
+		if (node->parent == parent)
+			nodeDetachNode(node);
+	}
+}
+
 void nodeFreeNode(bNodeTree *ntree, bNode *node)
 {
 	bNodeTreeType *treetype= ntreeGetType(ntree->type);
 	bNodeSocket *sock, *nextsock;
 	bNodeSocketPanel *panel, *nextpanel;
 	
+	/* remove all references to this node */
 	nodeUnlinkNode(ntree, node);
+	node_unlink_attached(ntree, node);
+	
 	BLI_remlink(&ntree->nodes, node);
 
 	/* since it is called while free database, node->id is undefined */
 	
 	if (treetype->freeNodeCache)
 		treetype->freeNodeCache(ntree, node);
+	
 	for (sock=node->inputs.first; sock; sock = nextsock) {
 		nextsock = sock->next;
 		MEM_freeN(sock);
@@ -1421,6 +1479,7 @@
 	
 	node->done= 1;
 	
+	/* check linked nodes */
 	for(sock= node->inputs.first; sock; sock= sock->next) {
 		if(sock->link) {
 			fromnode= sock->link->fromnode;
@@ -1432,49 +1491,64 @@
 			}
 		}
 	}
-	**nsort= node;
-	(*nsort)++;
 	
+	/* check parent node */
+	if (node->parent) {
+		if (node->parent->done==0)
+			node->parent->level= node_recurs_check(node->parent, nsort);
+		if (node->parent->level <= level)
+			level = node->parent->level - 1;
+	}
+	
+	if (nsort) {
+		**nsort= node;
+		(*nsort)++;
+	}
+	
 	return level;
 }
 
-static void ntree_solve_node_order(bNodeTree *ntree)
+void ntree_solve_node_order(struct bNodeTree *ntree)
 {
-	bNode *node, **nodesort, **nsort;
-	int a, totnode=0;
+	bNode *node;
 	
-	/* set links pointers the input sockets, to find dependencies */
 	/* first clear data */
 	for(node= ntree->nodes.first; node; node= node->next) {
 		node->done= 0;
-		totnode++;
 	}
-	if(totnode==0)
-		return;
 	
-	nsort= nodesort= MEM_callocN(totnode*sizeof(void *), "sorted node array");
-	
 	/* recursive check */
 	for(node= ntree->nodes.first; node; node= node->next) {
 		if(node->done==0) {
-			node->level= node_recurs_check(node, &nsort);
+			node->level= node_recurs_check(node, NULL);
 		}
 	}
+}
+
+void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes)
+{
+	bNode *node, **nsort;
 	
-	/* re-insert nodes in order, first a paranoia check */
-	for(a=0; a<totnode; a++) {
-		if(nodesort[a]==NULL)
-			break;
+	*totnodes=0;
+	
+	/* first clear data */
+	for(node= ntree->nodes.first; node; node= node->next) {
+		node->done= 0;
+		(*totnodes)++;
 	}
-	if(a<totnode)
-		printf("sort error in node tree");
-	else {
-		ntree->nodes.first= ntree->nodes.last= NULL;
-		for(a=0; a<totnode; a++)
-			BLI_addtail(&ntree->nodes, nodesort[a]);
+	if(*totnodes==0) {
+		*deplist = NULL;
+		return;
 	}
 	
-	MEM_freeN(nodesort);
+	nsort= *deplist= MEM_callocN((*totnodes)*sizeof(bNode*), "sorted node array");
+	
+	/* recursive check */
+	for(node= ntree->nodes.first; node; node= node->next) {
+		if(node->done==0) {
+			node->level= node_recurs_check(node, &nsort);
+		}
+	}
 }
 
 static void ntree_update_link_pointers(bNodeTree *ntree)
@@ -1732,6 +1806,9 @@
 	ntype->width = 140;
 	ntype->minwidth = 100;
 	ntype->maxwidth = 320;
+	ntype->height = 100;
+	ntype->minheight = 30;
+	ntype->maxheight = FLT_MAX;
 }
 
 void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp))
@@ -1748,7 +1825,10 @@
 {
 	ntype->width = width;
 	ntype->minwidth = minwidth;
-	ntype->maxwidth = maxwidth;
+	if (maxwidth <= minwidth)
+		ntype->maxwidth = FLT_MAX;
+	else
+		ntype->maxwidth = maxwidth;
 }
 
 void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *))
@@ -1841,6 +1921,8 @@
 
 static void registerCompositNodes(ListBase *ntypelist)
 {
+	register_node_type_frame(ntypelist);
+	
 	register_node_type_group_composite(ntypelist);
 	register_node_type_forloop_composite(ntypelist);
 	register_node_type_whileloop_composite(ntypelist);
@@ -1919,6 +2001,8 @@
 
 static void registerShaderNodes(ListBase *ntypelist) 
 {
+	register_node_type_frame(ntypelist);
+	
 	register_node_type_group_shader(ntypelist);
 	register_node_type_forloop_shader(ntypelist);
 	register_node_type_whileloop_shader(ntypelist);
@@ -1950,6 +2034,8 @@
 
 static void registerTextureNodes(ListBase *ntypelist)
 {
+	register_node_type_frame(ntypelist);
+	
 	register_node_type_group_texture(ntypelist);
 	register_node_type_forloop_texture(ntypelist);
 	register_node_type_whileloop_texture(ntypelist);

Modified: branches/particles-2010/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/readfile.c	2011-03-24 12:36:12 UTC (rev 35750)
+++ branches/particles-2010/source/blender/blenloader/intern/readfile.c	2011-03-24 13:15:11 UTC (rev 35751)
@@ -2200,8 +2200,10 @@
 	
 	/* and we connect the rest */
 	for(node= ntree->nodes.first; node; node= node->next) {
+		node->parent = newdataadr(fd, node->parent);
 		node->preview= newimaadr(fd, node->preview);
 		node->lasty= 0;
+		
 		for(sock= node->inputs.first; sock; sock= sock->next) {
 			sock->link= newdataadr(fd, sock->link);
 			sock->storage= newdataadr(fd, sock->storage);
@@ -11583,24 +11585,9 @@
 	/* put compatibility code here until next subversion bump */
 
 	{
-
-	}
 	
-	if (main->versionfile < 256 || (main->versionfile == 256 && main->subversionfile < 2)) {
-		bNodeTree *ntree;
-		
-		/* node sockets are not exposed automatically any more,
-		 * this mimics the old behaviour by adding all unlinked sockets to groups.
-		 */
-		for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
-			/* XXX Only setting a flag here. Actual adding of group sockets
-			 * is done in lib_verify_nodetree, because at this point the internal
-			 * nodes may not be up-to-date! (missing lib-link)
-			 */
-			ntree->flag |= NTREE_DO_VERSIONS;
-		}
 	}
-
+	

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list