Advertisement
Guest User

Untitled

a guest
Jul 27th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. float time;
  2.  
  3. // polynomial smooth min (k = 0.1) (from IQ)
  4. float smin( float a, float b, float k )
  5. {
  6.     float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );
  7.     return mix( b, a, h ) - k*h*(1.0-h);
  8. }
  9.  
  10.  
  11. float smax(float a,float b, float k)
  12. {
  13.     return -smin(-a,-b,k);
  14. }
  15.  
  16. mat2 rotmat(float a)
  17. {
  18.     return mat2(cos(a),sin(a),-sin(a),cos(a));
  19. }
  20.  
  21. float cylinder(vec3 p,vec3 dir,float h,float r)
  22. {
  23.     float t=dot(p,dir);
  24.     float d=distance(p,dir*t);
  25.     return length(max(abs(vec2(d,t))-vec2(r,h),vec2(0)));
  26.     d=max(d,-t);
  27.     d=max(d,t-h);
  28.     return d;
  29. }
  30.  
  31. float pupdist=1e4;
  32.  
  33. float rabdist(vec3 p)
  34. {
  35.     float an=.5*.5*2.*6. +iMouse.x/iResolution.x*6.;
  36.     p.xz=mat2(cos(an),sin(an),sin(an),-cos(an))*p.xz;
  37.    
  38.     float time2=time*2.4;
  39.  
  40.     p.y+=2.3;
  41.     p.xy*=rotmat(cos(time2+1.)*.04);
  42.     p.y-=2.3;
  43.  
  44.     vec3 op=p;
  45.  
  46.     vec3 p2=p;
  47.     p2.xy*=rotmat(cos(time2)*.1);
  48.  
  49.     vec3 p3=p;
  50.     p3.xy*=rotmat(cos(time2-.0-length(p)/2.)*.13);
  51.  
  52.     float d=1e4;
  53.     p.x=abs(p.x);
  54.     p2.x=abs(p2.x);
  55.     p3.x=abs(p3.x);
  56.  
  57.     d=smin(length(p2-vec3(-.75,0.,-.41))-.9,length(p2-vec3(.75,6.,-.1))-.5,2.);
  58.     d=smin(d,length(p2-vec3(0,0.4,-.1))-.9,1.6);
  59.     d+=.1;  
  60.     // ears 1
  61.     d=smin(d,distance(vec3(.7,clamp(p3.y,0.,2.2),0.),p3.xyz)-.4,.14);  
  62.     d=smax(d,-(length(p3-vec3(.7,1.7,-0.5))-.5),.2);
  63.  
  64.     d=smin(d,distance(vec3(0.,clamp(p.y,-1.6,-1.1),0.),p.xyz)-.6,.04);  
  65.     d=smin(d,distance(vec3(.3,clamp(p.y,-2.6,-1.5),0.),p.xyz)-.3,.1);  
  66.     d=smin(d,distance(vec3(0.,-1.5,-.2),p)-.5+cos(time*3.)*.03,.4);  
  67.  
  68.     // ears 2
  69.     d=smin(d,distance(vec3(1.1,2.3,-.1),p3)-.2,.8);  
  70.  
  71.     // tail
  72.     d=smin(d,distance(vec3(0,-1.7,.6),p)-.3,.1);  
  73.  
  74.     vec3 q=vec3(0.35,.4,-1);
  75.  
  76.     if(mod(time-1.,4.)>.04)
  77.     {
  78.         d=smax(d,-(cylinder(p2-q,normalize(q-p2),.3,.1)-.0001),.05);
  79.         d=smin(d,(length(p2-q*.9)-.2),.24);
  80.  
  81.         // eye pupils
  82.         if(op.x>0.)
  83.             pupdist=(length(p2-vec3(.39,.32,-1.))-.2);
  84.         else
  85.             pupdist=(length(p2-vec3(.28,.32,-1.02))-.2);
  86.  
  87.         d=smin(d,pupdist,.005);
  88.     }
  89.  
  90.     // nose
  91.     d=smin(d,(length(p2-vec3(0,.1,-1.02))-.2),.02);
  92.  
  93.     float d3=smax(-(length(p-vec3(-.05,-.29,-1.02))-.1),-(length(p-vec3(.05,-.29,-1.02))-.1),.1);
  94.  
  95.     float d2=max(p2.z,distance(p2,vec3(clamp(p2.x,0.,.3),-.2,clamp(p2.z,-2.,2.)))+.01);
  96.  
  97.     float time4=time/8.;
  98.     float gg=smoothstep(0.,1.,clamp((min(fract(time4),1.-fract(time4))-.25)*64.,0.,1.));
  99.     d=smax(d,mix(-d2,d3,gg),.1);
  100.  
  101.     // tooth
  102.     d=min(d,(length(p-vec3(.0,-.2,-1.02))-.08));
  103.  
  104.     p.y+=.2;
  105.     p.xy*=rotmat(.4+cos(time2*2.)*.02);
  106.  
  107.     // arms
  108.     float armd=smin(distance(vec3(.2,clamp(p.y,-1.8,-0.),0.),p.xyz)-.2,
  109.                     distance(p,vec3(0.2,-1.7,0))-.2,.2);
  110.  
  111.     d=smin(d,armd,.05);  
  112.  
  113.     return d;
  114. }
  115.  
  116. float floordist(vec3 p)
  117. {
  118.     return p.y+2.85;
  119. }
  120.  
  121. float f(vec3 p)
  122. {
  123.     return min(rabdist(p),floordist(p));
  124. }
  125.  
  126. float sceneDist(vec3 p) { return f(p); }
  127.  
  128. vec3 sceneNorm(vec3 p)
  129. {
  130.     vec3 e=vec3(1e-2,0,0);
  131.     float d = sceneDist(p);
  132.     return normalize(vec3(sceneDist(p + e.xyy) - d, sceneDist(p + e.yxy) - d,
  133.                           sceneDist(p + e.yyx) - d));
  134. }
  135.  
  136.  
  137. // from simon green and others
  138. float ambientOcclusion(vec3 p, vec3 n)
  139. {
  140.     const int steps = 18;
  141.     const float delta = 1.5;
  142.  
  143.     float a = 0.0;
  144.     float weight = .5;
  145.     for(int i=1; i<=steps; i++) {
  146.         float d = (float(i) / float(steps)) * delta;
  147.         a += weight*(d - sceneDist(p + n*d));
  148.         weight *= 0.6;
  149.     }
  150.     return clamp(1.0 - a, 0.0, 1.0);
  151. }
  152.  
  153. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  154. {
  155.     vec2 uv = (fragCoord/iResolution.xy * 2. - 1.) * .75;
  156.     uv.x *= iResolution.x / iResolution.y;
  157.     vec2 vt=uv;
  158.     float an;
  159.     time=iTime;
  160.  
  161.     vec3 ro=vec3(0.,-.1,-8.+iMouse.y/iResolution.y*2.);
  162.     vec3 rd=normalize(vec3(uv,1.8));
  163.  
  164.  
  165.     float s=20.;
  166.  
  167.     float t=2.,d=0.;
  168.     for(int i=0;i<120;++i)
  169.     {
  170.         d=f(ro+rd*t);
  171.         if(d<1e-4)break;
  172.         if(t>50.)break;
  173.         t+=d;
  174.     }
  175.  
  176.     float d2=f(ro+rd*t+normalize(vec3(1,2,-2))*5e-2);
  177.     float l=.5+.5*(d2-d)/5e-2;
  178.  
  179.     vec3 rp=(ro+rd*t);
  180.  
  181.     vec3 n=sceneNorm(rp);
  182.  
  183.     vec3 col=vec3(1);
  184.  
  185.     col*=mix(.1,1.,smoothstep(0.0,.01,pupdist));
  186.  
  187.     vec3 bcol=vec3(1,.4,.18);
  188.  
  189.     if(floordist(rp)<rabdist(rp))
  190.         col=max(mix(bcol+(.1-length(vt.xy)/3.),vec3(1),.1),0.);
  191.  
  192.     col*=l;
  193.  
  194.     col+=pow(clamp(-n.y,0.,1.),2.)*bcol/1.5;
  195.     if(n.y<.9999)col+=pow(clamp(-rp.y-1.8,0.,1.),4.)*vec3(1,.4,.18)/3.;
  196.  
  197.     if(n.y>.99999)
  198.     {
  199.         col*=pow(ambientOcclusion(rp,n),1.);
  200.         col*=mix(.7,1.,smoothstep(0.,2.,length(rp.xz)));
  201.     }
  202.     else
  203.     {
  204.         vec3 r=reflect(rd,n);
  205.         col += texture(iChannel0, r).rgb*.2*pow(clamp(0.,1.,1.-dot(-rd,n)),2.);
  206.         col*=pow(ambientOcclusion(rp,n),2.);
  207.     }
  208.        
  209.     fragColor.rgb=max(col,0.);
  210.     fragColor.rgb=sqrt(fragColor.rgb+.01);
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement