Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- uniform vec2 position[100];
- uniform int NUM;
- uniform float blur;
- uniform int strength;
- uniform vec3 color;
- vec2 cubic( in vec2 a, in vec2 b, in vec2 c, in vec2 d, float v1 )
- {
- float u1 = 1.0 - v1;
- float u2 = u1*u1;
- float v2 = v1*v1;
- float u3 = u2*u1;
- float v3 = v2*v1;
- return a*u3 + d*v3 + b*3.0*u2*v1 + c*3.0*u1*v2;
- }
- float length2( in vec2 v ) { return dot(v,v); }
- float sdLine2( vec2 p, vec2 a, vec2 b )
- {
- vec2 pa = p-a, ba = b-a;
- vec2 bb = pa - ba*clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
- float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
- return dot(bb,bb);
- }
- float sdSegment_Expensive( vec2 p, vec2[100] pos, vec2[100] ta,int num)
- {
- float d = 1.;
- float s = 1.0;
- vec2 a,b,na,nb;
- for(int i =0,j=num-1;i<num;j=i,i++){
- a = pos[i];
- b = pos[j];
- na = ta[i];
- nb = ta[j];
- vec2 k1 = (a*2.0+b)/3.0; k1 = a + na*dot(na,k1-a)/dot(na,na);
- vec2 k2 = (b*2.0+a)/3.0; k2 = b + nb*dot(nb,k2-b)/dot(nb,nb);
- float md = length2(p-a);
- vec2 ov = a;
- float ss = 1.0;
- int ll = int(floor(iTime*4.));
- for( int k=1; k<strength; k++ )
- {
- vec2 v = cubic( a, k1, k2, b, float(k+0)/(float(strength)-1.) );
- vec2 e = ov-v;
- vec2 w = p-v;
- // bvec3 c = bvec3(p.y>=b.y,p.y<ov.y,e.x*w.y>e.y*w.x);
- // if( all(c) || all(not(c)) ) ss*=-1.0;
- vec2 b = w - e*clamp( dot(w,e)/dot(e,e), 0.0, 1.0 );
- bvec3 c = bvec3(p.y>=v.y,p.y<ov.y,e.x*w.y>e.y*w.x);
- if( all(c) || all(not(c))) s*=-1.0;
- // float di = sdLine2( p, v, ov );
- ov = v;
- md = min( dot(b,b), md );
- }
- d = min(d,md);
- }
- return sqrt(d)*s;
- }
- float sdSegment_Cheap( vec2 p, vec2 a, vec2 b, vec2 na, vec2 nb )
- {
- // secondary points
- vec2 k1 = (a*2.0+b)/3.0; k1 = a + na*dot(na,k1-a)/dot(na,na);
- vec2 k2 = (b*2.0+a)/3.0; k2 = b + nb*dot(nb,k2-b)/dot(nb,nb);
- vec2 pa = p-a, ba = b-a;
- float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
- return sqrt( sdLine2( p, cubic( a, k1, k2, b, clamp( h-0.1, 0.0, 1.0) ),
- cubic( a, k1, k2, b, clamp( h+0.1, 0.0, 1.0) ) ) );
- }
- void mainImage( out vec4 fragColor, in vec2 fragCoord )
- {
- vec2 uv = fragCoord/iResolution.xy;
- //tangent array
- vec2 tang[100];
- for(int i=0;i<NUM;i++){
- //calculating tangent
- vec2 tangent;
- if(i==0){
- tangent = normalize(position[0]-position[NUM-1])+normalize(position[i+1]-position[i]);
- }
- else
- {
- tangent = normalize(position[i]-position[i-1])+normalize(position[i+1]-position[i]);
- }
- tang[i] = tangent;
- }
- float k = sdSegment_Expensive(uv,position,tang,NUM);
- vec3 col =vec3(clamp(smoothstep(0.2,0.19-blur,k*22.),0.,1.))*color;
- fragColor = vec4(col,1.0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement