This commit is contained in:
itsmattkc
2019-01-29 11:39:49 +11:00
+36 -67
View File
@@ -121,83 +121,54 @@ float blend_soft_light(float base, float blend) {
// RGB blending function, alpha is handled below // RGB blending function, alpha is handled below
vec3 blend(vec3 base, vec3 blend) { vec3 blend(vec3 base, vec3 blend) {
switch (blendmode) { if (blendmode == BLEND_MODE_AVERAGE) {
case BLEND_MODE_AVERAGE:
return (base+blend)/2.0; return (base+blend)/2.0;
} else if (blendmode == BLEND_MODE_COLORBURN) {
case BLEND_MODE_COLORBURN:
return vec3(blend_color_burn(base.r, blend.r), blend_color_burn(base.g, blend.g), blend_color_burn(base.b, blend.b)); return vec3(blend_color_burn(base.r, blend.r), blend_color_burn(base.g, blend.g), blend_color_burn(base.b, blend.b));
} else if (blendmode == BLEND_MODE_COLORDODGE) {
case BLEND_MODE_COLORDODGE:
return vec3(blend_color_dodge(base.r, blend.r), blend_color_dodge(base.g, blend.g), blend_color_dodge(base.b, blend.b)); return vec3(blend_color_dodge(base.r, blend.r), blend_color_dodge(base.g, blend.g), blend_color_dodge(base.b, blend.b));
} else if (blendmode == BLEND_MODE_DARKEN) {
case BLEND_MODE_DARKEN:
return vec3(blend_darken(base.r, blend.r), blend_darken(base.g, blend.g), blend_darken(base.b, blend.b)); return vec3(blend_darken(base.r, blend.r), blend_darken(base.g, blend.g), blend_darken(base.b, blend.b));
} else if (blendmode == BLEND_MODE_DIFFERENCE) {
case BLEND_MODE_DIFFERENCE:
return abs(base-blend); return abs(base-blend);
} else if (blendmode == BLEND_MODE_EXCLUSION) {
case BLEND_MODE_EXCLUSION:
return base+blend-2.0*base*blend; return base+blend-2.0*base*blend;
} else if (blendmode == BLEND_MODE_GLOW) {
case BLEND_MODE_GLOW:
return blend_reflect(blend, base); return blend_reflect(blend, base);
} else if (blendmode == BLEND_MODE_HARDLIGHT) {
case BLEND_MODE_HARDLIGHT:
return blend_overlay(blend,base); return blend_overlay(blend,base);
} else if (blendmode == BLEND_MODE_HARDMIX) {
case BLEND_MODE_HARDMIX:
return vec3(blend_hard_mix(base.r,blend.r),blend_hard_mix(base.g,blend.g),blend_hard_mix(base.b,blend.b)); return vec3(blend_hard_mix(base.r,blend.r),blend_hard_mix(base.g,blend.g),blend_hard_mix(base.b,blend.b));
} else if (blendmode == BLEND_MODE_LIGHTEN) {
case BLEND_MODE_LIGHTEN:
return vec3(blend_lighten(base.r,blend.r),blend_lighten(base.g,blend.g),blend_lighten(base.b,blend.b)); return vec3(blend_lighten(base.r,blend.r),blend_lighten(base.g,blend.g),blend_lighten(base.b,blend.b));
} else if (blendmode == BLEND_MODE_LINEARBURN || blendmode == BLEND_MODE_SUBTRACT) {
case BLEND_MODE_LINEARBURN:
case BLEND_MODE_SUBTRACT:
return blend_linear_burn(base, blend); return blend_linear_burn(base, blend);
} else if (blendmode == BLEND_MODE_LINEARDODGE || blendmode == BLEND_MODE_ADD) {
case BLEND_MODE_ADD:
case BLEND_MODE_LINEARDODGE:
return blend_linear_dodge(base, blend); return blend_linear_dodge(base, blend);
} else if (blendmode == BLEND_MODE_LINEARLIGHT) {
case BLEND_MODE_LINEARLIGHT:
return vec3(blend_linear_light(base.r,blend.r),blend_linear_light(base.g,blend.g),blend_linear_light(base.b,blend.b)); return vec3(blend_linear_light(base.r,blend.r),blend_linear_light(base.g,blend.g),blend_linear_light(base.b,blend.b));
} else if (blendmode == BLEND_MODE_MULTIPLY) {
case BLEND_MODE_MULTIPLY:
return (base * blend); return (base * blend);
} else if (blendmode == BLEND_MODE_NEGATION) {
case BLEND_MODE_NEGATION:
return vec3(1.0)-abs(vec3(1.0)-base-blend); return vec3(1.0)-abs(vec3(1.0)-base-blend);
} else if (blendmode == BLEND_MODE_OVERLAY) {
case BLEND_MODE_OVERLAY:
return blend_overlay(base, blend); return blend_overlay(base, blend);
} else if (blendmode == BLEND_MODE_PHOENIX) {
case BLEND_MODE_PHOENIX:
return min(base,blend)-max(base,blend)+vec3(1.0); return min(base,blend)-max(base,blend)+vec3(1.0);
} else if (blendmode == BLEND_MODE_PINLIGHT) {
case BLEND_MODE_PINLIGHT:
return vec3(blend_pin_light(base.r,blend.r),blend_pin_light(base.g,blend.g),blend_pin_light(base.b,blend.b)); return vec3(blend_pin_light(base.r,blend.r),blend_pin_light(base.g,blend.g),blend_pin_light(base.b,blend.b));
} else if (blendmode == BLEND_MODE_REFLECT) {
case BLEND_MODE_REFLECT:
return blend_reflect(base, blend); return blend_reflect(base, blend);
} else if (blendmode == BLEND_MODE_SCREEN) {
case BLEND_MODE_SCREEN:
return vec3(blend_screen(base.r,blend.r),blend_screen(base.g,blend.g),blend_screen(base.b,blend.b)); return vec3(blend_screen(base.r,blend.r),blend_screen(base.g,blend.g),blend_screen(base.b,blend.b));
} else if (blendmode == BLEND_MODE_SUBSTRACT) {
case BLEND_MODE_SUBSTRACT:
return max(base+blend-vec3(1.0),vec3(0.0)); return max(base+blend-vec3(1.0),vec3(0.0));
} else if (blendmode == BLEND_MODE_SOFTLIGHT) {
case BLEND_MODE_SOFTLIGHT:
return vec3(blend_soft_light(base.r,blend.r),blend_soft_light(base.g,blend.g),blend_soft_light(base.b,blend.b)); return vec3(blend_soft_light(base.r,blend.r),blend_soft_light(base.g,blend.g),blend_soft_light(base.b,blend.b));
} else if (blendmode == BLEND_MODE_VIVIDLIGHT) {
case BLEND_MODE_VIVIDLIGHT:
return vec3(blend_vivid_light(base.r,blend.r),blend_vivid_light(base.g,blend.g),blend_vivid_light(base.b,blend.b)); return vec3(blend_vivid_light(base.r,blend.r),blend_vivid_light(base.g,blend.g),blend_vivid_light(base.b,blend.b));
} else {
case BLEND_MODE_NORMAL:
default:
return blend; return blend;
} }
} }
@@ -211,21 +182,19 @@ void main(void) {
// add foreground and background alpha's together // add foreground and background alpha's together
float alpha_opac = fg_color.a*opacity; float alpha_opac = fg_color.a*opacity;
switch (blendmode) { if (blendmode == BLEND_MODE_OVERLAY
case BLEND_MODE_OVERLAY: || blendmode == BLEND_MODE_LIGHTEN
case BLEND_MODE_LIGHTEN: || blendmode == BLEND_MODE_SCREEN
case BLEND_MODE_SCREEN: || blendmode == BLEND_MODE_COLORDODGE
case BLEND_MODE_COLORDODGE: || blendmode == BLEND_MODE_LINEARDODGE
case BLEND_MODE_LINEARDODGE: || blendmode == BLEND_MODE_ADD
case BLEND_MODE_ADD: || blendmode == BLEND_MODE_SOFTLIGHT
case BLEND_MODE_SOFTLIGHT: || blendmode == BLEND_MODE_NEGATION
case BLEND_MODE_NEGATION: || blendmode == BLEND_MODE_AVERAGE
case BLEND_MODE_AVERAGE: || blendmode == BLEND_MODE_REFLECT
case BLEND_MODE_REFLECT: || blendmode == BLEND_MODE_EXCLUSION
case BLEND_MODE_EXCLUSION: || blendmode == BLEND_MODE_DIFFERENCE) {
case BLEND_MODE_DIFFERENCE:
composite *= alpha_opac; composite *= alpha_opac;
break;
} }
vec4 full_composite = vec4(composite + bg_color.rgb*(1.0-alpha_opac), bg_color.a + fg_color.a); vec4 full_composite = vec4(composite + bg_color.rgb*(1.0-alpha_opac), bg_color.a + fg_color.a);