//por jorge2017a2...JFP
//basic landscape 2d v2 ----------->>>-28-abril-2022
//referencia
//https://iquilezles.org/articles/distfunctions2d
///
#define antialiasing(n) n/min(iResolution.y,iResolution.x)
#define S(d,b) smoothstep(antialiasing(0.8),b,d)
#define S2(d,b) smoothstep(8.0*antialiasing(2.0),b,d)
#define PI     3.14159265
#define TWO_PI 6.28318530



float opRep1D( float p, float c )
	{ float q = mod(p+0.5*c,c)-0.5*c; return  q ;}    

float intersectSDF(float distA, float distB)
	{ return max(distA, distB);}
float unionSDF(float distA, float distB)
	{ return min(distA, distB);}
float differenceSDF(float distA, float distB)
	{ return max(distA, -distB);}



vec3 DrawFigBorde(vec3 pColObj, vec3 colOut, float distObj )
{ colOut = mix(colOut,pColObj ,S2( distObj,0.0));
  colOut = mix(colOut,vec3(0.0) ,S2(abs( distObj)-0.005,0.0));
  return colOut;
}

vec3 DrawFigBordeCol(vec3 pColObj, vec3 colOut, float distObj , vec3 colBorde )
{ colOut = mix(colOut,pColObj ,S2( distObj,0.0));
  colOut = mix(colOut,colBorde ,S2(abs( distObj)-0.01,0.0));
  return colOut;
}


float sdBox( in vec2 p, in vec2 b )
{ vec2 d = abs(p)-b;  return length(max(d,0.0)) + min(max(d.x,d.y),0.0);  }

float sdCircle( vec2 p, float r )
{ return length(p) - r;}

vec3 PisoOnda(vec2 uv,vec3 colIn, vec3 colOut )
{   float y=uv.y + sin(uv.x*5.)*0.1;
    vec3 col= DrawFigBorde(colIn, colOut, y);
    return col;
}

float PisoOnda(vec2 uv )
{   float y=uv.y + sin(uv.x*5.)*0.1;
    return y;
}

vec3 PisoPlano(vec2 uv,vec3 colIn, vec3 colOut )
{   float y= uv.y+ 1.0;
    vec3 col= DrawFigBorde(colIn-(0.5+uv.y/8.0), colOut, y);
    return col;
}

vec3 PisoPlanoIzq(vec2 uv,vec3 colIn, vec3 colOut )
{   float y= uv.y+uv.x+1.0;
    vec3 col= DrawFigBorde(colIn, colOut, y);
    return col;
}

vec3 PisoPlanoDer(vec2 uv,vec3 colIn, vec3 colOut )
{   float y= uv.y-uv.x+1.0;
    vec3 col= DrawFigBorde(colIn, colOut, y);
    return col;
}

float PisoPlanoIzqFl(vec2 uv )
{   //float y= uv.y+uv.x+1.0;
     float onda= uv.y+uv.x+sin(uv.x*10.)*0.2; 
     float y=onda;
    return y;
}

float PisoPlanoDerFl(vec2 uv)
{   //float y= uv.y-uv.x+1.0;
    float onda= uv.y-uv.x+sin(uv.x*10.0)*0.2;
    float y=onda;
    return y;
}

vec3 PisoPlanoLinea(vec2 uv,vec3 colIn, vec3 colOut )
{   float y1= uv.y+ 0.25;
    float y2= uv.y- 0.25;
    float dif= differenceSDF(y2,y1);
    vec3 col= DrawFigBorde(colIn, colOut, dif);
    return col;
}

vec3 HacerCascada(vec2 uv, vec3 colOut)
{   float t=iTime*10.0;
    uv.y= opRep1D(uv.y, 1.0 );
    uv.y -= sin(uv.x*5.+t)*0.2;
    float p1=uv.y-0.1;
    float p2=uv.y+0.2;
    float dif= differenceSDF(p1, p2);
    vec3 col= DrawFigBorde(vec3(0.2,0.2,0.8), colOut, dif);
    return col;
}

float HacerCascadaFlo(vec2 uv)
{   float t=0.0;
    uv.y= opRep1D(uv.y, 1.0 );
    uv.y -= sin(uv.x*5.)*0.2+t;
    float p1=uv.y-0.1;
    float p2=uv.y+0.2;
    float dif= differenceSDF(p1, p2);
    return dif;
}

vec3 HacerCascadaTriangulo(vec2 uv, vec3 colOut)
{   float t=iTime*10.0;
    vec2 uv0=uv;
    float dif= HacerCascadaFlo(uv+vec2(0.0+0.125*sin(t*20.0),t));
    
    float d1= PisoPlanoIzqFl(vec2(uv0.x, -uv0.y+5.0));
    float d2= PisoPlanoDerFl(vec2(uv0.x, -uv0.y+5.0));
    float d3= uv.y-10.0;
    float uni= unionSDF(d1, d2);  //inclinados
    float inter= differenceSDF(d3,uni);  //
    dif= differenceSDF(dif,uni);
    vec3 col= DrawFigBorde(vec3(1.0), colOut, inter);
    col= DrawFigBorde(vec3(0.2,0.0,1.0), col, dif);
    return col;
}

vec3 CascadaBloque(vec2 uv, vec3 colOut)
{   float d1= sdBox(uv,vec2(3.0,5.0) ); //grande
    float d2= sdBox(uv,vec2(2.5,4.5) ); //chico
    float dif1= differenceSDF(d1, d2);
    float t=iTime;
    float d3=HacerCascadaFlo(uv+vec2(0.0+0.125*sin(t*20.0),t));
    float dif2= intersectSDF(d3,d2);    
    vec3 col= DrawFigBorde(vec3(1.0), colOut, d2);
    col= DrawFigBorde(vec3(0.0), col, dif1);    
    col= DrawFigBorde(vec3(0.2,0.2,0.8), col, dif2);
    return col;
}

vec3 nubes(vec2 uv, vec3 colOut)
{   vec3 col;
    float d1,d2,d3;
     d1= sdCircle(uv, 1.0 );
     d2= sdCircle(uv-vec2(1.5,0.0), 1.5 );
     d3= sdCircle(uv-vec2(3.0,-0.25), 1.2 );
     float duni= unionSDF(d1, d2);
     duni= unionSDF(duni,d3);
     col= DrawFigBorde(vec3(1.0), colOut, duni);
     return col;
}
    
vec3 Hacermonte(vec2 uv,vec3 colIn, vec3 colOut)
{   float x=uv.x;
    float xx=x+2.0*cos(x*0.5);
    float fx2=3.0*sin(xx*0.5)/xx;
    float monte=uv.y+fx2;
    vec3 col= DrawFigBorde(colIn, colOut, monte); //cafe
    return col;
}

vec3 BloqueSimple(vec2 uv, vec3 colOut)
{   float d1= sdBox(uv-vec2(0.0,2.5),vec2(2.5,0.5) ); //grande sup
    float d2= sdBox(uv,vec2(2.0,3.0) ); //grande inf
    float d3= PisoOnda(uv-vec2(0.0,2.5));
    d1= differenceSDF(d1,d3);
    vec3 col;
    col= DrawFigBorde(vec3(0.6,1.2,0.3)*0.8-(uv.x/7.0), colOut, d2); 
    col= DrawFigBorde(vec3(0.8,0.2,0.3)*0.8-(uv.x/8.0), col, d1); 
    return col;
}


vec3 Hacermontev2(vec2 uv,vec3 colIn, vec3 colOut)
{   float x=uv.x;
    float xx=x+cos(x*0.25);
    float fx2=3.0*sin(xx+cos(xx*1.5));
    float monte=uv.y+fx2;
    vec3 col= DrawFigBorde(colIn-(-0.12+uv.y/8.0), colOut, monte); //cafe
    return col;
}
    

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = -1.0 + 2.0 * fragCoord.xy/iResolution.xy;
	uv.x *= iResolution.x/iResolution.y;
    uv-=vec2(0.0,-0.5);
    float t=iTime;
    //float t0=mod(t,15.0);
    vec3 col=vec3(0.0,0.1,0.8);
    uv.x+=t;
    uv.x= opRep1D(uv.x, 5.0 );
    float esc=8.0;
    uv*=esc;
    float trep=t*0.25;
    vec2 uv0=uv;
    
    
    
    col= Hacermonte(uv-vec2(0.0,10.0),vec3(0.7,0.35,0.2), col);
    col= Hacermonte(uv-vec2(10.0,8.0),vec3(0.7,0.35,0.2)*0.8, col);
    col= Hacermontev2(uv-vec2(5.0,4.0),vec3(0.7,0.35,0.2)*0.6, col);
    
    col= HacerCascadaTriangulo(uv-vec2(0.0,3.0),col);
    uv=uv0;
    uv.y-=4.0+1.0*sin(t*0.125);
    uv.x= opRep1D(uv.x+t, 20.0 );
    col= nubes(uv-vec2(4.0,7.0),col);
    col= nubes(uv-vec2(-8.0,5.0),col);
    uv=uv0;
    
    col= PisoOnda(uv+vec2(0.0,-0.2),vec3(0.0),col); //pasto
    col= PisoOnda(uv,vec3(0.2,0.8,0.2),col); //pasto
    col= PisoPlano(uv,vec3(0.1,0.46,0.2), col );
    col= PisoPlanoLinea(uv-vec2(0.0,-0.8),vec3(0.5,0.4,0.3), col);
            
    col= BloqueSimple(uv-vec2(10.0,2.0),col);
    
    col=pow(col,  vec3(0.554545));
    fragColor = vec4(col,1.0);
}


