[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17425] trunk/blender/source: Patch #7897 Texture Nodes!

Ton Roosendaal ton at blender.org
Wed Nov 12 20:03:50 CET 2008


Revision: 17425
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17425
Author:   ton
Date:     2008-11-12 20:03:50 +0100 (Wed, 12 Nov 2008)

Log Message:
-----------
Patch #7897 Texture Nodes!

Robin (Frrr) Allen did a decent job on this, so we can also welcome him
as a member in the svn committers team to maintain it!

I do the first commit with some minor fixes:
- get Makefiles work
- fix rounding issue with tiles on unit faces
- removed UI includes from tex node

A nice doc in wiki is here:
http://wiki.blender.org/index.php/User:Frr/TexnodeManual

On the todo for Robin is:
- When using one or more Texture-input nodes, you cannot edit them by activating
  (as works now for Material nodes).
- The new "output node" option fails on the default case, when only one
  output node is active. It then shows often a blank menu. Will get fixed asap.
- When using a NodeTree-Texture as input node, the menu for 'active output'
  should not show. NodeTree should ignore other nodetrees to keep things sane
  for now.
- On a future todo is proper usage of "Dxt" and "Dyt" texture vectors for
  superior antialising of checkers/bricks.

General note; I know people are dying to get a full integrated shader system
with nodes. In theory we could merge this with Material Nodetrees... but I 
rather wait for a solid and very well thought out design proposal for this, 
also including design ideas for unifying with a shader language (GPU, CPU).
For the time being this is a nice extension of current textures. :)

Modified Paths:
--------------
    trunk/blender/source/Makefile
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/include/BSE_node.h
    trunk/blender/source/blender/include/blendef.h
    trunk/blender/source/blender/include/butspace.h
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesdna/DNA_texture_types.h
    trunk/blender/source/blender/nodes/Makefile
    trunk/blender/source/blender/nodes/SConscript
    trunk/blender/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
    trunk/blender/source/blender/nodes/intern/SHD_util.c
    trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
    trunk/blender/source/blender/render/intern/include/pixelshading.h
    trunk/blender/source/blender/render/intern/include/texture.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/pixelshading.c
    trunk/blender/source/blender/render/intern/source/rayshade.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/texture.c
    trunk/blender/source/blender/src/butspace.c
    trunk/blender/source/blender/src/buttons_shading.c
    trunk/blender/source/blender/src/drawnode.c
    trunk/blender/source/blender/src/editnode.c
    trunk/blender/source/blender/src/header_node.c
    trunk/blender/source/blender/src/headerbuttons.c
    trunk/blender/source/blender/src/toolbox.c

Modified: trunk/blender/source/Makefile
===================================================================
--- trunk/blender/source/Makefile	2008-11-12 16:04:14 UTC (rev 17424)
+++ trunk/blender/source/Makefile	2008-11-12 19:03:50 UTC (rev 17425)
@@ -97,6 +97,7 @@
 COMLIB += $(OCGDIR)/blender/blenpluginapi/$(DEBUG_DIR)libblenpluginapi.a
 COMLIB += $(OCGDIR)/blender/nodes_shd/$(DEBUG_DIR)libnodes_shd.a
 COMLIB += $(OCGDIR)/blender/nodes_cmp/$(DEBUG_DIR)libnodes_cmp.a
+COMLIB += $(OCGDIR)/blender/nodes_tex/$(DEBUG_DIR)libnodes_tex.a
 COMLIB += $(OCGDIR)/blender/nodes/$(DEBUG_DIR)libnodes.a
 COMLIB += $(OCGDIR)/blender/imbuf/$(DEBUG_DIR)libimbuf.a
 COMLIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2008-11-12 16:04:14 UTC (rev 17424)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2008-11-12 19:03:50 UTC (rev 17425)
@@ -47,6 +47,7 @@
 struct ListBase;
 struct RenderData;
 struct Scene;
+struct Tex;
 struct GPUMaterial;
 struct GPUNode;
 struct GPUNodeStack;
@@ -118,6 +119,8 @@
 #define NODE_CLASS_MATTE		9
 #define NODE_CLASS_DISTORT		10
 #define NODE_CLASS_OP_DYNAMIC	11
+#define NODE_CLASS_PATTERN 12
+#define NODE_CLASS_TEXTURE 13
 
 /* ************** GENERIC API, TREES *************** */
 
@@ -377,6 +380,45 @@
 
 void free_compbuf(struct CompBuf *cbuf); /* internal...*/
 
+
+/* ************** TEXTURE NODES *************** */
+
+struct TexResult;
+
+#define TEX_NODE_OUTPUT     101
+#define TEX_NODE_CHECKER    102
+#define TEX_NODE_TEXTURE    103
+#define TEX_NODE_BRICKS     104
+#define TEX_NODE_MATH       105
+#define TEX_NODE_MIX_RGB    106
+#define TEX_NODE_RGBTOBW    107
+#define TEX_NODE_VALTORGB   108
+#define TEX_NODE_IMAGE      109
+#define TEX_NODE_CURVE_RGB  110
+#define TEX_NODE_INVERT     111
+#define TEX_NODE_HUE_SAT    112
+#define TEX_NODE_CURVE_TIME 113
+#define TEX_NODE_ROTATE     114
+#define TEX_NODE_VIEWER     115
+#define TEX_NODE_TRANSLATE  116
+
+/* 201-299 reserved. Use like this: TEX_NODE_PROC + TEX_CLOUDS, etc */
+#define TEX_NODE_PROC      200
+#define TEX_NODE_PROC_MAX  300
+
+extern struct ListBase node_all_textures;
+
+/* API */
+int  ntreeTexTagAnimated(struct bNodeTree *ntree);
+void ntreeTexUpdatePreviews( struct bNodeTree* nodetree );
+void ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, char do_preview, short thread, struct Tex *tex, short which_output);
+void ntreeTexCheckCyclics(struct bNodeTree *ntree);
+void ntreeTexAssignIndex(struct bNodeTree *ntree, struct bNode *node);
+char* ntreeTexOutputMenu(struct bNodeTree *ntree);
+
+
+/**/
+
 void init_nodesystem(void);
 void free_nodesystem(void);
 

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2008-11-12 16:04:14 UTC (rev 17424)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2008-11-12 19:03:50 UTC (rev 17425)
@@ -597,6 +597,8 @@
 
 	if(GS(id->name)==ID_MA)
 		isnode= ((Material *)id)->use_nodes;
+	if(GS(id->name)==ID_TE)
+		isnode= ((Tex *)id)->use_nodes;
 	
 	if (id->us<0)
 		sprintf(buf, "-1W ");

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2008-11-12 16:04:14 UTC (rev 17424)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2008-11-12 19:03:50 UTC (rev 17425)
@@ -650,7 +650,7 @@
 		if(ma->septex & (1<<a)) continue;
 
 		mtex= ma->mtex[a];
-		if(mtex && mtex->tex && mtex->tex->type) {
+		if(mtex && mtex->tex && (mtex->tex->type | (mtex->tex->use_nodes && mtex->tex->nodetree) )) {
 			
 			ma->texco |= mtex->texco;
 			ma->mapto |= mtex->mapto;

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2008-11-12 16:04:14 UTC (rev 17424)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2008-11-12 19:03:50 UTC (rev 17425)
@@ -38,6 +38,7 @@
 #include "DNA_image_types.h"
 #include "DNA_node_types.h"
 #include "DNA_material_types.h"
+#include "DNA_texture_types.h"
 #include "DNA_text_types.h"
 #include "DNA_scene_types.h"
 
@@ -70,6 +71,8 @@
 #include "intern/CMP_util.h"	/* stupid include path... */
 
 #include "SHD_node.h"
+#include "TEX_node.h"
+#include "intern/TEX_util.h"
 
 #include "GPU_extensions.h"
 #include "GPU_material.h"
@@ -77,6 +80,7 @@
 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 **********  */
 
@@ -106,6 +110,8 @@
 		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");
@@ -661,6 +667,28 @@
 			}
 		}
 	}
+	else if(ngroup->type==NTREE_TEXTURE) {
+		Tex *tx;
+		for(tx= G.main->tex.first; tx; tx= tx->id.next) {
+			if(tx->nodetree) {
+				bNode *node;
+				
+				/* find if group is in tree */
+				for(node= tx->nodetree->nodes.first; node; node= node->next)
+					if(node->id == (ID *)ngroup)
+						break;
+				
+				if(node) {
+					/* set all type pointers OK */
+					ntreeInitTypes(tx->nodetree);
+					
+					for(node= tx->nodetree->nodes.first; node; node= node->next)
+						if(node->id == (ID *)ngroup)
+							nodeVerifyType(tx->nodetree, node);
+				}
+			}
+		}
+	}
 }
 
 /* also to check all users of groups. Now only used in editor for hide/unhide */
@@ -717,6 +745,26 @@
 			}
 		}
 	}
+	else if(ngroup->type==NTREE_TEXTURE) {
+		Tex *tx;
+		for(tx= G.main->tex.first; tx; tx= tx->id.next) {
+			if(tx->nodetree) {
+				for(node= tx->nodetree->nodes.first; node; node= node->next) {
+					if(node->id==(ID *)ngroup) {
+						for(sock= node->inputs.first; sock; sock= sock->next)
+							if(sock->link)
+								if(sock->tosock) 
+									sock->tosock->flag |= SOCK_IN_USE;
+						for(sock= node->outputs.first; sock; sock= sock->next)
+							if(nodeCountSocketLinks(tx->nodetree, sock))
+								if(sock->tosock) 
+									sock->tosock->flag |= SOCK_IN_USE;
+					}
+				}
+			}
+		}
+	}
+	
 }
 
 /* finds a node based on given socket */
@@ -901,9 +949,12 @@
 	/* got it-bob*/
 	if(ntype->initfunc!=NULL)
 		ntype->initfunc(node);
+	
+	if(type==TEX_NODE_OUTPUT)
+		ntreeTexAssignIndex(ntree, node);
 
 	nodeAddSockets(node, ntype);
-
+	
 	return node;
 }
 
@@ -970,6 +1021,9 @@
 	node->new_node= nnode;
 	nnode->new_node= NULL;
 	nnode->preview= NULL;
+	
+	if(node->type==TEX_NODE_OUTPUT)
+		ntreeTexAssignIndex(ntree, node);
 
 	return nnode;
 }
@@ -1260,6 +1314,22 @@
 			}
 		}
 	}
+	else if(ntree->type==NTREE_TEXTURE) {
+		Tex *tx;
+		for(tx= G.main->tex.first; tx; tx= tx->id.next) {
+			if(tx->nodetree) {
+				bNode *node;
+				
+				/* find if group is in tree */
+				for(node= tx->nodetree->nodes.first; node; node= node->next) {
+					if(node->id == (ID *)ntree) {
+						if(tx->id.lib) lib= 1;
+						else local= 1;
+					}
+				}
+			}
+		}
+	}
 	
 	/* if all users are local, we simply make tree local */
 	if(local && lib==0) {
@@ -1311,6 +1381,25 @@
 				}
 			}
 		}
+		else if(ntree->type==NTREE_TEXTURE) {
+			Tex *tx;
+			for(tx= G.main->tex.first; tx; tx= tx->id.next) {
+				if(tx->nodetree) {
+					bNode *node;
+					
+					/* find if group is in tree */
+					for(node= tx->nodetree->nodes.first; node; node= node->next) {
+						if(node->id == (ID *)ntree) {
+							if(tx->id.lib==NULL) {
+								node->id= &newtree->id;
+								newtree->id.us++;
+								ntree->id.us--;
+							}
+						}
+					}
+				}
+			}
+		}
 	}
 }
 
@@ -1575,6 +1664,8 @@
 		}
 		node->need_exec= 1;
 	}
+	else if(ntree->type == NTREE_TEXTURE)
+		ntreeTexUpdatePreviews(ntree);
 }
 
 void NodeTagIDChanged(bNodeTree *ntree, ID *id)
@@ -1813,7 +1904,7 @@
 					sock->ns.data= NULL;
 				}
 			}
-		}		
+		}
 		/* cannot initialize them while using in threads */
 		if(ELEM3(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB)) {
 			curvemapping_initialize(node->storage);
@@ -1929,12 +2020,28 @@
 	nts->used= 0;
 }
 
+/* free texture delegates */
+static void tex_end_exec(bNodeTree *ntree)
+{
+	bNodeThreadStack *nts;
+	bNodeStack *ns;
+	int th, a;
+	
+	if(ntree->threadstack)
+		for(th=0; th<BLENDER_MAX_THREADS; th++)
+			for(nts=ntree->threadstack[th].first; nts; nts=nts->next)
+				for(ns= nts->stack, a=0; a<ntree->stacksize; a++, ns++)
+					if(ns->data)
+						MEM_freeN(ns->data);
+						
+}
+
 void ntreeBeginExecTree(bNodeTree *ntree)
 {
 	/* let's make it sure */
 	if(ntree->init & NTREE_EXEC_INIT)
 		return;
-
+	
 	/* allocate the thread stack listbase array */
 	if(ntree->type!=NTREE_COMPOSIT)
 		ntree->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array");
@@ -1986,6 +2093,8 @@
 		/* another callback candidate! */
 		if(ntree->type==NTREE_COMPOSIT)
 			composit_end_exec(ntree, 0);
+		else if(ntree->type==NTREE_TEXTURE)
+			tex_end_exec(ntree);
 		
 		if(ntree->stack) {
 			MEM_freeN(ntree->stack);
@@ -2622,6 +2731,27 @@
 	}
 }
 
+int ntreeTexTagAnimated(bNodeTree *ntree)
+{
+	bNode *node;
+	
+	if(ntree==NULL) return 0;
+	
+	for(node= ntree->nodes.first; node; node= node->next) {
+		if(node->type==TEX_NODE_CURVE_TIME) {
+			NodeTagChanged(ntree, node);
+			return 1;
+		}
+		else if(node->type==NODE_GROUP) {
+			if( ntreeTexTagAnimated((bNodeTree *)node->id) ) {
+				return 1;
+			}
+		}
+	}
+	
+	return 0;
+}
+
 /* ************* node definition init ********** */
 
 static bNodeType *is_nodetype_registered(ListBase *typelist, int type, ID *id) 
@@ -2745,6 +2875,41 @@
 	nodeRegisterType(ntypelist, &sh_node_hue_sat);
 }
 
+static void registerTextureNodes(ListBase *ntypelist)
+{
+	nodeRegisterType(ntypelist, &node_group_typeinfo);
+	nodeRegisterType(ntypelist, &tex_node_math);
+	nodeRegisterType(ntypelist, &tex_node_mix_rgb);
+	nodeRegisterType(ntypelist, &tex_node_valtorgb);
+	nodeRegisterType(ntypelist, &tex_node_rgbtobw);
+	nodeRegisterType(ntypelist, &tex_node_curve_rgb);
+	nodeRegisterType(ntypelist, &tex_node_curve_time);
+	nodeRegisterType(ntypelist, &tex_node_invert);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list