[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