//// Image
//// set these settings:
//// - iChannel0 = Buffer A
//// - iChannel1 = Image of choice

#define IMGCHANNEL iChannel1
//======Start shared code for state
#define pz_stateYOffset 0.0
#define pz_stateBuf 0
#define pz_stateSample(x) texture(iChannel0,x)
vec2 pz_realBufferResolution;
vec2 pz_originalBufferResolution;

void pz_initializeState() {
    pz_realBufferResolution     = iChannelResolution[pz_stateBuf].xy;
    pz_originalBufferResolution = pz_stateSample(.5/pz_realBufferResolution).xy;
}

vec2 pz_nr2vec(float nr) {
    return vec2(mod(nr, pz_originalBufferResolution.x)
                      , pz_stateYOffset+floor(nr / pz_originalBufferResolution.x))+.5;
}

vec4 pz_readState(float nr) {
    return pz_stateSample(pz_nr2vec(nr)/pz_realBufferResolution);
}

float pz_resetCount() {
    return pz_readState(1.).z;
}

vec3 pz_position() {
    return pz_readState(3.).xyz;
}

vec2 pz_initializeState(vec2 fragCoord) {
    pz_initializeState();
    
    vec3 position = pz_position();
    fragCoord -= 0.5*iResolution.xy;
    fragCoord *= position.z;
    fragCoord += (0.5 + position.xy) * iResolution.xy ;
    return fragCoord;
}
//======End shared code for state

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 screenspace = fragCoord / iResolution.xy;

    fragCoord = pz_initializeState(fragCoord);

    vec2 uv = fragCoord;
    
    ivec2 size = textureSize(IMGCHANNEL, 0);

    float ratio = float(size.x) / float(size.y);
    uv.y /= float(iResolution.x)/float(iResolution.y);
    uv.y *= ratio;
    uv /= iResolution.xy;
    
    //size = ivec2(100, 100);
    
    ivec2 pixelf = ivec2(floor(uv * vec2(size)));
    ivec2 pixel = ivec2(floor(uv * vec2(size) - vec2(0.5, 0.5)));
    
    ivec2 px2 = pixel + ivec2(0, 1);
    ivec2 px3 = pixel + ivec2(1, 0);
    ivec2 px4 = pixel + ivec2(1, 1);
    
    vec2 pxcoordf = (vec2(pixelf) + vec2(0.5, 0.5)) / vec2(size);
    vec2 pxcoord = (vec2(pixel) + vec2(0.5, 0.5)) / vec2(size);
    vec2 pxcoord2 = (vec2(px2) + vec2(0.5, 0.5)) / vec2(size);
    vec2 pxcoord3 = (vec2(px3) + vec2(0.5, 0.5)) / vec2(size);
    vec2 pxcoord4 = (vec2(px4) + vec2(0.5, 0.5)) / vec2(size);
    
    vec4 colf = vec4(texture(IMGCHANNEL, pxcoordf).xyz,1.0);
    vec4 col1 = vec4(texture(IMGCHANNEL, pxcoord).xyz,1.0);
    vec4 col2 = vec4(texture(IMGCHANNEL, pxcoord2).xyz,1.0);
    vec4 col3 = vec4(texture(IMGCHANNEL, pxcoord3).xyz,1.0);
    vec4 col4 = vec4(texture(IMGCHANNEL, pxcoord4).xyz,1.0);
    vec4 actual = vec4(texture(IMGCHANNEL, uv).xyz,1.0);
    
    float min = 10000.0;
    vec4 final;
    
    float dist1 = distance(col1, actual);
    if(dist1 < min) {min = dist1; final = col1;}
    
    float dist2 = distance(col2, actual);
    if(dist2 < min) {min = dist2; final = col2;}
    
    float dist3 = distance(col3, actual);
    if(dist3 < min) {min = dist3; final = col3;}
    
    float dist4 = distance(col4, actual);
    if(dist4 < min) {min = dist4; final = col4;}
    
    //fragColor = actual.x > 0.5 ? vec4(1, 1, 1, 1) : vec4(0, 0, 0, 0);
    
    //fragColor = mix(final, actual, sin(iDate.w * 4.0) * 0.5 + 0.5 );
    //fragColor = mix(col1, actual, sin(iDate.w * 4.0) * 0.5 + 0.5 );
    //fragColor = mix(final, actual, -1.0 ); // looks interesting
 
    //fragColor = actual;
    //fragColor = col1;
    //fragColor = mix(final, actual, sin(iDate.w * 4.0) * 0.5 + 0.5 );
    //fragColor = mix(col3, actual, sin(iDate.w * 4.0) * 0.5 + 0.5 );
 
    if(screenspace.y < 0.33) {
        fragColor = colf;
    }else if(screenspace.y < 0.34) {
        fragColor = vec4(1.0, 1.0, 1.0, 1.0);
    }else if(screenspace.y < 0.66) {
        fragColor = actual;
    }else if(screenspace.y < 0.67) {
        fragColor = vec4(1.0, 1.0, 1.0, 1.0);
    }else{
        fragColor = final;
    }
    //fragColor = vec4(screenspace, 0.0, 1.0);
}