[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13620] trunk/blender/source/blender: * Merge of PyNodes to trunk.

Nathan Letwory jesterking at letwory.net
Sun Feb 10 00:17:20 CET 2008


Revision: 13620
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13620
Author:   jesterking
Date:     2008-02-10 00:17:15 +0100 (Sun, 10 Feb 2008)

Log Message:
-----------
* Merge of PyNodes to trunk. Finally!

  See http://wiki.blender.org/index.php/BlenderDev/PyNodes and
  http://wiki.blender.org/index.php/BlenderDev/PyNodes/API
  For current documentation.

  Very very big thanks go to William Germano for fixing the memory issues left
  and for improving on the code.

  In the coming time documentation will be finalised and further stabilising
  of PyNodes is to be expected.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/BKE_utildefines.h
    trunk/blender/source/blender/blenkernel/SConscript
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/nodes/SConscript
    trunk/blender/source/blender/nodes/SHD_node.h
    trunk/blender/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
    trunk/blender/source/blender/python/SConscript
    trunk/blender/source/blender/python/api2_2x/Blender.c
    trunk/blender/source/blender/python/api2_2x/Node.c
    trunk/blender/source/blender/python/api2_2x/Node.h
    trunk/blender/source/blender/src/drawnode.c
    trunk/blender/source/blender/src/drawtext.c
    trunk/blender/source/blender/src/editnode.c
    trunk/blender/source/blender/src/toolbox.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2008-02-09 23:11:05 UTC (rev 13619)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2008-02-09 23:17:15 UTC (rev 13620)
@@ -87,8 +87,8 @@
 	
 	/* for use with dynamic typedefs */
 	ID *id;
-	void *script; /* holds pointer to python script */
-	void *dict; /* holds pointer to python script dictionary (scope)*/
+	void *pynode; /* holds pointer to python script */
+	void *pydict; /* holds pointer to python script dictionary (scope)*/
 
 } bNodeType;
 
@@ -103,13 +103,14 @@
 #define NODE_CLASS_INPUT		0
 #define NODE_CLASS_OUTPUT		1
 #define NODE_CLASS_OP_COLOR		3
-#define NODE_CLASS_OP_VECTOR		4
-#define NODE_CLASS_OP_FILTER		5
+#define NODE_CLASS_OP_VECTOR	4
+#define NODE_CLASS_OP_FILTER	5
 #define NODE_CLASS_GROUP		6
 #define NODE_CLASS_FILE			7
-#define NODE_CLASS_CONVERTOR		8
+#define NODE_CLASS_CONVERTOR	8
 #define NODE_CLASS_MATTE		9
 #define NODE_CLASS_DISTORT		10
+#define NODE_CLASS_OP_DYNAMIC	11
 
 /* ************** GENERIC API, TREES *************** */
 
@@ -119,6 +120,7 @@
 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			ntreeMakeLocal(struct bNodeTree *ntree);
@@ -144,7 +146,12 @@
 void			nodeAddToPreview(struct bNode *, float *, int, int);
 
 void			nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
-struct bNode	*nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup);
+void			nodeAddSockets(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);
+void			nodeMakeDynamicType(struct bNode *node);
+int				nodeDynamicUnlinkText(struct ID *txtid);
 void			nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
 struct bNode	*nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
 
@@ -176,6 +183,7 @@
 
 #define NODE_GROUP		2
 #define NODE_GROUP_MENU		1000
+#define NODE_DYNAMIC_MENU	4000
 
 extern bNodeType node_group_typeinfo;
 
@@ -192,7 +200,7 @@
 #define SH_NODE_OUTPUT		1
 
 #define SH_NODE_MATERIAL	100
-#define SH_NODE_RGB		101
+#define SH_NODE_RGB			101
 #define SH_NODE_VALUE		102
 #define SH_NODE_MIX_RGB		103
 #define SH_NODE_VALTORGB	104
@@ -212,12 +220,21 @@
 #define SH_NODE_SEPRGB		120
 #define SH_NODE_COMBRGB		121
 #define SH_NODE_HUE_SAT		122
+#define NODE_DYNAMIC		123
 
-
 /* custom defines options for Material node */
 #define SH_NODE_MAT_DIFF   1
 #define SH_NODE_MAT_SPEC   2
 #define SH_NODE_MAT_NEG    4
+/* custom defines: states for Script node. These are bit indices */
+#define NODE_DYNAMIC_READY	0 /* 1 */
+#define NODE_DYNAMIC_LOADED	1 /* 2 */
+#define NODE_DYNAMIC_NEW	2 /* 4 */
+#define NODE_DYNAMIC_UPDATED	3 /* 8 */
+#define NODE_DYNAMIC_ADDEXIST	4 /* 16 */
+#define NODE_DYNAMIC_ERROR	5 /* 32 */
+#define NODE_DYNAMIC_REPARSE	6 /* 64 */
+#define NODE_DYNAMIC_SET	15 /* sign */
 
 /* the type definitions array */
 extern struct ListBase node_all_shaders;
@@ -350,5 +367,6 @@
 
 void init_nodesystem(void);
 void free_nodesystem(void);
+void reinit_nodesystem(void);
 
 #endif

Modified: trunk/blender/source/blender/blenkernel/BKE_utildefines.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2008-02-09 23:11:05 UTC (rev 13619)
+++ trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2008-02-09 23:17:15 UTC (rev 13620)
@@ -171,20 +171,22 @@
 
 /* This one rotates the bytes in an int */
 #define SWITCH_INT(a) { \
-    char s_i, *p_i; \
-    p_i= (char *)&(a); \
-    s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
-    s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
+	char s_i, *p_i; \
+	p_i= (char *)&(a); \
+	s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
+	s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
 
 #define SWITCH_SHORT(a)	{ \
-    char s_i, *p_i; \
-		p_i= (char *)&(a); \
-			s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
+	char s_i, *p_i; \
+	p_i= (char *)&(a); \
+	s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
 
 
 /* Bit operations */
-#define BTST(a,b)     ( ( (a) & 1<<(b) )!=0 )   
-#define BSET(a,b)     ( (a) | 1<<(b) )
+#define BTST(a,b)	( ( (a) & 1<<(b) )!=0 )   
+#define BNTST(a,b)	( ( (a) & 1<<(b) )==0 )
+#define BTST2(a,b,c)	( BTST( (a), (b) ) || BTST( (a), (c) ) )
+#define BSET(a,b)	( (a) | 1<<(b) )
 #define BCLR(a,b)	( (a) & ~(1<<(b)) )
 /* bit-row */
 #define BROW(min, max)	(((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )

Modified: trunk/blender/source/blender/blenkernel/SConscript
===================================================================
--- trunk/blender/source/blender/blenkernel/SConscript	2008-02-09 23:11:05 UTC (rev 13619)
+++ trunk/blender/source/blender/blenkernel/SConscript	2008-02-09 23:17:15 UTC (rev 13620)
@@ -11,6 +11,7 @@
 incs += ' #/intern/bmfont'
 incs += ' #/intern/opennl/extern'
 
+incs += ' ' + env['BF_PYTHON_INC']
 incs += ' ' + env['BF_OPENGL_INC']
 incs += ' ' + env['BF_ZLIB_INC']
 incs += ' ' + env['BF_SDL_INC']

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2008-02-09 23:11:05 UTC (rev 13619)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2008-02-09 23:17:15 UTC (rev 13620)
@@ -27,6 +27,7 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
+#include <Python.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -34,6 +35,7 @@
 #include "DNA_image_types.h"
 #include "DNA_node_types.h"
 #include "DNA_material_types.h"
+#include "DNA_text_types.h"
 #include "DNA_scene_types.h"
 
 #include "BKE_blender.h"
@@ -44,6 +46,7 @@
 #include "BKE_main.h"
 #include "BKE_node.h"
 #include "BKE_texture.h"
+#include "BKE_text.h"
 #include "BKE_utildefines.h"
 
 #include "BLI_arithb.h"
@@ -72,7 +75,7 @@
 
 /* ************** Type stuff **********  */
 
-static bNodeType *node_get_type(bNodeTree *ntree, int type, bNodeTree *ngroup)
+static bNodeType *node_get_type(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
 {
 	if(type==NODE_GROUP) {
 		if(ngroup && GS(ngroup->id.name)==ID_NT) {
@@ -83,7 +86,7 @@
 	else {
 		bNodeType *ntype = ntree->alltypes.first;
 		for(; ntype; ntype= ntype->next)
-			if(ntype->type==type)
+			if(ntype->type==type && id==ntype->id )
 				return ntype;
 		
 		return NULL;
@@ -105,7 +108,27 @@
 	
 	for(node= ntree->nodes.first; node; node= next) {
 		next= node->next;
-		node->typeinfo= node_get_type(ntree, node->type, (bNodeTree *)node->id);
+		if(node->type==NODE_DYNAMIC) {
+			bNodeType *stype= NULL;
+			if(node->id==NULL) { /* empty script node */
+				stype= node_get_type(ntree, node->type, NULL, NULL);
+			} else { /* not an empty script node */
+				stype= node_get_type(ntree, node->type, NULL, node->id);
+				if(!stype) {
+					stype= node_get_type(ntree, node->type, NULL, NULL);
+					/* needed info if the pynode script fails now: */
+					if (node->id) node->storage= ntree;
+				} else {
+					node->custom1= 0;
+					node->custom1= BSET(node->custom1,NODE_DYNAMIC_ADDEXIST);
+				}
+			}
+			node->typeinfo= stype;
+			node->typeinfo->initfunc(node);
+		} else {
+			node->typeinfo= node_get_type(ntree, node->type, (bNodeTree *)node->id, NULL);
+		}
+
 		if(node->typeinfo==NULL) {
 			printf("Error: Node type %s doesn't exist anymore, removed\n", node->name);
 			nodeFreeNode(ntree, node);
@@ -115,6 +138,18 @@
 	ntree->init |= NTREE_TYPE_INIT;
 }
 
+/* updates node with (modified) bNodeType.. this should be done for all trees */
+void ntreeUpdateType(bNodeTree *ntree, bNodeType *ntype)
+{
+	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)
 {
@@ -137,7 +172,7 @@
 	
 	if(lb)
 		BLI_addtail(lb, sock);
-	
+
 	return sock;
 }
 
@@ -513,7 +548,7 @@
 	ntreeMakeOwnType(ngroup);
 	
 	/* make group node */
-	gnode= nodeAddNodeType(ntree, NODE_GROUP, ngroup);
+	gnode= nodeAddNodeType(ntree, NODE_GROUP, ngroup, NULL);
 	gnode->locx= 0.5f*(min[0]+max[0]);
 	gnode->locy= 0.5f*(min[1]+max[1]);
 	
@@ -767,29 +802,10 @@
 }
 
 /* ************** Add stuff ********** */
-
-bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup)
+void nodeAddSockets(bNode *node, bNodeType *ntype)
 {
-	bNode *node;
-	bNodeType *ntype= node_get_type(ntree, type, ngroup);
 	bNodeSocketType *stype;
-	
-	node= MEM_callocN(sizeof(bNode), "new node");
-	BLI_addtail(&ntree->nodes, node);
-	node->typeinfo= ntype;
-	
-	if(ngroup)
-		BLI_strncpy(node->name, ngroup->id.name+2, NODE_MAXSTR);
-	else
-		BLI_strncpy(node->name, ntype->name, NODE_MAXSTR);
-	node->type= ntype->type;
-	node->flag= NODE_SELECT|ntype->flag;
-	node->width= ntype->width;
-	node->miniwidth= 42.0f;		/* small value only, allows print of first chars */
-	
-	if(type==NODE_GROUP)
-		node->id= (ID *)ngroup;
-	
+
 	if(ntype->inputs) {
 		stype= ntype->inputs;
 		while(stype->type != -1) {
@@ -804,15 +820,86 @@
 			stype++;
 		}
 	}
-	
+}
+
+
+bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
+{
+	bNode *node= NULL;
+	bNodeType *ntype= NULL;
+
+	if(type>=NODE_DYNAMIC_MENU) {
+		int a=0, idx= type-NODE_DYNAMIC_MENU;
+		ntype= ntree->alltypes.first;
+		while(ntype) {
+			if(ntype->type==NODE_DYNAMIC) {
+				if(a==idx)
+					break;
+				a++;
+			}
+			ntype= ntype->next;
+		}
+	} else
+		ntype= node_get_type(ntree, type, ngroup, id);
+
+	node= MEM_callocN(sizeof(bNode), "new node");
+	BLI_addtail(&ntree->nodes, node);
+	node->typeinfo= ntype;
+	if(type>=NODE_DYNAMIC_MENU)
+		node->custom2= type; /* for node_dynamic_init */
+
+	if(ngroup)
+		BLI_strncpy(node->name, ngroup->id.name+2, NODE_MAXSTR);
+	else if(type>NODE_DYNAMIC_MENU) {
+		BLI_strncpy(node->name, ntype->id->name+2, NODE_MAXSTR);
+	}
+	else
+		BLI_strncpy(node->name, ntype->name, NODE_MAXSTR);
+	node->type= ntype->type;
+	node->flag= NODE_SELECT|ntype->flag;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list