Advertisement
HydrogenMacro

s

Jun 9th, 2025
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void main() {
  2.           fragColor = pointerColor;
  3.           float fragColorAlpha = 0.;
  4.           for (int i = 0; i < TAIL_LENGTH; i++) {
  5.             vec2 p1 = splinePointData[i].xy;
  6.             float dist = distance(p1, fragPos);
  7.             float fade = float(i) / float(TAIL_LENGTH);
  8.             float antialiasAlpha = 1. - smoothstep(POINTER_SIZE * fade, POINTER_SIZE * fade + antialias, dist);
  9.             if (antialiasAlpha != 0.) {
  10.               fragColorAlpha = max(fragColorAlpha, antialiasAlpha);
  11.               if (antialiasAlpha == 1.) return;
  12.             }
  13.           }
  14.           float m = 999999.;
  15.           float m_t = 0.;
  16.           int m_i = 0;
  17.           for (int i = 0; i < TAIL_LENGTH - 1; i++) {
  18.             vec2 p1 = splinePointData[i].xy;
  19.             vec2 p2 = splinePointData[i+1].xy;
  20.             vec2 m1 = splinePointData[i].zw;
  21.             vec2 m2 = splinePointData[i+1].zw;
  22.                        
  23.             vec2 spa = 2.*p1-2.*p2+m1+m2;
  24.             vec2 spb = 3.*p2-3.*p1-m2-2.*m1;
  25.             vec2 spc = m1;
  26.             vec2 spd = p1;
  27.  
  28.             vec2 a = -spa;
  29.             vec2 b = -spb;
  30.             vec2 c = -spc;
  31.             vec2 d = fragPos - spd;
  32.  
  33.             vec2 q = 6.*p1+3.*m1-6.*p2+3.*m2;
  34.             vec2 r = -6.*p1-4.*m1+6.*p2-2.*m2;
  35.             vec2 s = m1;
  36.  
  37.             // dist diff coeffs
  38.             float dda = dot(a*q, vec2(1.));
  39.             float ddb = dot(b*q+a*r, vec2(1.));
  40.             float ddc = dot(a*s+b*r+c*q, vec2(1.));
  41.             float ddd = dot(b*s+d*q+c*r, vec2(1.));
  42.             float dde = dot(c*s+d*r, vec2(1.));
  43.             float ddf = dot(d*s, vec2(1.));
  44.  
  45.             // dist 2nd diff coeffs
  46.             float d2da = 5.*dda;
  47.             float d2db = 4.*ddb;
  48.             float d2dc = 3.*ddc;
  49.             float d2dd = 2.*ddd;
  50.             float d2de = dde;
  51.            
  52.             for (int search_i = 1; search_i <= int(${zetaPointerSettings.nmSearchIters}); search_i += 1) {
  53.               float k = float(search_i) / (float(${zetaPointerSettings.nmSearchIters}) + 1.);
  54.            
  55.               for (int i_ = 0; i_ < ${zetaPointerSettings.nmIterations}; i_++) {
  56.                 float delta = (dda * k*k*k*k*k + ddb * k*k*k*k + ddc * k*k*k + ddd * k*k + dde * k + ddf)/(d2da * k*k*k*k + d2db * k*k*k + d2dc * k*k + d2dd * k + d2de);
  57.                 k = k - delta;
  58.                 if (delta < 1. / pow(10., float(${zetaPointerSettings.nmEpsilon}))) {
  59.                   break;
  60.                 }
  61.               }
  62.  
  63.               if (0. <= k && k <= 1.) {
  64.                 float splineT = float(i)+k;
  65.                 vec2 splinePos = spa * k*k*k + spb * k*k + spc * k + spd;
  66.                 float dist = length(fragPos - splinePos);
  67.                 if (dist < m) {
  68.                   m = dist;
  69.                   m_t = splineT;
  70.                   m_i = i;
  71.                 }
  72.               }
  73.             }
  74.            
  75.  
  76.           }
  77.           float fade = m_t/float(TAIL_LENGTH);
  78.           float antialiasAlpha = 1. - smoothstep(POINTER_SIZE * fade, POINTER_SIZE * fade + antialias, m);
  79.           if (antialiasAlpha != 0.) {
  80.             fragColorAlpha = max(fragColorAlpha, antialiasAlpha);
  81.             if (antialiasAlpha == 1.) return;
  82.           }
  83.           fragColor *= fragColorAlpha;
  84.           fragColor *= pointerColor.a;
  85.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement