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
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);
}