
// -410 chars   by FabriceNeyret2

// 2023-12-2

// 946 chars now

#define M(c,a) p.c *= mat2(cos(t*a+vec4(0,33,11,0)));
#define R      iResolution
#define S(v)   pow(max(0., abs(dot(v,L))), 5.)
#define N      normalize

float m(vec3 p)
{
      float t = iTime/20. + 6.1, i,d=2.;
      M(xz, .5)
      M(xy, .8)
      M(yz, sin(t*.3)*8./t)

      vec3 q, f = .5 +   (fract(p)-.5)
                       * sign( fract(1e4*sin(floor(p)*mat3(R,R-71.,R+13.)))
                               - .5 );

      for( vec2 z; i++<3.; f=f.yzx )
            q = f,
            q.x--,
            z = abs( abs( vec2(length(q.xy), q.z) - .5 ) - .075/1.4 ), //
            d = min(d, length(max(z-.04, 0.))-.004 );

      return d;
}

void mainImage(out vec4 O, vec2 v)
{
        vec3  r = N( vec3( v+v,.8*R.y) - R ),
              L = N( vec3(-2,5,-2) ),              // -3c
              e = vec3(0,.015,0),
              n,s,o; o.z = -10.;
        float t, d, k=.01;
        vec4 g=vec4(1.001,.782,.344,0),x; x++;    // +
        O *= t;
        for( int i; i++<1500 && t<150.; )
        {
                d = m(o+r*t);
                if( d < k )
                {
                        s = o + r*(t-k);
                        n = N(vec3(m(s+e.yxx),m(s+e.xyx),m(s+e.xxy)) - m(s));
                        O += (   .68 * S(r=reflect(r,n))
                               + .22 * S(n)
                               + .07
                             )

                             //*vec4(1,.8,.1,0)
                             *(g + (1.-g)* pow(1. - abs(dot(r,n)), 5.))    // +33c

                             *x *(2.- min(.7/length(o-s),1.));

                        o = s;
                        //r = r - 2.*dot(r,n)*n; // -18c
                        t = d = 0.;

                        x *= vec4(.6 ,.2,0,0);   // -2c
                        if (x.x < .6 ) { O += x*.5;return; }

                }
                t += d*.3;                       // -1c
                if( int(iTime) % 7 < 1 )
                     d = min( d, length(L-o+r*t) ),
                     O +=   min( 55./d/d,.02)    // -1c
                          / exp(.5*t)
                          * vec4(1,.7,.9,0);
        }
}



/*

// 2023年11月28日

// 三维曲线

// 1356 chars

#define M(c,a) p. c *=mat2(cos(t*a+vec4(0,33,11,0)));


vec3 hash33(vec3 p3)
{
	p3 = fract(p3 * vec3(.1031, .1030, .0973));
    p3 += dot(p3, p3.yxz+33.33);
    return fract((p3.xxy + p3.yxx)*p3.zyx);
}



void rot(inout vec3 p)
{
    float t=iTime;

   // t+=42.63+20.;//20.26;
    t+=87.+35.;


    //t=1.46*.05;

    t*=.05;
    M(xz, .5)
    M(xy, .8)
    M(yz, sin(t*.3)*8./t)
}


float sqrtf(float a){return sign(a)*sqrt(abs(a));}

float m(vec3 p)
{

      rot(p);

      vec3 q,fp=fract(p),rnd=hash33(floor(p));

      vec2 z;

      fp=(fp-.5)*sign(rnd-.5)+.5;// 随机交换两个相对的面，使用sign一句执行,少用3个if句子

      float i,j,b,d=2.;// 单位方体内最大距离根3在2之内

      // 3组面，单独算，简单很多，反而快
      for(;i++<3.;fp=fp.yzx)
      {
            q=fp;
            // 副本，
            // 移圆心到原点，只求一相临两边，另一组是垂直的不管，但圆心不在原点
            q.x--;

            // 圆环距离
            z=vec2(length(q.xy)-.5, q.z-.5);

            float a=atan(q.y, q.x)/3.14159265*2.;

            a=(mod(floor(a*3.+.5), 2.)-.5)*1.;//+1.;

            //z+=a*.02*sqrtf(cos(iTime*.5));
            // 子线束位置归一，用平移与绝对值，成方形分布
            for(j=0.;j++<1.;)z=abs(z)-.075/1.4;

            //z*=a;

            // 一条方形线的距离
            d=min(d,  length(max(z-z,abs(z)-.04))-.004);
      }
      return d;
}





void mainImage(out vec4 O, vec2 v)

{

        vec2 R = iResolution.xy,
             u =(v+v-R)/R.y,
             e=vec2(0,.015);



        vec3 r = normalize(vec3(u,.8)),

             o = vec3(0,0,-10),

             sun=normalize(vec3(-20,50,-20)),

             n,s,f;

        float t, d,mn=.01;

        vec4 xi;xi++;

        O*=0.;//O.x=.5;

        for(int i;i++<1500 && t<150.;)

        {

                d=m(o+r*t);

                if(d<mn )//&&d>0.)// 只内层还是内外层

                {

                        s=o+r*(t-mn);// 由于drct正方形内部距离不能正确，法向量会出错，所以后退一步好很多



                        n=normalize(vec3(m(s+e.yxx),m(s+e.xyx),m(s+e.xxy))-m(s));

                        f=reflect(r,n);

                        //O=txt;return;

                        O+=.7*vec4( .97*pow(max(0., abs(dot(f,sun))),  5.)
                               + .31 *pow(max(0., abs(dot(n,sun))) ,5.)
                               + .1)
                           *xi*vec4(1,.8,.1,0)*(2.- min(.7/length(o-s),1.));



                        o=s;
                        r=r-2.*dot(r,n)*n;
                        t=d=0.;
                        // 三次
                        //if(mod(iTime,.4)>.2){
                        //xi*=.9*vec4(.6 ,.2,.01,0);   if(xi.x< .2 ){O=pow(O+xi*.5,O-O+1./1.);return;}
                        // 二次
                        //}else{
                        xi*=vec4(.6 ,.2,.01,0);   if(xi.x< .6 ){O=pow(O+xi*.5,O-O+1./1.);return;}
                        //}

                }
                t+=d*.42;
                int g=int(iTime*1.)%7;
                float dd=length(sun-o+r*t);
                dd=min(dd,d);
                if(g<1 || g==0)
                     O +=min( 55.5/dd/dd,.02)*exp(-.5*t)*vec4(1,.7,.9,0);

                //按深度乘以系数的想法错的
                //d=max(d,mn*.3);
                //t+=d*.42;//*tong;
        }
}
*/
