//created by TRASHTRASH
#define MAX_STEPS 128
#define MAX_DIST 100.
#define SURF_DIST 0.001

#define THICK 0.01
#define bias .5
#define bpm 124.
//based of tut from BigWIngs aka art of code
//pt1

float sdBox(vec3 p, vec3 s) {
 	p=abs(p)-s;
    return length(max(p,0.))+min(max(p.x,max(p.y, p.z)), 0.);
}
float sdGyroid(vec3 p, float scale){
   p*= scale;
   float b = iTime*bpm/60.;
   //mult scale by 2 cuz largest of mul distortion of 
   return abs(dot(sin(p*2.+b), cos(p.zxy*sin(1.6)+(b*1.5)))-bias)/(scale*3.)-THICK;
}

float map(vec3 p) {
    float box = sdBox(p-vec3(0.,1.,0.), vec3(3.));
    float g = sdGyroid(p, 10.);
    float d = max(box, g*.3);
    return d;
}

float RM(vec3 ro, vec3 rd) {
   float t = 0.;
   
   for(int i=0;i<MAX_STEPS;i++){
       vec3 p = ro + rd * t;
       float s = map(p);
       t += s;
    }
    return t; 
}

vec3 norm(vec3 p) {
 float d = map(p);
 vec2 e = vec2(.01, 0.);
 vec3 n = d - vec3(map(p-e.xyy), map(p-e.yxy), map(p-e.yyx));
 return normalize(n);
}

float shade(vec3 p, vec3 rd) {
    vec3 lightPos = vec3(0.,5.,-5.);	
    vec3 l = normalize(lightPos - p);
   	vec3 n = norm(p);
    float col = 0.;
    float dif = clamp(dot(n,l),0.,1.);
    float fr = pow(1.0+dot(n, rd),4.0);
    float sp = pow(max(dot(reflect(-l, n),-rd),0.0),80.);
   	float ao = (1.0 - fr);
   	float fd = 1.0 - dif;
   	col = sp + max(fr, 0.5) + dif * ao;
 	return col;
}



void mainImage( out vec4 fragColor, in vec2 fragCoord) {
 	vec2 uv = (fragCoord-0.5 *iResolution.xy)/iResolution.y;
    vec3 col = vec3(0.0);
   	vec3 ro = vec3(0.,1.,-5.);
    vec3 rd = normalize(vec3(uv.x, uv.y, 1.));
    float d = RM(ro, rd);
    if(d<MAX_DIST) {
      vec3 p = ro + rd * d;
      vec3 c1 = vec3(1.,.27,0.);
  	  float dif = shade(p, rd);
      col = vec3(dif)*c1+(sin(p.y+0.5))/2.;
        //lol
       col*=col*col*col*col*col;
    }
	
    col = pow(col, vec3(.4545));
    fragColor = vec4(col, 1.0);
}
