#define VTIME 0.3

float yPoint(float y0, float y1, float x) {
    float a = 2. * (y0 - y1);
    float b = 3. * (y1 - y0);
    float d = y0;
    return a * x * x * x + b * x * x + d;
}

float remap2(float uv, float inputLow, float inputHigh, float outputLow, float outputHigh){
    float t = (uv - inputLow)/(inputHigh - inputLow);
    float final = mix(outputLow,outputHigh,t);
    return final;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    float t = ${myTime} ;    
    // float t = abs(sin(iTime));
    //v animation
    if (t < VTIME) {
        float vAnimP = (t) / VTIME;
        float top = mix(1.0, ${RANGE_1}, vAnimP);
        float bottom = mix(0.0, ${RANGE_2}, vAnimP);
        float xTop = yPoint(top, 1., uv.y); // Swap uv.x with uv.y
        float xBottom = yPoint(bottom, 0., uv.y); // Swap uv.x with uv.y
        float newUvX = remap2(uv.x, xBottom, xTop, 0.0, 1.0); // Swap uv.x with uv.y
        if (newUvX > 1. || newUvX < 0.) {
            fragColor = vec4(0.);
        } else {
            fragColor = jsvTexture2D(iChannel0, vec2(newUvX, uv.y));
        }
    } else {
        //h animation
        float xTop = yPoint(${RANGE_1}, 1., uv.y); // Swap uv.x with uv.y
        float xBottom = yPoint(${RANGE_2}, 0., uv.y); // Swap uv.x with uv.y
        float newUvX = remap2(uv.x, xBottom, xTop, 0.0, 1.0); // Swap uv.x with uv.y
        float hAnimP = (t - VTIME) / (1. - VTIME);
        float yStart = mix(0., 1., hAnimP); // Calculate the vertical shift
        float newUvY = uv.y + yStart; // Adjust the y-coordinate
        if (newUvX > 1. || newUvX < 0. || newUvY > 1. || newUvY < 0.) {
            fragColor = vec4(0.);
        } else {
            fragColor = jsvTexture2D(iChannel0, vec2(newUvX, newUvY));
        }
    }
}
