[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31569] branches/particles-2010/source/ blender: Removed pointers to static socket type definitions from socket structs.

Lukas Toenne lukas.toenne at googlemail.com
Wed Aug 25 08:50:22 CEST 2010


Revision: 31569
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31569
Author:   lukastoenne
Date:     2010-08-25 08:50:21 +0200 (Wed, 25 Aug 2010)

Log Message:
-----------
Removed pointers to static socket type definitions from socket structs. These definitions are now merely used as default initialisation for the socket lists, which can otherwise be modified dynamically. This allows a much more flexible behaviour of sockets, which is necessary for generic get/set data nodes and variable input socket lists.
Group nodes don't have a static type array at all any more, instead the socket lists are directly updated in the instanced group nodes.

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/space_node/node_edit.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_add_particle_force.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_for.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_object_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_particle_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_vertex_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_particle_dynamics.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_random.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_object_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_particle_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_vertex_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_subprogram.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_timestep.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-08-25 04:48:42 UTC (rev 31568)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-08-25 06:50:21 UTC (rev 31569)
@@ -70,18 +70,7 @@
 	char *name;
 	float val1, val2, val3, val4;	/* default alloc value for inputs */
 	float min, max;					/* default range for inputs */
-	
-	short flag;
-	
 	int contexttype;
-	
-	/* after this line is used internal only */
-	struct ListBase verified;			/* used during verify_types */
-	
-	/* group nodes, the internal socket counterpart */
-	struct bNode *internnode;
-	struct bNodeSocket *internsock;
-	int own_index;					/* verify group nodes */
 } bNodeSocketType;
 
 typedef struct bNodeType {
@@ -172,13 +161,12 @@
 
 bNodeTreeTypeInfo	*ntreeGetTypeInfo(int type);
 
-void			ntreeVerifyTypes(struct bNodeTree *ntree);
+//void			ntreeVerifyTypes(struct bNodeTree *ntree);
 
 struct bNodeTree *ntreeAddTree(int type);
 void			ntreeInitTypes(struct bNodeTree *ntree);
 
 void			ntreeMakeOwnType(struct bNodeTree *ntree);
-void			ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
 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);
@@ -217,13 +205,19 @@
 
 /* ************** 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);
 
 void			nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
 void			nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
-void			nodeAddSockets(struct bNode *node, struct bNodeType *ntype);
+struct bNodeSocket *nodeAddInputSocket(struct bNode *node, char *name, int type, float *default_value, float min, float max);
+struct bNodeSocket *nodeAddOutputSocket(struct bNode *node, char *name, int type, float *default_value, float min, float max);
+struct bNodeSocket *nodeInsertInputSocket(struct bNode *node, struct bNodeSocket *next_sock, char *name, int type, float *default_value, float min, float max);
+struct bNodeSocket *nodeInsertOutputSocket(struct bNode *node, struct bNodeSocket *next_sock, char *name, int type, float *default_value, float min, float max);
+void			nodeRemoveInputSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
+void			nodeRemoveOutputSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
+void			nodeAddSocketsFromType(struct bNode *node, struct bNodeType *ntype);
 struct bNode	*nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup, struct ID *id);
 void			nodeRegisterType(struct ListBase *typelist, const struct bNodeType *ntype) ;
 void			nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeType *ntype);

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-08-25 04:48:42 UTC (rev 31568)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-08-25 06:50:21 UTC (rev 31569)
@@ -135,235 +135,88 @@
 	ntree->init |= NTREE_TYPE_INIT;
 }
 
-/* updates node with (modified) bNodeType.. this should be done for all trees */
-void ntreeUpdateType(bNodeTree *ntree, bNodeType *ntype)
+static bNodeSocket *make_socket(int is_input, char *name, int type, float *default_value, float min, float max)
 {
-	bNode *node;
-
-	for(node= ntree->nodes.first; node; node= node->next) {
-		if(node->typeinfo== ntype) {
-			nodeUpdateType(ntree, node, ntype);
-		}
-	}
-}
-
-/* only used internal... we depend on type definitions! */
-static bNodeSocket *node_add_socket_type(ListBase *lb, bNodeSocketType *stype)
-{
 	bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
 	
-	BLI_strncpy(sock->name, stype->name, NODE_MAXSTR);
-	if(stype->limit==0) sock->limit= 0xFFF;
-	else sock->limit= stype->limit;
-	sock->type= stype->type;
-	sock->context.type = stype->contexttype;
+	BLI_strncpy(sock->name, name, NODE_MAXSTR);
+	sock->limit = (is_input ? 1 : 0xFFF);
+	sock->type= type;
+	sock->context.type = NDC_UNDEFINED;
 	sock->context.source = NULL;
 	sock->intern = 1;
 	
-	sock->to_index= stype->own_index;
-	sock->tonode= stype->internnode;
-	sock->tosock= stype->internsock;
+	sock->to_index= 0;
+	sock->tonode= NULL;
+	sock->tosock= NULL;
 	
-	sock->ns.vec[0]= stype->val1;
-	sock->ns.vec[1]= stype->val2;
-	sock->ns.vec[2]= stype->val3;
-	sock->ns.vec[3]= stype->val4;
-	sock->ns.min= stype->min;
-	sock->ns.max= stype->max;
-	sock->ns.ival = (int)stype->val1;
-	sock->ns.imin = (int)stype->min;
-	sock->ns.imax = (int)stype->max;
+	copy_v4_v4(sock->ns.vec, default_value);
+	sock->ns.min= min;
+	sock->ns.max= max;
+	sock->ns.ival = (int)default_value[0];
+	sock->ns.imin = (int)min;
+	sock->ns.imax = (int)max;
 	
-	sock->stype = stype;
-	
-	if(lb)
-		BLI_addtail(lb, sock);
-
 	return sock;
 }
 
-/* only used internal... we depend on type definitions! */
-static bNodeSocket *node_insert_before_socket_type(ListBase *lb, bNodeSocket *next_sock, bNodeSocketType *stype)
+bNodeSocket *nodeAddInputSocket(bNode *node, char *name, int type, float *default_value, float min, float max)
 {
-	bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
-	
-	BLI_strncpy(sock->name, stype->name, NODE_MAXSTR);
-	if(stype->limit==0) sock->limit= 0xFFF;
-	else sock->limit= stype->limit;
-	sock->type= stype->type;
-	sock->context.type = stype->contexttype;
-	sock->context.source = NULL;
-	sock->intern = 1;
-	
-	sock->to_index= stype->own_index;
-	sock->tonode= stype->internnode;
-	sock->tosock= stype->internsock;
-	
-	sock->ns.vec[0]= stype->val1;
-	sock->ns.vec[1]= stype->val2;
-	sock->ns.vec[2]= stype->val3;
-	sock->ns.vec[3]= stype->val4;
-	sock->ns.min= stype->min;
-	sock->ns.max= stype->max;
-	sock->ns.ival = (int)stype->val1;
-	sock->ns.imin = (int)stype->min;
-	sock->ns.imax = (int)stype->max;
-	
-	sock->stype = stype;
-	
-	if(lb) {
-		if (next_sock)
-			BLI_insertlinkbefore(lb, next_sock, sock);
-		else
-			BLI_addtail(lb, sock);
-	}
+	bNodeSocket *sock = make_socket(1, name, type, default_value, min, max);
+	BLI_addtail(&node->inputs, sock);
+	return sock;
+}
+bNodeSocket *nodeAddOutputSocket(bNode *node, char *name, int type, float *default_value, float min, float max)
+{
+	bNodeSocket *sock = make_socket(0, name, type, default_value, min, max);
+	BLI_addtail(&node->outputs, sock);
+	return sock;
+}
 
+bNodeSocket *nodeInsertInputSocket(bNode *node, bNodeSocket *next_sock, char *name, int type, float *default_value, float min, float max)
+{
+	bNodeSocket *sock = make_socket(1, name, type, default_value, min, max);
+	BLI_insertlinkbefore(&node->inputs, next_sock, sock);
 	return sock;
 }
+bNodeSocket *nodeInsertOutputSocket(bNode *node, bNodeSocket *next_sock, char *name, int type, float *default_value, float min, float max)
+{
+	bNodeSocket *sock = make_socket(0, name, type, default_value, min, max);
+	BLI_insertlinkbefore(&node->outputs, next_sock, sock);
+	return sock;
+}
 
-static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
+void nodeRemoveInputSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
 {
 	bNodeLink *link, *next;
 	
 	for(link= ntree->links.first; link; link= next) {
 		next= link->next;
-		if(link->fromsock==sock || link->tosock==sock) {
+		if(link->tosock==sock) {
 			nodeRemLink(ntree, link);
 		}
 	}
 	
-	BLI_remlink(lb, sock);
+	BLI_remlink(&node->inputs, sock);
 	MEM_freeN(sock);
 }
-
-static void verify_socket(ListBase *lb, bNodeSocketType *stype, ListBase *r_verified)
+void nodeRemoveOutputSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
 {
-	bNodeSocket *sock, *socknext;
+	bNodeLink *link, *next;
 	
-	r_verified->first = r_verified->last = NULL;
-	
-	sock= lb->first;
-	while (sock) {
-		/* both indices are zero for non-groups, otherwise it's a unique index */
-		if(sock->to_index==stype->own_index && strncmp(sock->name, stype->name, NODE_MAXSTR)==0) {
-//			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->tonode= stype->internnode;
-			sock->tosock= stype->internsock;
-			sock->stype = stype;
-			
-			/* non-list sockets may only have one of each type */
-			if ((stype->flag & SOCK_LIST) == 0) {
-				BLI_remlink(lb, sock);
-				/* add to verified list */
-				BLI_addtail(r_verified, sock);
-				
-				return;
-			}
-			else {
-				socknext = sock->next;
-				
-				BLI_remlink(lb, sock);
-				/* add to verified list */
-				BLI_addtail(r_verified, sock);
-				
-				sock = socknext;
-			}
+	for(link= ntree->links.first; link; link= next) {
+		next= link->next;
+		if(link->fromsock==sock) {
+			nodeRemLink(ntree, link);
 		}
-		else
-			sock= sock->next;
 	}
 	
-	if (r_verified->first == NULL)
-		node_add_socket_type(r_verified, stype);
+	BLI_remlink(&node->outputs, sock);
+	MEM_freeN(sock);
 }
 
-static void verify_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first)
-{
-	bNodeSocketType *stype;
-	
-	/* no inputs anymore? */
-	if(stype_first==NULL) {
-		while(lb->first)
-			node_rem_socket(ntree, lb, lb->first);
-	}
-	else {
-		/* step by step compare */
-		stype= stype_first;
-		while(stype->type != -1) {
-			verify_socket(lb, stype, &stype->verified);
-			stype++;
-		}
-		/* leftovers are removed */
-		while(lb->first)
-			node_rem_socket(ntree, lb, lb->first);
-		/* and we put back the verified sockets */
-		stype= stype_first;
-		while(stype->type != -1) {
-			addlisttolist(lb, &stype->verified);
-			stype++;
-		}
-	}
-}
-
-void nodeVerifyType(bNodeTree *ntree, bNode *node)
-{
-	bNodeType *ntype= node->typeinfo;
-	
-	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);
-		
-		{
-			bNodeSocket *sock;
-			printf("Verified sockets of %s:\n", node->name);
-			for (sock=node->inputs.first; sock; sock = sock->next) {
-				printf("Input %s\n", sock->name);
-			}

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list