//
// Coudycol
//
// by @paulofalcao
//
// A quick effect done in Inecia2019
//
// Original made on http://www.backtothepixel.com/apps/GLSLSandboxHack/index.html
//

#define Size 0.192
#define ScreenL 4.686
#define SphereOpacity 0.006
#define Color vec3(1,0.38,0.38)
#define R1 5.475
#define G1 6.954
#define B1 6.313
#define time iTime
#define resolution iResolution.xy

float sincostex(vec3 p,float s){
  p*=s;
  return cos(p.x)*sin(p.y)*cos(p.z)*0.5+0.5;
}

vec4 of(vec3 p){
  p*=(sin(time*2.0)*0.5+1.5);
  float ct=cos(time);float st=sin(time);
  p.xz*=mat2(ct,-st,st,ct);
  ct=cos(time*0.5);st=sin(time*0.5);
  p.xy*=mat2(ct,-st,st,ct);

  vec3 op=p;
  vec3 a1=p*(1.0+sin(op.yzx*4.0)*0.4);
  vec3 a2=p*(1.0+sin(op*4.0)*0.4);
  p=mix(a1,a2,sin(time*0.1)*0.5+0.5);

  vec3 n=normalize(p);
  p*=(0.5+sincostex(n,sin(floor(time))*10.0+10.0));
  float a=length(p)<(sincostex(n,Size*10.0)+2.0)?SphereOpacity:0.0;

  return vec4(vec3(sin(p*vec3(R1,G1,B1))*0.5+0.5)*Color,a);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord ){

  vec2 uv=iResolution.xy;

  uv=(gl_FragCoord.xy-uv*.5)/uv.y;

  vec3 ro=vec3(0,0,5);
  vec3 r=normalize(vec3(uv,-1));

  vec4 color;
  float f=1.0;
  for(int i=0;i<400;i++){
    vec3 p=ro+f*r;
    vec4 d=of(p);
    color+=vec4(d.xyz*d.w,d.w);
    if (f>8.0) break;
    if (color.w>1.0) break;
    f+=0.02;
  }

  fragColor=vec4(color.xyz*ScreenL,1);

}
