| #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 |