[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36253] branches/particles-2010: Revived the socket type struct for collecting info and functions for socket types .

Lukas Toenne lukas.toenne at googlemail.com
Wed Apr 20 22:56:16 CEST 2011


Revision: 36253
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36253
Author:   lukastoenne
Date:     2011-04-20 20:56:15 +0000 (Wed, 20 Apr 2011)
Log Message:
-----------
Revived the socket type struct for collecting info and functions for socket types. Implemented a basic system for doing type conversions by selecting on the input side.

Modified Paths:
--------------
    branches/particles-2010/release/scripts/ui/properties_modifier_node.py
    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/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/RNA_access.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h
    branches/particles-2010/source/blender/nodes/CMakeLists.txt
    branches/particles-2010/source/blender/nodes/MOD_node.h
    branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/MOD_exec.c
    branches/particles-2010/source/blender/nodes/intern/MOD_exec.h
    branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_common.c
    branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_join.c
    branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_mesh.c
    branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_transform.c
    branches/particles-2010/source/blender/nodes/intern/MOD_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/MOD_util.h
    branches/particles-2010/source/blender/nodes/intern/node_common.c
    branches/particles-2010/source/blender/nodes/intern/node_common.h
    branches/particles-2010/source/blender/nodes/intern/node_exec.c
    branches/particles-2010/source/blender/nodes/intern/node_exec.h
    branches/particles-2010/source/blender/nodes/intern/node_socket.c
    branches/particles-2010/source/blender/nodes/intern/node_socket.h

Modified: branches/particles-2010/release/scripts/ui/properties_modifier_node.py
===================================================================
--- branches/particles-2010/release/scripts/ui/properties_modifier_node.py	2011-04-20 20:46:02 UTC (rev 36252)
+++ branches/particles-2010/release/scripts/ui/properties_modifier_node.py	2011-04-20 20:56:15 UTC (rev 36253)
@@ -49,13 +49,7 @@
             col.template_ID(node, "external_mesh")
 
     def TRANSFORM(self, layout, node):
-        col = layout.column()
-        row = col.row(align=1)
-        row.prop(node, "translate")
-        row = col.row(align=1)
-        row.prop(node, "rotate")
-        row = col.row(align=1)
-        row.prop(node, "scale")
+        pass
 
     def JOIN(self, layout, node):
         pass

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-04-20 20:46:02 UTC (rev 36252)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2011-04-20 20:56:15 UTC (rev 36253)
@@ -41,6 +41,8 @@
 
 #include "BKE_opencl.h"
 
+#include "RNA_types.h"
+
 /* not very important, but the stack solver likes to know a maximum */
 #define MAX_SOCKET	64
 
@@ -73,6 +75,8 @@
 struct Object;
 struct DerivedMesh;
 struct ParticleSystem;
+struct bNodeDataReader;
+struct bNodeDataSource;
 
 /* ************** NODE TYPE DEFINITIONS ***** */
 
@@ -87,10 +91,8 @@
 	struct bNodeSocket *sock;		/* used to hold verified socket */
 } bNodeSocketTemplate;
 
-typedef struct bNodeSocketConverter {
-	char ui_name[32];
-} bNodeSocketConverter;
-
+/* visitor function for socket converters */
+typedef void (*SocketConvWalkFunc)(void *userdata, int converter, const char *name);
 typedef struct bNodeSocketType {
 	int type;
 	char ui_name[32];
@@ -98,7 +100,17 @@
 	int ui_icon;
 	char ui_color[4];
 	
-	int (*get_converters)(int type, struct bNodeSocketConverter **conv, int *totconv);
+	int value_size;
+	
+	void (*foreach_converter)(void *userdata, int type, SocketConvWalkFunc cb);
+	
+	/* functions for sources of this type */
+	void *(*source_read)(struct bNodeDataSource *source, int key);
+	void (*source_write)(struct bNodeDataSource *source, int key, void *data);
+	/* get function pointers for readers of this type */
+	void (*make_reader_buffer)(struct bNodeDataReader *reader, int converter);
+	void (*make_reader_delegate)(struct bNodeDataReader *reader, int converter);
+	int (*reader_size)(struct bNodeDataReader *reader);
 } bNodeSocketType;
 
 typedef struct bNodeTemplate {
@@ -286,8 +298,8 @@
 
 /* ************** GENERIC API, NODES *************** */
 
-struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type);
-struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type);
+struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type, PropertySubType subtype);
+struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type, PropertySubType subtype);
 void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
 void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
 
@@ -316,6 +328,7 @@
 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);
 void			nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
+void			nodeInitLinkConverter(struct bNodeLink *link);
 
 void			nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
 void			nodeAttachNode(struct bNode *node, struct bNode *parent);
@@ -637,12 +650,14 @@
 
 /* input */
 #define MOD_NODE_MESH				1000
+#define MOD_NODE_VERTEXGROUP		1001
 
 /* transform */
 #define MOD_NODE_TRANSFORM			1100
 
 /* combine */
-#define MOD_NODE_JOIN			1200
+#define MOD_NODE_JOIN				1200
+#define MOD_NODE_MORPH				1201
 
 /* API */
 struct DerivedMesh *ntreeModifierExecTree(struct bNodeTree *ntree, struct Scene *scene, struct Object *ob, float (*inputVertexCos)[3]);

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-04-20 20:46:02 UTC (rev 36252)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-04-20 20:56:15 UTC (rev 36253)
@@ -164,28 +164,45 @@
 	ntree->init |= NTREE_TYPE_INIT;
 }
 
-static bNodeSocket *make_socket(bNodeTree *UNUSED(ntree), int in_out, const char *name, int type)
+static bNodeSocket *make_socket(bNodeTree *ntree, int in_out, const char *name, int type, int subtype)
 {
-	bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+	bNodeSocketType *stype= ntreeGetSocketType(type);
+	bNodeSocket *sock;
+	PropertyRNA *prop;
+	PointerRNA ptr;
 	
+	sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+	
 	BLI_strncpy(sock->name, name, NODE_MAXSTR);
 	sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
 	sock->type= type;
+	sock->subtype = subtype;
 	sock->storage = NULL;
 	
+	if (stype->value_size > 0) {
+		/* NB: all necessary properties for RNA refine have been set! */
+		RNA_pointer_create((ID*)ntree, &RNA_NodeSocket, sock, &ptr);
+		prop = RNA_struct_find_property(&ptr, "default_value");
+		if (prop) {
+			int index, len= RNA_property_array_length(&ptr, prop);
+			
+			sock->default_value = MEM_callocN(stype->value_size, "default value");
+			
+			/* reset to default value */
+			for (index=0; index < len; ++index)
+				RNA_property_reset(&ptr, prop, index);
+		}
+	}
 	zero_v4(sock->ns.vec);
 	sock->ns.min = -FLT_MAX;	/* _not_ FLT_MIN, that would be the smallest possible float > 0 */
 	sock->ns.max = FLT_MAX;
-	sock->ns.ival = 0;
-	sock->ns.imin = INT_MIN;
-	sock->ns.imax = INT_MAX;
 	
 	return sock;
 }
 
-bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char *name, int type)
+bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char *name, int type, PropertySubType subtype)
 {
-	bNodeSocket *sock = make_socket(ntree, in_out, name, type);
+	bNodeSocket *sock = make_socket(ntree, in_out, name, type, subtype);
 	if (in_out==SOCK_IN)
 		BLI_addtail(&node->inputs, sock);
 	else if (in_out==SOCK_OUT)
@@ -196,9 +213,9 @@
 	return sock;
 }
 
-bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSocket *next_sock, const char *name, int type)
+bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSocket *next_sock, const char *name, int type, PropertySubType subtype)
 {
-	bNodeSocket *sock = make_socket(ntree, in_out, name, type);
+	bNodeSocket *sock = make_socket(ntree, in_out, name, type, subtype);
 	if (in_out==SOCK_IN)
 		BLI_insertlinkbefore(&node->inputs, next_sock, sock);
 	else if (in_out==SOCK_OUT)
@@ -223,6 +240,9 @@
 	/* this is fast, this way we don't need an in_out argument */
 	BLI_remlink(&node->inputs, sock);
 	BLI_remlink(&node->outputs, sock);
+	
+	if (sock->default_value)
+		MEM_freeN(sock->default_value);
 	MEM_freeN(sock);
 	
 	ntree->update |= NTREE_UPDATE_NODES;
@@ -230,6 +250,7 @@
 
 void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
 {
+	bNodeSocket *sock;
 	bNodeLink *link, *next;
 	
 	for(link= ntree->links.first; link; link= next) {
@@ -239,7 +260,14 @@
 		}
 	}
 	
+	for (sock=node->inputs.first; sock; sock=sock->next)
+		if (sock->default_value)
+			MEM_freeN(sock->default_value);
 	BLI_freelistN(&node->inputs);
+	for (sock=node->outputs.first; sock; sock=sock->next)
+		if (sock->default_value)
+			MEM_freeN(sock->default_value);
+	
 	BLI_freelistN(&node->outputs);
 	
 	ntree->update |= NTREE_UPDATE_NODES;
@@ -458,7 +486,7 @@
 	if(ntype->inputs) {
 		sockdef= ntype->inputs;
 		while(sockdef->type != -1) {
-			sock = nodeAddSocket(ntree, node, SOCK_IN, sockdef->name, sockdef->type);
+			sock = nodeAddSocket(ntree, node, SOCK_IN, sockdef->name, sockdef->type, PROP_NONE);
 			/* tag socket as static */
 			sock->flag |= SOCK_STATIC;
 			
@@ -469,9 +497,6 @@
 			sock->ns.vec[3] = sockdef->val4;
 			sock->ns.min = sockdef->min;
 			sock->ns.max = sockdef->max;
-			sock->ns.ival = (int)sockdef->val1;
-			sock->ns.imin = (int)sockdef->min;
-			sock->ns.imax = (int)sockdef->max;
 			
 			sockdef++;
 		}
@@ -479,7 +504,7 @@
 	if(ntype->outputs) {
 		sockdef= ntype->outputs;
 		while(sockdef->type != -1) {
-			sock = nodeAddSocket(ntree, node, SOCK_OUT, sockdef->name, sockdef->type);
+			sock = nodeAddSocket(ntree, node, SOCK_OUT, sockdef->name, sockdef->type, PROP_NONE);
 			/* tag socket as static */
 			sock->flag |= SOCK_STATIC;
 			
@@ -490,9 +515,6 @@
 			sock->ns.vec[3] = sockdef->val4;
 			sock->ns.min = sockdef->min;
 			sock->ns.max = sockdef->max;
-			sock->ns.ival = (int)sockdef->val1;
-			sock->ns.imin = (int)sockdef->min;
-			sock->ns.imax = (int)sockdef->max;
 			
 			sockdef++;
 		}
@@ -622,7 +644,6 @@
 	return nnode;
 }
 
-/* fromsock and tosock can be NULL */
 /* also used via rna api, so we check for proper input output direction */
 bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
 {
@@ -645,6 +666,21 @@
 				from= -1; /* OK but flip */
 		}
 	}
+	else {
+		/* check tree sockets */
+		for(sock= ntree->inputs.first; sock; sock= sock->next)
+			if(sock==fromsock)
+				break;
+		if(sock)
+			from= 1; /* OK */
+		else {
+			for(sock= ntree->outputs.first; sock; sock= sock->next)
+				if(sock==fromsock)
+					break;
+			if(sock)
+				from= -1; /* OK but flip */
+		}
+	}
 	if(tonode) {
 		for(sock= tonode->inputs.first; sock; sock= sock->next)
 			if(sock==tosock)
@@ -659,8 +695,22 @@
 				to= -1; /* OK but flip */
 		}
 	}
+	else {
+		/* check tree sockets */
+		for(sock= ntree->outputs.first; sock; sock= sock->next)
+			if(sock==tosock)
+				break;
+		if(sock)
+			to= 1; /* OK */
+		else {
+			for(sock= ntree->inputs.first; sock; sock= sock->next)
+				if(sock==tosock)
+					break;
+			if(sock)
+				to= -1; /* OK but flip */
+		}
+	}
 	
-	/* this allows NULL sockets to work */
 	if(from >= 0 && to >= 0) {
 		link= MEM_callocN(sizeof(bNodeLink), "link");
 		BLI_addtail(&ntree->links, link);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list