diff options
author | Ton Roosendaal <ton@blender.org> | 2006-06-03 17:26:39 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-06-03 17:26:39 +0400 |
commit | 9ab30b4acb7d6c965c2dd1528cfbb0dad4ad66d8 (patch) | |
tree | bb1cd6c39d4721957ee894047e28f2b32efb5d32 /source/blender/blenkernel/intern/material.c | |
parent | 71f349e9ddfadba6db0ddfd330b86424aa276b40 (diff) |
Patch from Fred van Essen: six new blending modes.
http://mediawiki.blender.org/index.php/BlenderDev/BlendingModes
Functional in Node editor and Material Ramps.
Diffstat (limited to 'source/blender/blenkernel/intern/material.c')
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 90 |
1 files changed, 89 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index c3d35eb1d52..1999c6890e5 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -48,6 +48,7 @@ #include "DNA_texture_types.h" #include "BLI_blenlib.h" +#include "BLI_arithb.h" #include "BKE_bad_level_calls.h" #include "BKE_blender.h" @@ -892,7 +893,94 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col) tmp= fac*col[2]; if(tmp > *b) *b= tmp; } - break; + break; + case MA_RAMP_DODGE: + tmp = 1.0 - fac*col[0]; + if(tmp == 0.0) + *r = 1.0; + else if ((*r = (*r) / tmp)> 1.0) + *r = 1.0; + if(g) { + tmp = 1.0 - fac*col[1]; + if(tmp == 0.0) + *g = 1.0; + else if ((*g = (*g) / tmp) > 1.0) + *g = 1.0; + + tmp = 1.0 - fac*col[2]; + if(tmp == 0.0) + *b = 1.0; + else if ((*b = (*b) / tmp) > 1.0) + *b = 1.0; + } + break; + case MA_RAMP_BURN: + + tmp = facm + fac*col[0]; + + if(tmp == 0.0) + *r = 0.0; + else if (( (*r) = (1.0 - (1.0 - (*r)) / tmp )) < 0.0 ) + *r = 0.0; + if(g) { + tmp = facm + fac*col[1]; + if(tmp == 0.0) + *g = 0.0; + else if (( (*g) = (1.0 - (1.0 - (*g)) / tmp )) < 0.0 ) + *g = 0.0; + + tmp = facm + fac*col[2]; + if(tmp == 0.0) + *b = 0.0; + else if (( (*b) = (1.0 - (1.0 - (*b)) / tmp )) < 0.0 ) + *b = 0.0; + } + break; + case MA_RAMP_HUE: + if(g){ + float rH,rS,rV; + float colH,colS,colV; + float tmpr,tmpg,tmpb; + rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV); + rgb_to_hsv(col[0],col[1],col[2],&colH,&colS,&colV); + hsv_to_rgb( colH , rS, rV, &tmpr, &tmpg, &tmpb); + *r = facm*(*r) + fac*tmpr; + *g = facm*(*g) + fac*tmpg; + *b = facm*(*b) + fac*tmpb; + + } + break; + case MA_RAMP_SAT: + if(g){ + float rH,rS,rV; + float colH,colS,colV; + rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV); + rgb_to_hsv(col[0],col[1],col[2],&colH,&colS,&colV); + hsv_to_rgb( rH, (facm*rS +fac*colS), rV, r, g, b); + } + break; + case MA_RAMP_VAL: + if(g){ + float rH,rS,rV; + float colH,colS,colV; + rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV); + rgb_to_hsv(col[0],col[1],col[2],&colH,&colS,&colV); + hsv_to_rgb( rH, rS, (facm*rV +fac*colV), r, g, b); + } + break; + case MA_RAMP_COLOR: + if(g){ + float rH,rS,rV; + float colH,colS,colV; + float tmpr,tmpg,tmpb; + rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV); + rgb_to_hsv(col[0],col[1],col[2],&colH,&colS,&colV); + hsv_to_rgb( colH, colS, rV, &tmpr, &tmpg, &tmpb); + *r = facm*(*r) + fac*tmpr; + *g = facm*(*g) + fac*tmpg; + *b = facm*(*b) + fac*tmpb; + } + break; } } |