Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void main() {
- fragColor = pointerColor;
- float fragColorAlpha = 0.;
- for (int i = 0; i < TAIL_LENGTH; i++) {
- vec2 p1 = splinePointData[i].xy;
- float dist = distance(p1, fragPos);
- float fade = float(i) / float(TAIL_LENGTH);
- float antialiasAlpha = 1. - smoothstep(POINTER_SIZE * fade, POINTER_SIZE * fade + antialias, dist);
- if (antialiasAlpha != 0.) {
- fragColorAlpha = max(fragColorAlpha, antialiasAlpha);
- if (antialiasAlpha == 1.) return;
- }
- }
- float m = 999999.;
- float m_t = 0.;
- int m_i = 0;
- for (int i = 0; i < TAIL_LENGTH - 1; i++) {
- vec2 p1 = splinePointData[i].xy;
- vec2 p2 = splinePointData[i+1].xy;
- vec2 m1 = splinePointData[i].zw;
- vec2 m2 = splinePointData[i+1].zw;
- vec2 spa = 2.*p1-2.*p2+m1+m2;
- vec2 spb = 3.*p2-3.*p1-m2-2.*m1;
- vec2 spc = m1;
- vec2 spd = p1;
- vec2 a = -spa;
- vec2 b = -spb;
- vec2 c = -spc;
- vec2 d = fragPos - spd;
- vec2 q = 6.*p1+3.*m1-6.*p2+3.*m2;
- vec2 r = -6.*p1-4.*m1+6.*p2-2.*m2;
- vec2 s = m1;
- // dist diff coeffs
- float dda = dot(a*q, vec2(1.));
- float ddb = dot(b*q+a*r, vec2(1.));
- float ddc = dot(a*s+b*r+c*q, vec2(1.));
- float ddd = dot(b*s+d*q+c*r, vec2(1.));
- float dde = dot(c*s+d*r, vec2(1.));
- float ddf = dot(d*s, vec2(1.));
- // dist 2nd diff coeffs
- float d2da = 5.*dda;
- float d2db = 4.*ddb;
- float d2dc = 3.*ddc;
- float d2dd = 2.*ddd;
- float d2de = dde;
- for (int search_i = 1; search_i <= int(${zetaPointerSettings.nmSearchIters}); search_i += 1) {
- float k = float(search_i) / (float(${zetaPointerSettings.nmSearchIters}) + 1.);
- for (int i_ = 0; i_ < ${zetaPointerSettings.nmIterations}; i_++) {
- 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);
- k = k - delta;
- if (delta < 1. / pow(10., float(${zetaPointerSettings.nmEpsilon}))) {
- break;
- }
- }
- if (0. <= k && k <= 1.) {
- float splineT = float(i)+k;
- vec2 splinePos = spa * k*k*k + spb * k*k + spc * k + spd;
- float dist = length(fragPos - splinePos);
- if (dist < m) {
- m = dist;
- m_t = splineT;
- m_i = i;
- }
- }
- }
- }
- float fade = m_t/float(TAIL_LENGTH);
- float antialiasAlpha = 1. - smoothstep(POINTER_SIZE * fade, POINTER_SIZE * fade + antialias, m);
- if (antialiasAlpha != 0.) {
- fragColorAlpha = max(fragColorAlpha, antialiasAlpha);
- if (antialiasAlpha == 1.) return;
- }
- fragColor *= fragColorAlpha;
- fragColor *= pointerColor.a;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement