Blender Internal: Add material property "Cast" which can disable both ray and buffer...
[blender.git] / source / blender / blenkernel / intern / material.c
index 01bbd1db0037c02d729ac667d1c5e10af2219b3f..1ee84fb00583196e92625e580227a9485b388cfa 100644 (file)
@@ -203,6 +203,7 @@ void init_material(Material *ma)
        ma->game.face_orientation = 0;
        
        ma->mode = MA_TRACEBLE | MA_SHADBUF | MA_SHADOW | MA_RAYBIAS | MA_TANGENT_STR | MA_ZTRANSP;
+       ma->mode2 = MA_CASTSHADOW;
        ma->shade_flag = MA_APPROX_OCCLUSION;
        ma->preview = NULL;
 }
@@ -1009,16 +1010,6 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
                ma->ambg = ma->amb * amb[1];
                ma->ambb = ma->amb * amb[2];
        }
-       /* will become or-ed result of all node modes */
-       ma->mode_l = ma->mode;
-       ma->mode_l &= ~MA_SHLESS;
-
-       if (ma->strand_surfnor > 0.0f)
-               ma->mode_l |= MA_STR_SURFDIFF;
-
-       /* parses the geom+tex nodes */
-       if (ma->nodetree && ma->use_nodes)
-               ntreeShaderGetTexcoMode(ma->nodetree, r_mode, &ma->texco, &ma->mode_l);
 
        /* local group override */
        if ((ma->shade_flag & MA_GROUP_LOCAL) && ma->id.lib && ma->group && ma->group->id.lib) {
@@ -1043,8 +1034,16 @@ static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode
                                if (ma != basemat) {
                                        do_init_render_material(ma, r_mode, amb);
                                        basemat->texco |= ma->texco;
-                                       basemat->mode_l |= ma->mode_l & ~(MA_TRANSP | MA_ZTRANSP | MA_RAYTRANSP);
                                }
+
+                               basemat->mode_l |= ma->mode & ~(MA_MODE_PIPELINE | MA_SHLESS);
+                               basemat->mode2_l |= ma->mode2 & ~MA_MODE2_PIPELINE;
+                               /* basemat only considered shadeless if all node materials are too */
+                               if(!(ma->mode & MA_SHLESS))
+                                       basemat->mode_l &= ~MA_SHLESS;
+
+                               if (ma->strand_surfnor > 0.0f)
+                                       basemat->mode_l |= MA_STR_SURFDIFF;
                        }
                        else if (node->type == NODE_GROUP)
                                init_render_nodetree((bNodeTree *)node->id, basemat, r_mode, amb);
@@ -1058,11 +1057,27 @@ void init_render_material(Material *mat, int r_mode, float *amb)
        do_init_render_material(mat, r_mode, amb);
        
        if (mat->nodetree && mat->use_nodes) {
+               /* mode_l will take the pipeline options from the main material, and the or-ed
+                * result of non-pipeline options from the nodes. shadeless is an exception,
+                * mode_l will have it set when all node materials are shadeless. */
+               mat->mode_l = (mat->mode & MA_MODE_PIPELINE) | MA_SHLESS;
+               mat->mode2_l = mat->mode2 & MA_MODE2_PIPELINE;
+
+               /* parses the geom+tex nodes */
+               ntreeShaderGetTexcoMode(mat->nodetree, r_mode, &mat->texco, &mat->mode_l);
+
                init_render_nodetree(mat->nodetree, mat, r_mode, amb);
                
                if (!mat->nodetree->execdata)
                        mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree);
        }
+       else {
+               mat->mode_l = mat->mode;
+               mat->mode2_l = mat->mode2;
+
+               if (mat->strand_surfnor > 0.0f)
+                       mat->mode_l |= MA_STR_SURFDIFF;
+       }
 }
 
 void init_render_materials(Main *bmain, int r_mode, float *amb)
@@ -1087,7 +1102,7 @@ void init_render_materials(Main *bmain, int r_mode, float *amb)
                        init_render_material(ma, r_mode, amb);
        }
        
-       do_init_render_material(&defmaterial, r_mode, amb);
+       init_render_material(&defmaterial, r_mode, amb);
 }
 
 /* only needed for nodes now */