Support for Olive's new blend-mode infrastructure.
Plus, `switch (compo) {` has been replaced with `if {} else if {}` in Color Finder so it runs on OpenGL 2.0 hardware.
84 lines
2.1 KiB
GLSL
84 lines
2.1 KiB
GLSL
/* Filter by color characteristic simple program
|
|
Based on Edward Cannon's Simple Chroma Key (adaptation by Olive Team)
|
|
RGB to HSV based on MattKC's toonify source code
|
|
Feel free to modify and use at will */
|
|
#version 110
|
|
|
|
uniform sampler2D tex;
|
|
varying vec2 vTexCoord;
|
|
|
|
uniform float loc;
|
|
uniform float hic;
|
|
uniform int compo;
|
|
uniform bool invert;
|
|
|
|
float rgb2luma(vec3 c) {
|
|
return (max(max(c.r,c.g), c.b) + min(min(c.r,c.g), c.b))/2.0;
|
|
}
|
|
|
|
vec3 rgb2hsv(vec3 c)
|
|
{
|
|
float r = c.r;
|
|
float b = c.b;
|
|
float g = c.g;
|
|
float minv, maxv, delta;
|
|
vec3 res;
|
|
|
|
minv = min(min(r, g), b);
|
|
maxv = max(max(r, g), b);
|
|
res.z = maxv; // v
|
|
|
|
delta = maxv - minv;
|
|
|
|
if( maxv != 0.0 )
|
|
res.y = delta / maxv; // s
|
|
else {
|
|
// r = g = b = 0 // s = 0, v is undefined
|
|
res.y = 0.0;
|
|
res.x = -1.0;
|
|
return res;
|
|
}
|
|
|
|
if( r == maxv )
|
|
res.x = ( g - b ) / delta; // between yellow & magenta
|
|
else if( g == maxv )
|
|
res.x = 2.0 + ( b - r ) / delta; // between cyan & yellow
|
|
else
|
|
res.x = 4.0 + ( r - g ) / delta; // between magenta & cyan
|
|
|
|
res.x = res.x * 60.0; // degrees
|
|
if( res.x < 0.0 )
|
|
res.x = res.x + 360.0;
|
|
|
|
return res;
|
|
}
|
|
|
|
bool isNotIncreasingSequence(float a, float b, float c) {
|
|
return (c < b || a > b);
|
|
}
|
|
|
|
void main(void) {
|
|
vec4 texture_color = texture2D(tex,vTexCoord);
|
|
vec3 color = texture_color.rgb;
|
|
float toCheck = 0.0;
|
|
|
|
if (compo == 0) {
|
|
toCheck = rgb2luma(color)*100.0;
|
|
} else if (compo == 4) {
|
|
toCheck = color.r*100.0;
|
|
} else if (compo == 5) {
|
|
toCheck = color.g*100.0;
|
|
} else if (compo == 6) {
|
|
toCheck = color.b*100.0;
|
|
} else if (compo == 1) {
|
|
toCheck = rgb2hsv(color).z*100.0;
|
|
} else if (compo == 2) {
|
|
toCheck = rgb2hsv(color).x/3.6;
|
|
} else if (compo == 3) {
|
|
toCheck = rgb2hsv(color).y*100.0;
|
|
}
|
|
texture_color.a = isNotIncreasingSequence(loc, toCheck, hic) ? (invert ? texture_color.a : 0.0) : (invert ? 0.0 : texture_color.a);
|
|
texture_color.rgb *= texture_color.a;
|
|
gl_FragColor = texture_color;
|
|
}
|