From fc28732ba65a57bccd47940249999809c2c93eb0 Mon Sep 17 00:00:00 2001 From: IRIE Shinsuke Date: Wed, 23 Apr 2014 15:02:06 +0900 Subject: Blender Internal: Add material property "Cast" which can disable both ray and buffer shadows. Also refactor: - Material property UI related to shadows - Preparation of OR-ed mode flags (ma->mode_l) of render materials Reviewers: brecht Reviewed By: brecht Differential Revision: https://developer.blender.org/D313 --- source/blender/blenkernel/intern/material.c | 39 ++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'source/blender/blenkernel/intern/material.c') diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 01bbd1db003..1ee84fb0058 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -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 */ -- cgit v1.2.3