[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30072] branches/particles-2010/source/ blender: Ported back particle nodes basics.

Lukas Toenne lukas.toenne at googlemail.com
Wed Jul 7 11:29:11 CEST 2010


Revision: 30072
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30072
Author:   lukastoenne
Date:     2010-07-07 11:29:11 +0200 (Wed, 07 Jul 2010)

Log Message:
-----------
Ported back particle nodes basics. Also includes node tree info structs and execution code split-off.

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/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/space_node.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/makesrna/intern/rna_nodetree_types.h
    branches/particles-2010/source/blender/makesrna/intern/rna_space.c
    branches/particles-2010/source/blender/nodes/CMakeLists.txt
    branches/particles-2010/source/blender/nodes/intern/CMP_util.h
    branches/particles-2010/source/blender/nodes/intern/SHD_util.h
    branches/particles-2010/source/blender/nodes/intern/TEX_util.h
    branches/particles-2010/source/blender/nodes/intern/node_util.c
    branches/particles-2010/source/blender/nodes/intern/node_util.h

Added Paths:
-----------
    branches/particles-2010/source/blender/nodes/PAR_node.h
    branches/particles-2010/source/blender/nodes/intern/PAR_nodes/
    branches/particles-2010/source/blender/nodes/intern/PAR_util.c
    branches/particles-2010/source/blender/nodes/intern/PAR_util.h
    branches/particles-2010/source/blender/nodes/intern/node_tree_composite.c
    branches/particles-2010/source/blender/nodes/intern/node_tree_particles.c
    branches/particles-2010/source/blender/nodes/intern/node_tree_shader.c
    branches/particles-2010/source/blender/nodes/intern/node_tree_texture.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-07-07 08:10:43 UTC (rev 30071)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-07-07 09:29:11 UTC (rev 30072)
@@ -33,6 +33,8 @@
 #ifndef BKE_NODE_H
 #define BKE_NODE_H
 
+#include "DNA_listBase.h"
+
 /* not very important, but the stack solver likes to know a maximum */
 #define MAX_SOCKET	64
 
@@ -44,14 +46,16 @@
 struct bNodeStack;
 struct uiLayout;
 struct rctf;
-struct ListBase;
 struct RenderData;
 struct Scene;
 struct Main;
 struct Tex;
+struct MTex;
 struct GPUMaterial;
 struct GPUNode;
 struct GPUNodeStack;
+struct ParticleSimulationData;
+struct ParticleSystem;
 struct PointerRNA;
 struct bContext;
 
@@ -64,7 +68,7 @@
 	float min, max;					/* default range for inputs */
 	
 	/* after this line is used internal only */
-	struct bNodeSocket *sock;		/* used during verify_types */
+	struct ListBase verified;			/* used during verify_types */
 	struct bNodeSocket *internsock;	/* group nodes, the internal socket counterpart */
 	int own_index;					/* verify group nodes */
 	
@@ -91,7 +95,7 @@
 	void (*copystoragefunc)(struct bNode *, struct bNode *);
 	
 	/* for use with dynamic typedefs */
-	ID *id;
+	struct ID *id;
 	void *pynode; /* holds pointer to python script */
 	void *pydict; /* holds pointer to python script dictionary (scope)*/
 
@@ -100,6 +104,23 @@
 
 } bNodeType;
 
+typedef void (*bNodeTreeCallback)(void *calldata, struct ID *owner_id, struct bNodeTree *ntree);
+typedef struct bNodeTreeTypeInfo
+{
+	int type;						/* type identifier */
+	char id_name[24];				/* id name for RNA identification */
+	
+	ListBase node_types;			/* type definitions */
+	
+	/* callbacks */
+	void (*freeCache)(struct bNodeTree *ntree);
+	void (*freeNodeCache)(struct bNodeTree *ntree, struct bNode *node);
+	void (*foreachNodeTree)(void *calldata, bNodeTreeCallback func);		/* iteration over all node trees */
+	void (*beginExec)(struct bNodeTree *ntree);
+	void (*endExec)(struct bNodeTree *ntree);
+	void (*exec)(struct bNodeTree *ntree, void *callerdata, int thread);
+} bNodeTreeTypeInfo;
+
 /* node->exec, now in use for composites (#define for break is same as ready yes) */
 #define NODE_PROCESSING	1
 #define NODE_READY		2
@@ -122,9 +143,12 @@
 #define NODE_CLASS_OP_DYNAMIC	11
 #define NODE_CLASS_PATTERN 12
 #define NODE_CLASS_TEXTURE 13
+#define NODE_CLASS_SIMULATION	14
 
 /* ************** GENERIC API, TREES *************** */
 
+bNodeTreeTypeInfo	*ntreeGetTypeInfo(int type);
+
 void			ntreeVerifyTypes(struct bNodeTree *ntree);
 
 struct bNodeTree *ntreeAddTree(int type);
@@ -137,6 +161,7 @@
 void			ntreeMakeLocal(struct bNodeTree *ntree);
 
 void			ntreeSocketUseFlags(struct bNodeTree *ntree);
+void			ntreeUpdateListSockets(struct bNodeTree *ntree);
 
 void			ntreeSolveOrder(struct bNodeTree *ntree);
 
@@ -175,6 +200,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			nodeCheckLink(struct bNodeLink *link);
 
 struct bNode	*nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
 int			nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
@@ -191,6 +217,8 @@
 void			NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
 void			NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
 
+int				nodeIsListSocket(bNodeSocketType *stype);
+
 /* ************** Groups ****************** */
 
 struct bNode	*nodeMakeGroupFromSelected(struct bNodeTree *ntree);
@@ -258,9 +286,6 @@
 #define NODE_DYNAMIC_REPARSE	6 /* 64 */
 #define NODE_DYNAMIC_SET	15 /* sign */
 
-/* the type definitions array */
-extern struct ListBase node_all_shaders;
-
 /* API */
 
 void			ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
@@ -385,9 +410,6 @@
 #define CMP_SCALE_SCENEPERCENT	2
 
 
-/* the type definitions array */
-extern struct ListBase node_all_composit;
-
 /* API */
 struct CompBuf;
 void ntreeCompositTagRender(struct Scene *sce);
@@ -430,8 +452,6 @@
 #define TEX_NODE_PROC      500
 #define TEX_NODE_PROC_MAX  600
 
-extern struct ListBase node_all_textures;
-
 /* API */
 int  ntreeTexTagAnimated(struct bNodeTree *ntree);
 void ntreeTexSetPreviewFlag(int);
@@ -440,6 +460,24 @@
 char* ntreeTexOutputMenu(struct bNodeTree *ntree);
 
 
+/* ************** PARTICLE NODES *************** */
+
+/* note: types are needed to restore callbacks, don't change values */
+/* range 1 - 100 is reserved for common nodes */
+/* using toolbox, we add node groups by assuming the values below don't exceed NODE_GROUP_MENU for now */
+
+#define PAR_NODE_PROGRAM	601
+#define PAR_NODE_NEWTONIAN	602
+#define PAR_NODE_INPUT		603
+#define PAR_NODE_EMITTER	604
+#define PAR_NODE_OBJECT		605
+
+/* the type definitions array */
+extern struct ListBase node_all_particles;
+
+/* API */
+void ntreeParticlesExecTree(struct ParticleSimulationData *sim, float cfra, float dfra, int thread);
+
 /**/
 
 void init_nodesystem(void);

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-07-07 08:10:43 UTC (rev 30071)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2010-07-07 09:29:11 UTC (rev 30072)
@@ -49,20 +49,37 @@
 
 #include "CMP_node.h"
 #include "intern/CMP_util.h"	/* stupid include path... */
-
 #include "SHD_node.h"
+#include "intern/SHD_util.h"
 #include "TEX_node.h"
 #include "intern/TEX_util.h"
+#include "PAR_node.h"
+#include "intern/PAR_util.h"
 
 #include "GPU_material.h"
 
-static ListBase empty_list = {NULL, NULL};
-ListBase node_all_composit = {NULL, NULL};
-ListBase node_all_shaders = {NULL, NULL};
-ListBase node_all_textures = {NULL, NULL};
 
-/* ************** Type stuff **********  */
+bNodeTreeTypeInfo *ntreeGetTypeInfo(int type)
+{
+	static bNodeTreeTypeInfo *types[NUM_NTREE_TYPES];
+	static int types_init = 1;
+	if (types_init) {
+		types[NTREE_SHADER] = &ntreeType_Shader;
+		types[NTREE_COMPOSIT] = &ntreeType_Composite;
+		types[NTREE_TEXTURE] = &ntreeType_Texture;
+		types[NTREE_PARTICLES] = &ntreeType_Particles;
+		types_init = 0;
+	}
+	
+	if(type >= 0 && type < NUM_NTREE_TYPES) {
+		return types[type];
+	}
+	else {
+		return NULL;
+	}
+}
 
+
 static bNodeType *node_get_type(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
 {
 	if(type==NODE_GROUP) {
@@ -72,7 +89,7 @@
 		return NULL;
 	}
 	else {
-		bNodeType *ntype = ntree->alltypes.first;
+		bNodeType *ntype = ntreeGetTypeInfo(ntree->type)->node_types.first;
 		for(; ntype; ntype= ntype->next)
 			if(ntype->type==type && id==ntype->id )
 				return ntype;
@@ -85,17 +102,6 @@
 {
 	bNode *node, *next;
 	
-	if(ntree->type==NTREE_SHADER)
-		ntree->alltypes= node_all_shaders;
-	else if(ntree->type==NTREE_COMPOSIT)
-		ntree->alltypes= node_all_composit;
-	else if(ntree->type==NTREE_TEXTURE)
-		ntree->alltypes= node_all_textures;
-	else {
-		ntree->alltypes= empty_list;
-		printf("Error: no type definitions for nodes\n");
-	}
-	
 	for(node= ntree->nodes.first; node; node= next) {
 		next= node->next;
 		if(node->type==NODE_DYNAMIC) {
@@ -141,6 +147,12 @@
 	}
 }
 
+int nodeIsListSocket(bNodeSocketType *stype)
+{
+	/* TODO needs a more generic way of allowing list sockets - phonybone */
+	return (stype->type == SOCK_OP);
+}
+
 /* only used internal... we depend on type definitions! */
 static bNodeSocket *node_add_socket_type(ListBase *lb, bNodeSocketType *stype)
 {
@@ -167,6 +179,36 @@
 	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 *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->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;
+	sock->ns.vec[3]= stype->val4;
+	sock->ns.min= stype->min;
+	sock->ns.max= stype->max;
+	
+	if(lb) {
+		if (next_sock)
+			BLI_insertlinkbefore(lb, next_sock, sock);
+		else
+			BLI_addtail(lb, sock);
+	}
+
+	return sock;
+}
+
 static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
 {
 	bNodeLink *link, *next;
@@ -182,31 +224,59 @@
 	MEM_freeN(sock);
 }
 
-static bNodeSocket *verify_socket(ListBase *lb, bNodeSocketType *stype)
+static void verify_socket(ListBase *lb, bNodeSocketType *stype, ListBase *r_verified)
 {
 	bNodeSocket *sock;
+	int list_socket= nodeIsListSocket(stype);
 	
+	r_verified->first = r_verified->last = NULL;
+	
 	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)
+		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->tosock= stype->internsock;
+			
+			BLI_remlink(lb, sock);
+			
+			/* non-list sockets may only have one of each type */
+			if (!list_socket) {
+				/* add to verified list */
+				BLI_addtail(r_verified, sock);
 				break;
+			}
+			else {
+				/* only the last socket may be without link (checked after the loop) */
+				if (sock->link) {
+					if (r_verified->last)
+						sock->list_index = ((bNodeSocket*)r_verified->last)->list_index + 1;
+					else
+						sock->list_index = -1;
+					/* add to verified list */
+					BLI_addtail(r_verified, sock);
+				}
+			}
+			
+			
+			if (!list_socket) {
+				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;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list