Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.00 KB | None | 0 0
  1. uniform vec2 position[100];
  2. uniform int NUM;
  3. uniform float blur;
  4. uniform int strength;
  5. uniform vec3 color;
  6. vec2 cubic( in vec2 a, in vec2 b, in vec2 c, in vec2 d, float v1 )
  7. {
  8.     float u1 = 1.0 - v1;
  9.     float u2 = u1*u1;
  10.     float v2 = v1*v1;
  11.     float u3 = u2*u1;
  12.     float v3 = v2*v1;
  13.     return a*u3 + d*v3 + b*3.0*u2*v1 + c*3.0*u1*v2;
  14. }
  15. float length2( in vec2 v ) { return dot(v,v); }
  16. float sdLine2( vec2 p, vec2 a, vec2 b )
  17. {
  18.     vec2 pa = p-a, ba = b-a;
  19.    
  20.     vec2 bb = pa - ba*clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
  21.     float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
  22.     return dot(bb,bb);
  23. }
  24.  
  25. float sdSegment_Expensive( vec2 p, vec2[100] pos,  vec2[100] ta,int num)
  26. {
  27.    
  28.     float d = 1.;
  29.     float s = 1.0;
  30.     vec2 a,b,na,nb;
  31.     for(int i =0,j=num-1;i<num;j=i,i++){
  32.        
  33.         a = pos[i];
  34.         b = pos[j];
  35.         na = ta[i];
  36.         nb = ta[j];
  37.     vec2 k1 = (a*2.0+b)/3.0; k1 = a + na*dot(na,k1-a)/dot(na,na);
  38.     vec2 k2 = (b*2.0+a)/3.0; k2 = b + nb*dot(nb,k2-b)/dot(nb,nb);
  39.     float md = length2(p-a);
  40.     vec2 ov = a;
  41.     float ss = 1.0;
  42.     int ll = int(floor(iTime*4.));    
  43.     for( int k=1; k<strength; k++ )
  44.     {
  45.         vec2 v = cubic( a, k1, k2, b, float(k+0)/(float(strength)-1.) );
  46.         vec2 e = ov-v;
  47.         vec2 w = p-v;
  48.         // bvec3 c = bvec3(p.y>=b.y,p.y<ov.y,e.x*w.y>e.y*w.x);
  49.        // if( all(c) || all(not(c)) ) ss*=-1.0;
  50.         vec2 b = w - e*clamp( dot(w,e)/dot(e,e), 0.0, 1.0 );
  51.        
  52.        
  53.          bvec3 c = bvec3(p.y>=v.y,p.y<ov.y,e.x*w.y>e.y*w.x);
  54.         if( all(c) || all(not(c))) s*=-1.0;
  55.        // float di = sdLine2( p, v, ov );
  56.          ov = v;
  57.        
  58.         md = min( dot(b,b), md );
  59.      
  60.     }
  61.        
  62.          d = min(d,md);
  63.          
  64.          
  65.        
  66.        
  67.     }  
  68.     return sqrt(d)*s;
  69. }
  70.  
  71. float sdSegment_Cheap( vec2 p, vec2 a, vec2 b, vec2 na, vec2 nb )
  72. {
  73.     // secondary points
  74.     vec2 k1 = (a*2.0+b)/3.0; k1 = a + na*dot(na,k1-a)/dot(na,na);
  75.     vec2 k2 = (b*2.0+a)/3.0; k2 = b + nb*dot(nb,k2-b)/dot(nb,nb);
  76.  
  77.     vec2 pa = p-a, ba = b-a;
  78.     float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
  79.  
  80.     return sqrt( sdLine2( p, cubic( a, k1, k2, b, clamp( h-0.1, 0.0, 1.0) ),
  81.                              cubic( a, k1, k2, b, clamp( h+0.1, 0.0, 1.0) ) ) );
  82. }
  83.  
  84. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  85. {
  86.    
  87.     vec2 uv = fragCoord/iResolution.xy;
  88.     //tangent array
  89.     vec2 tang[100];
  90.  
  91.     for(int i=0;i<NUM;i++){
  92.         //calculating tangent
  93.  
  94.         vec2 tangent;
  95.         if(i==0){
  96.              tangent = normalize(position[0]-position[NUM-1])+normalize(position[i+1]-position[i]);
  97.         }
  98.         else
  99.         {
  100.             tangent = normalize(position[i]-position[i-1])+normalize(position[i+1]-position[i]);
  101.         }
  102.        
  103.         tang[i] = tangent;
  104.        
  105.        
  106.     }
  107.  
  108.    
  109.     float k = sdSegment_Expensive(uv,position,tang,NUM);
  110.    
  111.     vec3 col =vec3(clamp(smoothstep(0.2,0.19-blur,k*22.),0.,1.))*color;
  112.  
  113.    
  114.     fragColor = vec4(col,1.0);
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement