Bugfix #25392
authorTon Roosendaal <ton@blender.org>
Mon, 27 Dec 2010 19:26:38 +0000 (19:26 +0000)
committerTon Roosendaal <ton@blender.org>
Mon, 27 Dec 2010 19:26:38 +0000 (19:26 +0000)
Compositor: Texture node didn't use texture-nodes itself.
Now composites initialize texture nodes correctly.

Also reviewed the fix for crashing texture nodes for displace.
It appears texture nodes also are used for sculpt/paint
brushes, in these cases it can be allowed again. But, don't
do this during rendering for now!

source/blender/blenkernel/intern/node.c
source/blender/modifiers/intern/MOD_util.c
source/blender/render/extern/include/RE_shader_ext.h
source/blender/render/intern/source/texture.c

index f52a538cc00ae6fc8fc1b1d65892a221e53fb2b9..0513593a0e067c14a77b41f54457c7160daa5bff 100644 (file)
@@ -2474,6 +2474,25 @@ static bNode *getExecutableNode(bNodeTree *ntree)
        return NULL;
 }
 
+/* check if texture nodes need exec or end */
+static  void ntree_composite_texnode(bNodeTree *ntree, int init)
+{
+       bNode *node;
+       
+       for(node= ntree->nodes.first; node; node= node->next) {
+               if(node->type==CMP_NODE_TEXTURE && node->id) {
+                       Tex *tex= (Tex *)node->id;
+                       if(tex->nodetree && tex->use_nodes) {
+                               /* has internal flag to detect it only does it once */
+                               if(init)
+                                       ntreeBeginExecTree(tex->nodetree); 
+                               else
+                                       ntreeEndExecTree(tex->nodetree);
+                       }
+               }
+       }
+
+}
 
 /* optimized tree execute test for compositing */
 void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
@@ -2489,6 +2508,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
                ntreeInitPreview(ntree, 0, 0);
        
        ntreeBeginExecTree(ntree);
+       ntree_composite_texnode(ntree, 1);
        
        /* prevent unlucky accidents */
        if(G.background)
index de96684a2dd6aa681cb775e149c21cbe26a54528..cbf2bd8af4b0ce15a7afad8c36c5cef47da81aad 100644 (file)
@@ -53,7 +53,8 @@ void get_texture_value(Tex *texture, float *tex_co, TexResult *texres)
 {
        int result_type;
 
-       result_type = multitex_ext(texture, tex_co, NULL, NULL, 0, texres);
+       /* no node textures for now */
+       result_type = multitex_ext_safe(texture, tex_co, texres);
 
        /* if the texture gave an RGB value, we assume it didn't give a valid
        * intensity, so calculate one (formula from do_material_tex).
index 71ce269fce69e971aeadda9dcf355a4404530c65..26e34a741f756ecb6da59e168d7d713b29dcdbd9 100644 (file)
@@ -189,7 +189,11 @@ typedef struct ShadeInput
 /* node shaders... */
 struct Tex;
 struct MTex;
+/* this one uses nodes */
 int    multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres);
+/* nodes disabled */
+int multitex_ext_safe(struct Tex *tex, float *texvec, struct TexResult *texres);
+/* only for internal node usage */
 int multitex_nodes(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres,
        short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex);
 
index 9e3c3c4e1d6baebbc564d4a4f41f630192099fe5..684732c10d316abc7a6fb05805300f08a6a05228 100644 (file)
@@ -1348,18 +1348,24 @@ int multitex_mtex(ShadeInput *shi, MTex *mtex, float *texvec, float *dxt, float
 
 /* Warning, if the texres's values are not declared zero, check the return value to be sure
  * the color values are set before using the r/g/b values, otherwise you may use uninitialized values - Campbell */
-/* extern-tex doesn't support nodes (ntreeBeginExec() can't be called when rendering is going on) */
 int multitex_ext(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexResult *texres)
+{
+       return multitex_nodes(tex, texvec, dxt, dyt, osatex, texres, 0, 0, NULL, NULL);
+}
+
+/* extern-tex doesn't support nodes (ntreeBeginExec() can't be called when rendering is going on) */
+int multitex_ext_safe(Tex *tex, float *texvec, TexResult *texres)
 {
        int use_nodes= tex->use_nodes, retval;
        
        tex->use_nodes= 0;
-       retval= multitex_nodes(tex, texvec, dxt, dyt, osatex, texres, 0, 0, NULL, NULL);
+       retval= multitex_nodes(tex, texvec, NULL, NULL, 0, texres, 0, 0, NULL, NULL);
        tex->use_nodes= use_nodes;
        
        return retval;
 }
 
+
 /* ------------------------------------------------------------------------- */
 
 /* in = destination, tex = texture, out = previous color */