diff options
Diffstat (limited to 'source/blender/render/intern/source/shadeoutput.c')
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 0ed3a094cf8..fde4eab37b0 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -864,16 +864,22 @@ void shade_color(ShadeInput *shi, ShadeResult *shr) { Material *ma= shi->mat; - if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) { + if(ma->mode & (MA_FACETEXTURE)) { shi->r= shi->vcol[0]; shi->g= shi->vcol[1]; shi->b= shi->vcol[2]; if(ma->mode & (MA_FACETEXTURE_ALPHA)) shi->alpha= shi->vcol[3]; } + else if(ma->mode & (MA_VERTEXCOLP)) { + float neg_alpha = 1.0f - shi->vcol[3]; + shi->r= shi->r*neg_alpha + shi->vcol[0]*shi->vcol[3]; + shi->g= shi->g*neg_alpha + shi->vcol[1]*shi->vcol[3]; + shi->b= shi->b*neg_alpha + shi->vcol[2]*shi->vcol[3]; + } if(ma->texco) - do_material_tex(shi); + do_material_tex(shi, &R); if(ma->fresnel_tra!=0.0f) shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra); @@ -1655,15 +1661,21 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) /* material color itself */ if(passflag & (SCE_PASS_COMBINED|SCE_PASS_RGBA)) { - if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) { + if(ma->mode & (MA_FACETEXTURE)) { shi->r= shi->vcol[0]; shi->g= shi->vcol[1]; shi->b= shi->vcol[2]; if(ma->mode & (MA_FACETEXTURE_ALPHA)) - shi->alpha= (shi->mode & MA_TRANSP) ? shi->vcol[3] : 1.0f; + shi->alpha= shi->vcol[3]; + } + else if(ma->mode & (MA_VERTEXCOLP)) { + float neg_alpha = 1.0f - shi->vcol[3]; + shi->r= shi->r*neg_alpha + shi->vcol[0]*shi->vcol[3]; + shi->g= shi->g*neg_alpha + shi->vcol[1]*shi->vcol[3]; + shi->b= shi->b*neg_alpha + shi->vcol[2]*shi->vcol[3]; } if(ma->texco){ - do_material_tex(shi); + do_material_tex(shi, &R); if (!(shi->mode & MA_TRANSP)) shi->alpha = 1.0f; } |