//voxel glitch
//lambmeow 2/13/22
//Thanks for UnstableLobster + Shane for a fix to my voxel issue!

//we can also just move ss to the mainImage but eh...
float h;
float ss(vec3 v)
{
    vec2 iv = floor(v.xz );
    float z= v.z;
    //v.xy *= rot(mod((z/600.), 2.* 3.141529)) * 2.;
    v.xz = fract (v.xz);

    v.xz-= vec2(0.5,1);

    vec3 u = texture(iChannel0, iv/200.).grb * 5.;


    vec3 b = abs(v) - vec3(.45, sin(iTime + u.x) * u.y/2. + u.y/2., .45);
    h = b.y;
    return length(max(b,0.)) + min (max(b.x, max(b.y, b.z)), 0.);
}


void mainImage( out vec4 c, in vec2 f )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 r = iResolution.xy, u = (2. * f - r)/r.y;
    float a = iTime* 0.3;
    u *= mat2(cos(a), -sin(a), sin(a), cos(a));
    u.y = -abs(u.y);
    vec3 ro = vec3(0, 10, -10. + iTime * 25.), rd = normalize(vec3(u, 2.)), pp = ro;
    float dd = 0., ll = 0.;

    for(int i = 0; i < 255; i++)
    {
       pp = ro+rd * ll;
       //quick fix
       dd = ss(pp);
       ll +=dd * 0.1;
       if(ll > 350. || dd < 0.001)
           break;
    }


    // Output to screen
    vec3 ff = vec3(0.3,.0,.2);
    float atten = 1./(1. + ll * .025) * max(1.-dd,0.);
    atten *= smoothstep(0.,1., 1.+ h) + .45;

     c = texture(iChannel0, floor(pp.xz)/200.) * atten + vec4(ff,1.) * (1.- atten);

    }
