diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-03-19 04:59:36 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-03-19 04:59:36 +0300 |
commit | 255b07681acfe2ce8dd3af7d5b032d3c759cb93e (patch) | |
tree | 0e479ab1e5a25ac3082259ea519dda9b399ffdd6 /source/blender/render/intern | |
parent | ce11e1c878fa5fffb4ab0a5d0a4b453dc21b8c2e (diff) |
Color managed luminance for shader ramp-in-energy
Diffstat (limited to 'source/blender/render/intern')
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 69 |
1 files changed, 44 insertions, 25 deletions
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 586345d1eb4..b29038b2c34 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -962,7 +962,7 @@ static void ramp_diffuse_result(float *diff, ShadeInput *shi) } /* r,g,b denote energy, ramp is used with different values to make new material color */ -static void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, float b) +static void add_to_diffuse(float diff[3], const ShadeInput *shi, const float is, const float rgb[3]) { Material *ma= shi->mat; @@ -971,9 +971,9 @@ static void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, floa /* MA_RAMP_IN_RESULT is exceptional */ if (ma->rampin_col==MA_RAMP_IN_RESULT) { /* normal add */ - diff[0] += r * shi->r; - diff[1] += g * shi->g; - diff[2] += b * shi->b; + diff[0] += rgb[0] * shi->r; + diff[1] += rgb[1] * shi->g; + diff[2] += rgb[2] * shi->b; } else { float colt[3], col[4]; @@ -982,40 +982,37 @@ static void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, floa /* input */ switch (ma->rampin_col) { case MA_RAMP_IN_ENERGY: - /* should use 'IMB_colormanagement_get_luminance' but we only have a vector version */ - fac= 0.3f*r + 0.58f*g + 0.12f*b; + fac = IMB_colormanagement_get_luminance(rgb); break; case MA_RAMP_IN_SHADER: - fac= is; + fac = is; break; case MA_RAMP_IN_NOR: - fac= shi->view[0]*shi->vn[0] + shi->view[1]*shi->vn[1] + shi->view[2]*shi->vn[2]; + fac = dot_v3v3(shi->view, shi->vn); break; default: - fac= 0.0f; + fac = 0.0f; break; } do_colorband(ma->ramp_col, fac, col); /* blending method */ - fac= col[3]*ma->rampfac_col; - colt[0]= shi->r; - colt[1]= shi->g; - colt[2]= shi->b; + fac = col[3] * ma->rampfac_col; + copy_v3_v3(colt, &shi->r); ramp_blend(ma->rampblend_col, colt, fac, col); /* output to */ - diff[0] += r * colt[0]; - diff[1] += g * colt[1]; - diff[2] += b * colt[2]; + diff[0] += rgb[0] * colt[0]; + diff[1] += rgb[1] * colt[1]; + diff[2] += rgb[2] * colt[2]; } } else { - diff[0] += r * shi->r; - diff[1] += g * shi->g; - diff[2] += b * shi->b; + diff[0] += rgb[0] * shi->r; + diff[1] += rgb[1] * shi->g; + diff[2] += rgb[2] * shi->b; } } @@ -1484,20 +1481,42 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int /* in case 'no diffuse' we still do most calculus, spec can be in shadow.*/ if (!(lar->mode & LA_NO_DIFF)) { if (i>0.0f) { - if (ma->mode & MA_SHADOW_TRA) - add_to_diffuse(shr->shad, shi, is, i*shadfac[0]*lacol[0], i*shadfac[1]*lacol[1], i*shadfac[2]*lacol[2]); - else - add_to_diffuse(shr->shad, shi, is, i*lacol[0], i*lacol[1], i*lacol[2]); + if (ma->mode & MA_SHADOW_TRA) { + const float tcol[3] = { + i * shadfac[0] * lacol[0], + i * shadfac[1] * lacol[1], + i * shadfac[2] * lacol[2], + }; + add_to_diffuse(shr->shad, shi, is, tcol); + } + else { + const float tcol[3] = { + i * lacol[0], + i * lacol[1], + i * lacol[2], + }; + add_to_diffuse(shr->shad, shi, is, tcol); + } } /* add light for colored shadow */ if (i_noshad>i && !(lashdw[0]==0 && lashdw[1]==0 && lashdw[2]==0)) { - add_to_diffuse(shr->shad, shi, is, lashdw[0]*(i_noshad-i)*lacol[0], lashdw[1]*(i_noshad-i)*lacol[1], lashdw[2]*(i_noshad-i)*lacol[2]); + const float tcol[3] = { + lashdw[0] * (i_noshad - i) * lacol[0], + lashdw[1] * (i_noshad - i) * lacol[1], + lashdw[2] * (i_noshad - i) * lacol[2], + }; + add_to_diffuse(shr->shad, shi, is, tcol); } if (i_noshad>0.0f) { if (passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW) || ((passflag & SCE_PASS_COMBINED) && !(shi->combinedflag & SCE_PASS_SHADOW))) { - add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]); + const float tcol[3] = { + i_noshad * lacol[0], + i_noshad * lacol[1], + i_noshad * lacol[2] + }; + add_to_diffuse(shr->diff, shi, is, tcol); } else { copy_v3_v3(shr->diff, shr->shad); |