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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to