Blend method fixes by Fred van Essen.

Also renames "Lightness" to "Value".
This commit is contained in:
Ton Roosendaal 2006-06-05 09:55:39 +00:00
parent 6f0d7e8d1f
commit 6d98cce4a6
3 changed files with 71 additions and 39 deletions

View File

@ -894,60 +894,88 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
if(tmp > *b) *b= tmp;
}
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;
case MA_RAMP_DODGE:
tmp = 1.0 - fac*col[2];
if(tmp == 0.0)
*b = 1.0;
else if ((*b = (*b) / tmp) > 1.0)
*b = 1.0;
if(*r !=0.0){
tmp = 1.0 - fac*col[0];
if(tmp <= 0.0)
*r = 1.0;
else if ((tmp = (*r) / tmp)> 1.0)
*r = 1.0;
else
*r = tmp;
}
if(g) {
if(*g !=0.0){
tmp = 1.0 - fac*col[1];
if(tmp <= 0.0 )
*g = 1.0;
else if ((tmp = (*g) / tmp) > 1.0 )
*g = 1.0;
else
*g = tmp;
}
if(*b !=0.0){
tmp = 1.0 - fac*col[2];
if(tmp <= 0.0)
*b = 1.0;
else if ((tmp = (*b) / tmp) > 1.0 )
*b = 1.0;
else
*b = tmp;
}
}
break;
case MA_RAMP_BURN:
tmp = facm + fac*col[0];
if(tmp == 0.0)
if(tmp <= 0.0)
*r = 0.0;
else if (( (*r) = (1.0 - (1.0 - (*r)) / tmp )) < 0.0 )
else if (( tmp = (1.0 - (1.0 - (*r)) / tmp )) < 0.0)
*r = 0.0;
else if (tmp > 1.0)
*r=1.0;
else
*r = tmp;
if(g) {
tmp = facm + fac*col[1];
if(tmp == 0.0)
if(tmp <= 0.0)
*g = 0.0;
else if (( (*g) = (1.0 - (1.0 - (*g)) / tmp )) < 0.0 )
else if (( tmp = (1.0 - (1.0 - (*g)) / tmp )) < 0.0 )
*g = 0.0;
else if(tmp >1.0)
*g=1.0;
else
*g = tmp;
tmp = facm + fac*col[2];
if(tmp == 0.0)
if(tmp <= 0.0)
*b = 0.0;
else if (( (*b) = (1.0 - (1.0 - (*b)) / tmp )) < 0.0 )
else if (( tmp = (1.0 - (1.0 - (*b)) / tmp )) < 0.0 )
*b = 0.0;
else if(tmp >1.0)
*b= 1.0;
else
*b = tmp;
}
break;
case MA_RAMP_HUE:
if(g){
float rH,rS,rV;
float colH,colS,colV;
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;
if(colS!=0 ){
rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV);
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:
@ -955,8 +983,10 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
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);
if(rS!=0){
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:
@ -973,12 +1003,14 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
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;
if(colS!=0){
rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV);
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;
}

View File

@ -3033,7 +3033,7 @@ static void material_panel_ramps(Material *ma)
uiDefBut(block, LABEL, 0, "Factor",190,30,120,20, NULL, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButC(block, MENU, B_MATPRV, "Shader %x0|Energy %x1|Normal %x2|Result %x3",10,10,90,20, inputc, 0, 0, 0, 0, "Input for Ramp");
uiDefButC(block, MENU, B_MATPRV, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Overlay %x9|Divide %x5|Difference %x6|Darken %x7|Lighten %x8|Dodge %x10|Burn %x11|Color %x15|Lightness %14|Saturation %13|Hue %12",110,10,90,20, methodc, 0, 0, 0, 0, "Blending method for Ramp (uses alpha in Colorband)");
uiDefButC(block, MENU, B_MATPRV, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Overlay %x9|Divide %x5|Difference %x6|Darken %x7|Lighten %x8|Dodge %x10|Burn %x11|Color %x15|Value %x14|Saturation %x13|Hue %x12",110,10,90,20, methodc, 0, 0, 0, 0, "Blending method for Ramp (uses alpha in Colorband)");
uiDefButF(block, NUMSLI, B_MATPRV, "", 190,10,120,20, facp, 0.0, 1.0, 100, 0, "Blending factor (also uses alpha in Colorband)");
}
}

View File

@ -270,7 +270,7 @@ static int node_buts_mix_rgb(uiBlock *block, bNodeTree *ntree, bNode *node, rctf
uiBut *bt;
/* blend type */
bt=uiDefButS(block, MENU, B_NODE_EXEC+node->nr, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Overlay %x9|Divide %x5|Difference %x6|Darken %x7|Lighten %x8|Dodge %x10|Burn %x11|Color %x15|Lightness %x14|Saturation %x13|Hue %x12",
bt=uiDefButS(block, MENU, B_NODE_EXEC+node->nr, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Overlay %x9|Divide %x5|Difference %x6|Darken %x7|Lighten %x8|Dodge %x10|Burn %x11|Color %x15|Value %x14|Saturation %x13|Hue %x12",
butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
&node->custom1, 0, 0, 0, 0, "");
uiButSetFunc(bt, node_but_title_cb, node, bt);