Neon Pursuit - Sunset Cyan

by ENK, progress bar

Phi thuyền chiến đấu phối cyan, vàng hoàng hôn và hồng cam theo bảng màu ảnh bìa

25 downloads Download file, 16.4 KB
How it installs, its SHA-256 and its code

Click Apply: MusicBar downloads it, checks its SHA-256 and puts it on the taskbar, or just puts it on if it already has it. Needs MusicBar 1.8 or newer.

SHA-256 fee8f63af200a9f340e54395320b3c8bfb9ed05fbb62ae0d5467df98f1b493af

//! name: Neon Pursuit - Sunset Cyan
//! author: ENK
//! kind: progress
//! description: Phi thuyền chiến đấu phối cyan, vàng hoàng hôn và hồng cam theo bảng màu ảnh bìa

float hash1(float n)
{
    return frac(sin(n * 127.1 + 311.7) * 43758.5453);
}

float triMask(float2 p, float2 a, float2 b, float2 c)
{
    float2 v0 = b - a;
    float2 v1 = c - a;
    float2 v2 = p - a;
    float d00 = dot(v0, v0);
    float d01 = dot(v0, v1);
    float d11 = dot(v1, v1);
    float d20 = dot(v2, v0);
    float d21 = dot(v2, v1);
    float den = max(d00 * d11 - d01 * d01, 0.0001);
    float v = (d11 * d20 - d01 * d21) / den;
    float w = (d00 * d21 - d01 * d20) / den;
    float u = 1.0 - v - w;
    return step(0.0, min(u, min(v, w)));
}

float strokeGlow(float2 p, float2 a, float2 b, float width)
{
    float2 pa = p - a;
    float2 ba = b - a;
    float h = saturate(dot(pa, ba) / max(dot(ba, ba), 0.0001));
    float d = length(pa - ba * h);
    return exp(-d / width);
}

float roundedBoxMask(float2 p, float2 halfSize, float radius, float softness)
{
    float2 d = abs(p) - halfSize + radius;
    float sd = length(max(d, 0.0)) + min(max(d.x, d.y), 0.0) - radius;
    return 1.0 - smoothstep(-softness, softness, sd);
}

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float2 p = uv * size;
    float H = max(size.y, 32.0);
    float t = time;

    // V21: album-reactive palette, guided toward the cover's sunset + cyan lettering.
    // MusicBar supplies colorA/B/C from the current album artwork.
    // Fixed hue anchors prevent noisy extracted hues (e.g. green foliage) from
    // turning the ship green, while the album colours still tint each role.
    float3 ice = float3(0.88, 0.97, 1.00);
    float3 albumA = saturate(colorA.rgb);
    float3 albumB = saturate(colorB.rgb);
    float3 albumC = saturate(colorC.rgb);

    float3 cyan = lerp(float3(0.035, 0.78, 0.94), albumA, 0.24);
    float3 blue = lerp(float3(0.10, 0.30, 0.72), albumB, 0.22);
    float3 gold = lerp(float3(1.00, 0.58, 0.13), albumC, 0.20);
    float3 coral = lerp(float3(1.00, 0.29, 0.25), albumB, 0.18);
    float3 violet = lerp(coral, gold, 0.28);
    float3 magenta = lerp(coral, cyan, 0.18);
    float3 armor = float3(0.018, 0.045, 0.13);
    float3 armorBlue = float3(0.035, 0.16, 0.34);

    float shipX = lerp(-H * 0.95, size.x + H * 0.95, saturate(progress));
    float shipY = size.y * (0.50 + 0.014 * sin(t * 1.05));
    float2 q = p - float2(shipX, shipY);

    float3 rgb = float3(0.0, 0.0, 0.0);
    float alpha = 0.0;

    // Broader wake: soft outer aura, two coloured ribbons and a bright central exhaust.
    float behind = saturate((shipX - p.x) / (H * 9.0));
    float wakeFade = saturate((shipX - p.x) / (H * 1.35));
    float phase = (shipX - p.x) / H;

    float wakeY1 = shipY + H * 0.055 * sin(phase * 1.65 - t * 1.45);
    float wakeY2 = shipY + H * 0.105 * sin(phase * 1.12 - t * 1.05 + 1.0);
    float wakeY3 = shipY + H * 0.145 * sin(phase * 0.82 - t * 0.82 + 2.0);

    float aura = exp(-abs(p.y - shipY) / (H * 0.19)) * behind;
    float ribbon1 = exp(-abs(p.y - wakeY1) / 2.35) * behind;
    float ribbon2 = exp(-abs(p.y - wakeY2) / 1.85) * behind;
    float ribbon3 = exp(-abs(p.y - wakeY3) / 1.40) * behind;
    float hotCore = exp(-abs(p.y - shipY) / 1.10) * behind;

    rgb += cyan * aura * 0.58;
    rgb += cyan * ribbon1 * 0.92;
    rgb += gold * ribbon2 * 0.78;
    rgb += coral * ribbon3 * 0.68;
    rgb += ice * hotCore * 0.72;
    alpha += (aura * 0.32 + ribbon1 * 0.52 + ribbon2 * 0.42
            + ribbon3 * 0.25 + hotCore * 0.25) * wakeFade;

    // A few separated fine filaments make the broad wake feel energetic, not like one bar.
    for (int i = 0; i < 4; i++)
    {
        float fi = (float)i;
        float offset = (fi - 1.5) * H * 0.045;
        float yy = shipY + offset
                 + H * 0.025 * sin(phase * (1.0 + fi * 0.10) + t * 1.4 + fi);
        float filament = exp(-abs(p.y - yy) / 0.34) * behind;
        float3 fc = (i == 1 || i == 3) ? gold : cyan;
        rgb += fc * filament * 0.65;
        alpha += filament * 0.16 * wakeFade;
    }

    // V11 silhouette: broad, layered fighter craft. The wings are clipped trapezoids,
    // not two pointed triangles meeting at the centre.
    // Upper wing: broad leading shoulder, flattened outer tip and swept rear edge.
    float wingUA = triMask(q, float2(-H * 0.10, -H * 0.045),
                              float2(H * 0.10, -H * 0.075),
                              float2(-H * 0.34, -H * 0.43));
    float wingUB = triMask(q, float2(-H * 0.10, -H * 0.045),
                              float2(-H * 0.34, -H * 0.43),
                              float2(-H * 0.57, -H * 0.39));
    float wingUC = triMask(q, float2(-H * 0.10, -H * 0.045),
                              float2(-H * 0.57, -H * 0.39),
                              float2(-H * 0.40, -H * 0.10));

    // Lower wing mirrors the upper one.
    float wingLA = triMask(q, float2(-H * 0.10, H * 0.045),
                              float2(H * 0.10, H * 0.075),
                              float2(-H * 0.34, H * 0.43));
    float wingLB = triMask(q, float2(-H * 0.10, H * 0.045),
                              float2(-H * 0.34, H * 0.43),
                              float2(-H * 0.57, H * 0.39));
    float wingLC = triMask(q, float2(-H * 0.10, H * 0.045),
                              float2(-H * 0.57, H * 0.39),
                              float2(-H * 0.40, H * 0.10));
    float wings = saturate(wingUA + wingUB + wingUC + wingLA + wingLB + wingLC);

    // Main fuselage is a substantial armored body with a separate pointed nose.
    float centralHull = roundedBoxMask(q - float2(-H * 0.04, 0.0),
                                       float2(H * 0.43, H * 0.115), H * 0.055, 0.7);
    float noseUpper = triMask(q, float2(H * 0.22, -H * 0.105),
                                 float2(H * 0.88, 0.0),
                                 float2(H * 0.22, 0.0));
    float noseLower = triMask(q, float2(H * 0.22, 0.0),
                                 float2(H * 0.88, 0.0),
                                 float2(H * 0.22, H * 0.105));
    float nose = saturate(noseUpper + noseLower);
    float hull = saturate(centralHull + nose);

    // Raised shoulder armor plates sit over the wing roots.
    float shoulderTop = triMask(q, float2(-H * 0.31, -H * 0.095),
                                   float2(H * 0.12, -H * 0.09),
                                   float2(-H * 0.02, -H * 0.018));
    float shoulderBottom = triMask(q, float2(-H * 0.31, H * 0.095),
                                      float2(H * 0.12, H * 0.09),
                                      float2(-H * 0.02, H * 0.018));

    // Two clearly separated engine pods at the rear.
    float podTop = roundedBoxMask(q - float2(-H * 0.39, -H * 0.075),
                                  float2(H * 0.15, H * 0.043), H * 0.025, 0.55);
    float podBottom = roundedBoxMask(q - float2(-H * 0.39, H * 0.075),
                                     float2(H * 0.15, H * 0.043), H * 0.025, 0.55);
    float engineTop = exp(-((q.x + H * 0.53) * (q.x + H * 0.53) / 5.0
                           + (q.y + H * 0.075) * (q.y + H * 0.075) / 1.5));
    float engineBottom = exp(-((q.x + H * 0.53) * (q.x + H * 0.53) / 5.0
                              + (q.y - H * 0.075) * (q.y - H * 0.075) / 1.5));

    // Raised cockpit canopy, offset forward from the centreline.
    float cockpit = exp(-((q.x - H * 0.22) * (q.x - H * 0.22) / (H * H * 0.020)
                         + q.y * q.y / (H * H * 0.0055)));
    float cockpitRim = strokeGlow(q, float2(H * 0.08, -H * 0.015),
                                     float2(H * 0.43, -H * 0.015), 0.52);

    // Structural panel seams and luminous contours.
    float spine = strokeGlow(q, float2(-H * 0.34, 0.0), float2(H * 0.72, 0.0), 0.62);
    float seamTop = strokeGlow(q, float2(-H * 0.28, -H * 0.065), float2(H * 0.04, -H * 0.065), 0.42);
    float seamBottom = strokeGlow(q, float2(-H * 0.28, H * 0.065), float2(H * 0.04, H * 0.065), 0.42);

    float wingEdges =
        strokeGlow(q, float2(-H * 0.10, -H * 0.045), float2(-H * 0.34, -H * 0.43), 0.72) +
        strokeGlow(q, float2(-H * 0.34, -H * 0.43), float2(-H * 0.57, -H * 0.39), 0.72) +
        strokeGlow(q, float2(-H * 0.57, -H * 0.39), float2(-H * 0.40, -H * 0.10), 0.62) +
        strokeGlow(q, float2(-H * 0.10, H * 0.045), float2(-H * 0.34, H * 0.43), 0.72) +
        strokeGlow(q, float2(-H * 0.34, H * 0.43), float2(-H * 0.57, H * 0.39), 0.72) +
        strokeGlow(q, float2(-H * 0.57, H * 0.39), float2(-H * 0.40, H * 0.10), 0.62);

    float hullEdge =
        strokeGlow(q, float2(-H * 0.47, -H * 0.115), float2(H * 0.22, -H * 0.115), 0.65) +
        strokeGlow(q, float2(H * 0.22, -H * 0.115), float2(H * 0.88, 0.0), 0.65) +
        strokeGlow(q, float2(H * 0.88, 0.0), float2(H * 0.22, H * 0.115), 0.65) +
        strokeGlow(q, float2(H * 0.22, H * 0.115), float2(-H * 0.47, H * 0.115), 0.65);


    // V21 changes palette distribution only; V19 geometry, wake motion, 80 particles and shield behaviour remain intact.
    // V15 armor panels: small inset shapes follow the original V14 silhouette.
    // These are fills, not new outer geometry, so the ship outline stays recognizable.
    float wingPlateTop = triMask(q, float2(-H * 0.27, -H * 0.12),
                                    float2(-H * 0.36, -H * 0.35),
                                    float2(-H * 0.17, -H * 0.16));
    float wingPlateBottom = triMask(q, float2(-H * 0.27, H * 0.12),
                                       float2(-H * 0.36, H * 0.35),
                                       float2(-H * 0.17, H * 0.16));
    float hullPlateTop = triMask(q, float2(-H * 0.27, -H * 0.085),
                                    float2(H * 0.12, -H * 0.085),
                                    float2(-H * 0.02, -H * 0.025));
    float hullPlateBottom = triMask(q, float2(-H * 0.27, H * 0.085),
                                       float2(H * 0.12, H * 0.085),
                                       float2(-H * 0.02, H * 0.025));
    float nosePlate = triMask(q, float2(H * 0.31, -H * 0.055),
                                 float2(H * 0.72, 0.0),
                                 float2(H * 0.31, H * 0.055));

    float pulse = 0.76 + 0.24 * sin(t * 8.0);

    // V17: a tighter shield ellipse with a dim idle trace and a sharper beat flash.
    // The ring is centered around the armored hull and kept behind the ship artwork.
    float beatLevel = saturate(beat);
    float beatFlash = smoothstep(0.12, 0.62, beatLevel);
    float2 haloQ = q - float2(H * 0.13, 0.0);
    float haloRadius = sqrt(
        (haloQ.x * haloQ.x) / (H * H * 0.66 * 0.66) +
        (haloQ.y * haloQ.y) / (H * H * 0.178 * 0.178)
    );

    // Make the outline read clearly even at MusicBar's very short height.
    // A narrow bright contour is backed by a slightly wider cyan glow.
    float haloDistance = abs(haloRadius - 1.0);
    // Slightly thicker outer aura plus a crisp, brighter inner contour.
    float haloSoft = exp(-haloDistance * 25.0);
    float haloCore = exp(-haloDistance * 235.0);
    float haloIdle = 0.20;
    float haloEnergy = haloIdle + beatFlash * (0.95 + 1.05 * beatLevel);

    // Keep the contour readable between beats and give bass hits a strong cyan-white flash.
    float haloCrest = pow(beatFlash, 1.45);
    rgb += cyan * haloSoft * haloEnergy * 1.12;
    rgb += ice * haloCore * (0.48 + 1.45 * haloCrest);
    alpha += haloSoft * (0.15 + 0.42 * beatFlash)
           + haloCore * (0.10 + 0.34 * haloCrest);


    // Dark layered armor first, with restrained blue-violet plates and crisp neon edges.
    rgb += armor * wings * 1.10;
    rgb += armorBlue * (wingPlateTop + wingPlateBottom) * 0.78;
    rgb += gold * (wingUA + wingUB + wingLA + wingLB) * 0.42;
    rgb += coral * wingEdges * 0.30;
    rgb += armor * hull * 1.28;
    rgb += armorBlue * (hullPlateTop + hullPlateBottom) * 0.72;
    rgb += armorBlue * nosePlate * 0.52;
    rgb += cyan * (shoulderTop + shoulderBottom) * 0.34;
    rgb += cyan * hullEdge * 0.92;
    rgb += gold * wingEdges * 0.42;
    rgb += armor * (podTop + podBottom) * 1.05;
    rgb += cyan * (podTop + podBottom) * pulse * 0.58;
    rgb += ice * cockpit * 1.48;
    rgb += cyan * cockpitRim * 0.72;
    rgb += cyan * (spine + seamTop + seamBottom) * 0.56;
    rgb += cyan * (engineTop + engineBottom) * pulse * 1.30;

    alpha += wings * 0.68 + hull * 0.82
           + (shoulderTop + shoulderBottom) * 0.30
           + (podTop + podBottom) * 0.62
           + hullEdge * 0.50 + wingEdges * 0.36
           + cockpit * 0.62 + cockpitRim * 0.22
           + (spine + seamTop + seamBottom) * 0.22
           + (engineTop + engineBottom) * 0.52;

    // Twin engine plumes: same broad neon wake character retained from V6/V10.
    float plumeTop = exp(-abs(q.y + H * 0.075) / 2.15)
                   * exp(-abs(q.x + H * 0.68) / (H * 0.31));
    float plumeBottom = exp(-abs(q.y - H * 0.075) / 2.15)
                      * exp(-abs(q.x + H * 0.68) / (H * 0.31));
    rgb += cyan * (plumeTop + plumeBottom) * pulse * 1.18;
    rgb += gold * (plumeTop + plumeBottom) * 0.52;
    alpha += (plumeTop + plumeBottom) * 0.52;

    // Engine particles: spread across the full visible wake, not clustered near the ship.
    // Their vertical fan widens gradually with distance and fades softly toward the far end.
    float trailLength = shipX;
    if (trailLength < H)
    {
        trailLength = H;
    }
    if (trailLength > size.x)
    {
        trailLength = size.x;
    }

    // Gallery edit (MusicBar): the same 80 particles, found instead of looped over. They drift back at one
    // shared speed, evenly spaced along the wake with a random nudge each, so a pixel only visits the four
    // nearest. Looping over all 80 on every pixel cost about ten whole skins' worth of GPU work.
    float rawHere = pow(saturate((shipX - p.x - H * 0.28) / trailLength), 2.0 / 3.0);
    float drift = frac(t * 0.064);
    float slot0 = floor((rawHere - drift) * 80.0);

    for (int j = -1; j < 3; j++)
    {
        float slot = slot0 + (float)j;
        float id = slot - 80.0 * floor(slot / 80.0);   // which of the 80 particles, 0 to 79
        float seed = id + 719.0;

        // Slowly drift each particle backward from the twin engine outlets.
        // A mild curve adds extra density close to the engines while retaining a long tail.
        float rawTravel = (slot + hash1(seed)) / 80.0 + drift;
        float inTrail = step(0.0, rawTravel) * step(rawTravel, 1.0);
        rawTravel = saturate(rawTravel);
        float travel = rawTravel * sqrt(rawTravel);
        float backDist = H * 0.28 + travel * trailLength;
        float engineSide = (hash1(seed * 2.3) < 0.5) ? -1.0 : 1.0;

        // Tight near the engines, gently fanned out farther down the wake.
        float spread = H * (0.012 + travel * 0.125);
        float spreadSign = (hash1(seed * 3.1) - 0.5) * 2.0;
        float particleY = shipY + engineSide * H * 0.075
                        + spreadSign * spread;

        float particleX = shipX - backDist;
        float2 pd = p - float2(particleX, particleY);

        // A varied mix of tiny dust and a few brighter energy grains.
        float particleSize = 0.42 + 0.68 * hash1(seed * 4.9);
        float particle = exp(-dot(pd, pd) / (particleSize * particleSize));
        float tail = strokeGlow(pd,
                                float2(-H * 0.045, -spreadSign * H * 0.006),
                                float2(H * 0.030, spreadSign * H * 0.006),
                                0.25) * 0.34;

        float pick = id - 4.0 * floor(id / 4.0);
        float3 particleColor = pick < 0.5 ? cyan : (pick < 1.5 ? ice : (pick < 2.5 ? gold : coral));

        float distanceFade = (1.0 - travel * 0.58) * inTrail;
        float nearEngineBoost = 1.0 + (1.0 - travel) * 0.42;
        float sparkle = 0.68 + 0.32 * sin(t * (3.0 + hash1(seed * 5.7)) + seed);
        rgb += particleColor * (particle * 0.82 + tail * 0.42)
             * distanceFade * nearEngineBoost * sparkle;
        alpha += (particle * 0.38 + tail * 0.15)
               * distanceFade * nearEngineBoost;
    }

    // A few dim background stars remain separate from the engine particle stream.
    for (int s = 0; s < 8; s++)
    {
        float fs = (float)s;
        float seed = fs + 401.0;
        float sx = frac(hash1(seed) - t * 0.035);
        float sy = hash1(seed * 2.7);
        float2 d = p - float2(sx * size.x, sy * size.y);
        float star = exp(-dot(d, d) / 0.75);
        float3 sc = (s % 3 == 0) ? cyan : ((s % 3 == 1) ? gold : coral);
        rgb += sc * star * 0.22;
        alpha += star * 0.07;
    }

    alpha = saturate(alpha * 0.88);
    return paint(rgb / max(alpha, 0.0001), alpha);
}