
// 2023年10月13日 09时48分38秒

// 足球

// 2023-11-6 23:15

#define T(v) texture(iChannel0,v)

#define M(a) mat2(cos(a),-sin(a),sin(a),cos(a))

float pat=1.;vec3 q;


/*
float line2(vec3 p, vec3 o, vec3 a)

{

        p -=o; a -= o;

        float s, r, l = dot(p,a)/dot(a,a);



        l=clamp(l, 0., 1.);

       vec3 d =p - a * l, y=vec3(0,1,0), x = normalize( cross(y,a) );


       y=normalize(cross(a,x));

       r = length(d);

       s = atan(dot(d,y),dot(d,x));

       s = l;

       //d = d - (.03* (x * cos(s*4.)+ y* sin(s*4.)));

        return length(d)-.02;

}
*/




float line(vec3 p, vec3 o, vec3 a)

{
        float r=.05,
              d=length(p-o)-r;

              d=min(d,  length(p-a)-r);

        p -=o; a -= o;



        float x=dot(p,a)/dot(a,a),y;



        x=clamp(x,.18,.82);

        p = p - a * clamp(x,0.,1.);

        y= length(p);
        x=abs(x-.5);
        d=min(d, y-.25*x*x-.04);// length(vec2(x,y)-vec2(x,  x*x+.5));
        return d;
}



/*
float line2(vec3 p, vec3 o, vec3 a)

{

        p -=o; a -= o;

        p = p - a * clamp(dot(p,a)/dot(a,a),0.,1.);

        return length(p)-.03;

}
*/










float m(vec3 p)

{

        //return length(p) - .5;

        float d, t = iTime*.2; p.xy *= M(t*.3); p.yz *= M(t);  p.zx *= M(t*2.);



        q=p;


        //return length(max(abs(p)-.4,vec3(0)))-.01;


        int i,j,k,m;

        //float   d;//,f = pow(5.,.5)*.5+.5;

        //vec3  n =normalize( vec3(f,0,1./f) - 1.);

        vec3 v[4],z[3], n = normalize(vec3(.618,-1,-.382));



        for(;j++<9;)
                d = dot(p, n = n.yzx),
                p = d<0. ? p - 2. * d * n : p ;


      ///  pat=.5*dot(cos(p*vec3(5,609,790)),sin(125.*p.yzx))+1.;



        // 输岀面心 v
        for(;k<4;k++)
                v[k]= cross(n=n.yzx,n.yzx);


        v[0]=v[2];
        for(i =0;i<3;i++) // 线段上取点
                //v[0]=v[2],
                z[i] = v[i]+(v[i+1]-v[i]) / 3.;  //floor(iTime-10.+.5)*10.;


        // 坐标顺旋 并连接各自的2种线
        d=9e2;
        for(;m++<6;p=p.yzx)
                d = min(d, line(p, z[0],z[m%2+1]));

        return d;

}



void mainImage(out vec4 O, vec2 v)

{





        vec2 R = iResolution.xy,

             u = (v + v - R) / R.y;



        vec3 o,

             r = normalize( vec3(u, 1.)),// 整数

             e,

             n, s;

        O*=0.;
        //O=T(u);

        float d = 1e-3,t,i;

        e.y = d;

        o.z = -1.2;



        for(;i < 350. && t < 55. && d >=e.y ;i++)

                t += d = m(o += r * d * .45) ;

        if(i >= 350. || t > 55.){O += .5;r.z+=.5;O=.8*texture(iChannel2,r); return;}



        //o += r * (t - d);

        n = normalize(  vec3(m(o+e.yxx),m(o+e),m(o+e.xxy)) - d );



        vec3 m=normalize(max(abs(n),vec3(.001)));
        //m=max(n*n,vec3(.001)); m/=(m.x+m.y+m.z);//m*=m;
        vec4 col;
        m=m.yzx;
        //o*=122.1;
        //col=T(q.yz)*m.x+T(q.zx)*m.y+T(q.xy)*m.z;
        col=vec4(1);

        s =normalize (  vec3(-1,2,-3) );

        d=dot(reflect(r,n),s)*.5+pat*.025 +.5;t=.7;
        for(i=0.;i++<15.;t*=1.825)
          O += t*pow(d,exp(i));
       //O=pow(O,vec4(1.5))*(1.+pat*.2);
       O *= 1.*pow(col,vec4(1./2.2))
           *pow(texture(iChannel1,reflect(normalize(r),n)),  vec4(1./1.8));
}

