// fpSELECT.glsl uniform lowp sampler2D uTex; uniform lowp float uSpriteBlurAmount; uniform mediump vec2 uTcScale; varying mediump vec2 vTc; varying lowp vec4 vColor; mediump float normpdf(in mediump float x, in mediump float sigma) { return 0.39894*exp(-0.5*x*x/(sigma*sigma))/sigma; } const float fSolidThreshold = 0.1; const vec4 vHighlightColour = vec4(0.5, 0.8, 1, 1); mediump float minDistf(in int x, in int y, in float minDist) { vec2 sampleCoord = vTc + vec2(float(x), float(y))*uTcScale; sampleCoord = sampleCoord/uTcScale; sampleCoord = sampleCoord + vec2(0.5, 0.5); // Add 0.5, since a cast to an integer always rounds down sampleCoord.x = float(int(sampleCoord.x)); // We're rounding to the nearest integer sampleCoord.y = float(int(sampleCoord.y)); // We're rounding to the nearest integer sampleCoord = sampleCoord + vec2(0.5, 0.5); sampleCoord = sampleCoord * uTcScale; // Back into texture coordinates vec2 coordDiff = abs(vTc - sampleCoord)/uTcScale; vec4 texSample = texture2D(uTex, sampleCoord); if (texSample.a > fSolidThreshold) { float distance = sqrt((coordDiff.x*coordDiff.x) + (coordDiff.y*coordDiff.y)); minDist = min(minDist, distance); } return minDist; } void main() { // First we sample the main texel - if it's solid, we just return it. vec4 texColor = texture2D(uTex, vTc); if (texColor.a > fSolidThreshold) { gl_FragColor = mix(vHighlightColour, texColor, texColor.a); return; } int x,y; int kSize = 3; float minDist = float(kSize)+1.0; x = -3; y = -3; minDist = minDistf(x,y,minDist); y = -2; minDist = minDistf(x,y,minDist); y = -1; minDist = minDistf(x,y,minDist); y = 0; minDist = minDistf(x,y,minDist); y = 1; minDist = minDistf(x,y,minDist); y = 2; minDist = minDistf(x,y,minDist); y = 3; minDist = minDistf(x,y,minDist); x = -2; y = -3; minDist = minDistf(x,y,minDist); y = -2; minDist = minDistf(x,y,minDist); y = -1; minDist = minDistf(x,y,minDist); y = 0; minDist = minDistf(x,y,minDist); y = 1; minDist = minDistf(x,y,minDist); y = 2; minDist = minDistf(x,y,minDist); y = 3; minDist = minDistf(x,y,minDist); x = -1; y = -3; minDist = minDistf(x,y,minDist); y = -2; minDist = minDistf(x,y,minDist); y = -1; minDist = minDistf(x,y,minDist); y = 0; minDist = minDistf(x,y,minDist); y = 1; minDist = minDistf(x,y,minDist); y = 2; minDist = minDistf(x,y,minDist); y = 3; minDist = minDistf(x,y,minDist); x = 0; y = -3; minDist = minDistf(x,y,minDist); y = -2; minDist = minDistf(x,y,minDist); y = -1; minDist = minDistf(x,y,minDist); y = 0; minDist = minDistf(x,y,minDist); y = 1; minDist = minDistf(x,y,minDist); y = 2; minDist = minDistf(x,y,minDist); y = 3; minDist = minDistf(x,y,minDist); x = 1; y = -3; minDist = minDistf(x,y,minDist); y = -2; minDist = minDistf(x,y,minDist); y = -1; minDist = minDistf(x,y,minDist); y = 0; minDist = minDistf(x,y,minDist); y = 1; minDist = minDistf(x,y,minDist); y = 2; minDist = minDistf(x,y,minDist); y = 3; minDist = minDistf(x,y,minDist); x = 2; y = -3; minDist = minDistf(x,y,minDist); y = -2; minDist = minDistf(x,y,minDist); y = -1; minDist = minDistf(x,y,minDist); y = 0; minDist = minDistf(x,y,minDist); y = 1; minDist = minDistf(x,y,minDist); y = 2; minDist = minDistf(x,y,minDist); y = 3; minDist = minDistf(x,y,minDist); x = 3; y = -3; minDist = minDistf(x,y,minDist); y = -2; minDist = minDistf(x,y,minDist); y = -1; minDist = minDistf(x,y,minDist); y = 0; minDist = minDistf(x,y,minDist); y = 1; minDist = minDistf(x,y,minDist); y = 2; minDist = minDistf(x,y,minDist); y = 3; minDist = minDistf(x,y,minDist); minDist = max(0.0, minDist-1.1); minDist = minDist/float(kSize); gl_FragColor = mix(vHighlightColour, vec4(0,0,0,0), minDist); }