#ifndef BLEND_COLOR_LAYERS_GLSLLIB #define BLEND_COLOR_LAYERS_GLSLLIB float maxValue( in vec3 t ) { return max( max( t.x, t.y ), t.z ); } vec3 blendColor( in vec3 t, in vec3 b, in float weight, in int blendMode) { vec3 blendResult = t; switch( blendMode ) { case color_layer_add : blendResult += b; break; case color_layer_multiply : blendResult *= b; break; case color_layer_screen : blendResult += t - t * b; break; case color_layer_overlay: blendResult = (maxValue(t) >= 0.5) ? 2.0 * (t+b - t*b - 0.5) : 2.0 * t*b; break; case color_layer_blend: default: // nothing to be done break; } return mix( b, blendResult, weight ); } texture_return blendColorLayers( in color_layer colorLayer[1], in vec3 base, in int monoSource ) { vec3 result = blendColor( colorLayer[0].layer_color, base, colorLayer[0].weight, colorLayer[0].mode ); texture_return tr; tr.tint = result; tr.mono = monoChannel( vec4( result, 1.0 ), monoSource ); return( tr ); } #endif