Shallow Lotus Stream

của Rinz, thanh tiến trình

A blossoming Vietnamese lotus glides eastward through a crystal turquoise stream with sculpted lily pads and tiny minnows darting below.

35 lượt tải Tải file, 13.6 KB
Cách cài, mã SHA-256 và mã nguồn

Bấm Áp dụng: MusicBar tự tải về, kiểm tra mã SHA-256 rồi mặc lên taskbar; có rồi thì mặc luôn. Cần MusicBar 1.8 trở lên.

SHA-256 7825331ae07672fc4e7214cc76a5140cb062de8cf8549956d37f7f6b76250e91

//! name: Shallow Lotus Stream
//! author: Rinz
//! kind: progress
//! description: A blossoming Vietnamese lotus glides eastward through a crystal turquoise stream with sculpted lily pads and tiny minnows darting below.

static const float BODY_SCALE = 1.05;
static const float PAD_SCALE = 1.35;
static const float LOTUS_MULTI_COLOR = 0.35;
static const float USE_APP_LOTUS_COLOR = 1.0;

static const float3 WATER_LIGHT = float3(0.420, 0.925, 0.980);
static const float3 WATER_DEEP  = float3(0.110, 0.560, 0.660);
static const float3 LEAF_LIGHT  = float3(0.608, 0.906, 0.388);
static const float3 LEAF_DEEP   = float3(0.270, 0.580, 0.210);

float hash1(float n)
{
    n = frac(n * 0.1031);
    n *= n + 33.33;
    n *= n + n;
    return frac(n);
}

void layer(inout float3 acc, inout float cover, float3 rgb, float a)
{
    a = saturate(a);
    acc = rgb * a + acc * (1.0 - a);
    cover = a + cover * (1.0 - a);
}

float2 rot(float2 p, float a)
{
    float c = cos(a);
    float s = sin(a);
    return float2(c * p.x + s * p.y, -s * p.x + c * p.y);
}

void lotusTier(float2 q, float count, float rotAng, float tierSeed, float rStart, float len, float width,
               float3 baseCol, float3 tipCol, float shadowAlpha, inout float3 acc, inout float cover)
{
    float2 rq = rot(q, rotAng);
    float stepAng = 6.2831853 / count;
    float ang = atan2(rq.y, rq.x);
    float sector = floor(ang / stepAng + 0.5);
    float sectorId = fmod(sector + count * 4.0, count);

    float h = hash1(sectorId * 3.7 + tierSeed * 5.3);
    float localAng = ang - sector * stepAng + (h - 0.5) * 0.03;
    float d = length(rq);
    float2 pq = float2(d * cos(localAng) - rStart, d * sin(localAng));

    float localLen = len * (0.97 + 0.06 * h);
    float t = pq.x / max(localLen, 0.001);
    float tt = saturate(t);

    float hw = width * pow(max(sin(tt * 3.14159265), 0.0), 0.68) * (1.0 - 0.14 * tt);
    float petalD = max(abs(pq.y) - hw, max(-pq.x, pq.x - localLen));

    float shD = max(abs(pq.y - width * 0.08) - hw * 1.05, max(-pq.x, pq.x - localLen * 1.03));
    float shMask = smoothstep(0.9, -0.5, shD);
    layer(acc, cover, baseCol * float3(0.28, 0.16, 0.22), shMask * shadowAlpha);

    float body = smoothstep(0.6, -0.6, petalD);
    float across = pq.y / max(hw, 0.001);
    float dome = sqrt(saturate(1.0 - across * across));
    float3 rootCream = lerp(float3(1.0, 0.97, 0.93), baseCol, 0.35);
    float3 col = lerp(rootCream, baseCol, smoothstep(0.05, 0.48, tt));
    col = lerp(col, tipCol, smoothstep(0.45, 1.0, tt));
    col *= 0.64 + 0.40 * dome;

    float ridge = exp(-abs(across) * 8.5) * sin(tt * 3.14159265);
    col += float3(0.13, 0.11, 0.10) * ridge;

    float rim = smoothstep(1.1, 0.0, abs(petalD + 0.35));
    col = lerp(col, float3(1.0, 0.98, 0.94), rim * 0.30);

    layer(acc, cover, col, body);
}

void drawFish(float2 px, float2 nose, float swimAng, float u, float fScale, float phase,
              float edge, inout float3 acc, inout float cover)
{
    float fL = u * 0.44 * fScale;
    float2 q = rot(px - nose, swimAng);
    float s = -q.x / fL;

    if (s > -0.35 && s < 1.55)
    {
        float swim = time * (5.8 + 0.6 / fScale) + phase;
        float bend = fL * (0.025 + 0.14 * saturate(s) * saturate(s));
        float spine = bend * sin(s * 4.3 - swim);
        float t = saturate(s);
        float hw = fL * 0.19 * sqrt(t) * pow(saturate(1.0 - t * 0.82), 1.2) / 0.58;
        float bodyD = abs(q.y - spine) - hw;
        bodyD = s < 0.0 ? length(float2(q.x, q.y - spine)) : bodyD;
        bodyD = s > 1.0 ? length(float2(q.x + fL, q.y - spine)) - hw : bodyD;

        float shD = abs(q.y + u * 0.045 - spine) - hw;
        layer(acc, cover, float3(0.0, 0.08, 0.10), smoothstep(u * 0.04, -u * 0.02, shD) * step(-0.05, s) * step(s, 1.1) * 0.26 * edge);

        float tAng = cos(4.3 - swim) * 0.36;
        float2 tq = rot(q - float2(-fL * 0.96, bend * sin(4.3 - swim)), -tAng);
        float fan = -tq.x;
        float tailD = max(length(float2(fan - fL * 0.14, abs(tq.y) * 1.4)) - fL * 0.14, -fan);
        layer(acc, cover, float3(1.0, 0.88, 0.78), smoothstep(0.6, -0.6, tailD) * 0.65 * edge);

        float2 fq = q - float2(-fL * 0.32, spine);
        float2 f1 = rot(float2(fq.x, abs(fq.y)), 2.1 + 0.22 * sin(swim * 0.7));
        float finD = length(float2(f1.x - fL * 0.11, f1.y * 2.2)) - fL * 0.095;
        layer(acc, cover, float3(1.0, 0.90, 0.82), smoothstep(0.6, -0.6, finD) * 0.52 * edge);

        float body = smoothstep(0.6, -0.6, bodyD);
        float3 fishCol = lerp(float3(1.0, 0.35, 0.14), float3(1.0, 0.76, 0.28), smoothstep(0.2, 0.85, t));
        float dorsal = smoothstep(hw, 0.0, abs(q.y - spine));
        fishCol = lerp(fishCol * 0.78, fishCol + float3(0.16, 0.14, 0.08), dorsal);
        layer(acc, cover, fishCol, body * 0.90 * edge);

        float eye = smoothstep(fL * 0.045, fL * 0.018, length(float2(q.x + fL * 0.12, abs(q.y - spine) - hw * 0.58)));
        layer(acc, cover, float3(0.06, 0.06, 0.08), eye * body * edge);
    }
}

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float2 px = float2(uv.x * size.x, rise(uv) * size.y);
    float u = max(size.y, 1.0);
    float w = max(size.x, 1.0);
    float live = saturate(playing);
    float vol = saturate(level) * live;
    float flick = saturate(beat) * live;

    float head = saturate(progress) * w;
    float margin = min(u * 0.62 * BODY_SCALE, w * 0.45);
    float flowerX = clamp(head, margin, w - margin);
    float2 center = float2(flowerX, u * (0.5 + 0.05 * sin(time * 0.85) + 0.025 * vol * sin(time * 4.5)));

    float3 defaultPink = float3(1.0, 0.46, 0.68);
    float3 petalA = lerp(defaultPink, saturate(colorA.rgb), USE_APP_LOTUS_COLOR);
    float3 petalC = lerp(float3(1.0, 0.82, 0.90), saturate(colorC.rgb), USE_APP_LOTUS_COLOR);
    float3 tipTone = lerp(petalA, petalC, LOTUS_MULTI_COLOR);
    float3 heartGold = float3(1.0, 0.82, 0.28);

    float3 acc = float3(0, 0, 0);
    float cover = 0.0;

    float played = smoothstep(head + u * 0.25, head - u * 0.65, px.x);
    float2 wp = float2(px.x / u - time * 0.20, px.y / u);
    float cau = abs(sin(wp.x * 2.6 + sin(wp.y * 3.0 - time * 0.65) * 1.4 - time * 0.35)
                  + sin(wp.y * 3.5 - sin(wp.x * 2.2 - time * 0.55) * 1.3));
    cau = pow(saturate(1.0 - cau * 0.58), 4.0) * (0.55 + 0.65 * vol);

    float edge = smoothstep(0.0, u * 0.12, px.y) * smoothstep(u, u * 0.88, px.y);
    float bankGrad = smoothstep(0.0, u * 0.5, min(px.y, u - px.y));
    float3 water = lerp(WATER_DEEP, WATER_LIGHT, 0.35 + 0.65 * bankGrad);

    layer(acc, cover, water, edge * lerp(0.16, 0.78, played));
    layer(acc, cover, float3(0.82, 0.99, 1.0), cau * edge * lerp(0.08, 0.34, played));

    float rc = floor(px.x / (u * 1.35));
    float rh = hash1(rc * 4.3 + 1.0);
    float2 rcen = float2((rc + 0.5) * u * 1.35, u * (0.28 + 0.44 * hash1(rc * 2.1)));
    float rph = frac(time * 0.32 + rh);
    float rd = length(px - rcen) - rph * u * 0.92;
    float rings = smoothstep(1.4, 0.0, abs(rd)) + 0.5 * smoothstep(1.2, 0.0, abs(rd + u * 0.13));
    layer(acc, cover, float3(0.85, 1.0, 1.0), rings * (1.0 - rph) * step(rcen.x, flowerX - u * 0.6) * 0.38 * edge);

    float spanW = w + u * 2.0;
    [unroll] for (int fi = 0; fi < 4; fi++)
    {
        float fIdx = (float)fi;
        float dir = (fi == 1 || fi == 3) ? -1.0 : 1.0;
        float fScale = 0.58 + 0.17 * fIdx;
        float speed = u * (0.20 + 0.045 * fIdx);

        float travel = time * speed * dir + fIdx * spanW * 0.27;
        float fx = frac(travel / spanW) * spanW - u * 1.0;
        float vx = speed * dir;

        float laneY = u * (0.20 + 0.20 * fIdx);
        float wFreq = 0.55 + 0.14 * fIdx;
        float wAmp = u * (0.09 + 0.025 * (fi % 2));
        float wPhase = time * wFreq + fIdx * 2.1;
        float fy = laneY + wAmp * sin(wPhase);
        float vy = wAmp * wFreq * cos(wPhase);

        float swimAng = atan2(vy, vx);
        drawFish(px, float2(fx, fy), swimAng, u, fScale, fIdx * 1.9, edge, acc, cover);
    }

    float pc = floor(px.x / (u * 2.15));
    float ph = hash1(pc * 5.7 + 3.0);
    float padPulse = 1.0 + (0.03 * vol + 0.045 * flick) * sin(time * 5.0 + pc * 2.3);
    float pr = u * (0.25 + 0.14 * hash1(pc * 1.3)) * PAD_SCALE * padPulse;
    float bankSide = step(0.5, ph);
    float2 pcen = float2(
        (pc + 0.24 + 0.52 * hash1(pc * 8.1)) * u * 2.15,
        lerp(u * 0.08, u * 0.92, bankSide) + sin(time * 0.65 + ph * 9.0) * u * (0.022 + 0.015 * vol)
    );
    float2 pq = rot(px - pcen, ph * 6.283 + (0.14 + 0.06 * vol) * sin(time * 0.5 + ph * 7.0));
    float pl = length(pq);
    float pang = atan2(pq.y, pq.x);

    float wavyR = pr * (1.0 + 0.024 * sin(pang * 7.0 + ph * 4.0) + 0.014 * cos(pang * 13.0));
    float notch = -pl * sin(min(abs(pang) - 0.26, 1.5));
    float pd = max(pl - wavyR, notch);
    float hasPad = step(0.20, ph);
    float pad = smoothstep(0.65, -0.65, pd) * hasPad;

    float padShadow = smoothstep(u * 0.06, -u * 0.02, length(pq + float2(u * 0.035, u * 0.055)) - wavyR);
    layer(acc, cover, float3(0.01, 0.12, 0.15), padShadow * 0.38 * hasPad);

    float padRingD = abs(pl - wavyR - u * (0.04 + 0.18 * (1.0 - flick)));
    float padRipple = smoothstep(1.2, 0.0, padRingD) * (0.18 + 0.42 * flick) * hasPad * edge;
    layer(acc, cover, float3(0.84, 1.0, 1.0), padRipple);

    float normR = saturate(pl / max(wavyR, 0.001));
    float mainVein = smoothstep(0.95, 0.0, abs(frac(pang / 6.2831853 * 13.0) - 0.5) * pl * 0.65)
                   * smoothstep(0.08, 0.28, normR) * (1.0 - 0.35 * normR);
    float subVein = smoothstep(0.9, 0.0, abs(frac(pang / 6.2831853 * 26.0 + normR * 0.18) - 0.5) * pl * 0.85)
                  * smoothstep(0.45, 0.82, normR) * 0.45;
    float bowl = pow(1.0 - normR, 1.8);

    float3 padCol = lerp(LEAF_DEEP, LEAF_LIGHT, saturate(0.35 + 0.45 * normR + 0.25 * (pq.y / max(wavyR, 0.001))));
    padCol *= 1.0 - bowl * 0.22;
    padCol = lerp(padCol, float3(0.84, 0.97, 0.65), (mainVein * 0.42 + subVein * 0.22));
    layer(acc, cover, padCol, pad);

    layer(acc, cover, float3(0.78, 0.97, 0.55), smoothstep(1.3, 0.0, abs(pd + 0.7)) * pad * 0.55);
    float navel = smoothstep(u * 0.032, u * 0.010, pl) * pad;
    layer(acc, cover, float3(0.88, 0.95, 0.58), navel * 0.85);

    float2 dropPos = float2(wavyR * 0.38, wavyR * 0.18);
    float dropD = length(pq - dropPos) - u * 0.026;
    float dropMask = smoothstep(0.5, -0.5, dropD) * pad * step(0.55, ph);
    layer(acc, cover, float3(0.08, 0.25, 0.12), smoothstep(0.6, -0.4, length(pq - dropPos + float2(1.0, 1.2)) - u * 0.026) * pad * 0.35 * step(0.55, ph));
    layer(acc, cover, float3(0.92, 1.0, 0.96), dropMask * 0.85);

    float budR = pr * 0.34 * (0.65 + 0.35 * abs(cos(pang * 3.0 + time * 0.35)));
    float bud = smoothstep(0.6, -0.6, pl - budR) * step(0.76, ph);
    layer(acc, cover, lerp(petalA, float3(1.0, 0.98, 0.96), 0.42 - 0.35 * saturate(pl / max(budR, 0.001))), bud);
    layer(acc, cover, heartGold, smoothstep(pr * 0.10, pr * 0.04, pl) * step(0.76, ph));

    float2 q = px - center;
    float R = u * 0.47 * BODY_SCALE * (1.0 + 0.05 * vol + 0.07 * flick);

    float br = length(q) - (1.0 - flick) * u * 0.95;
    layer(acc, cover, float3(0.88, 1.0, 1.0), smoothstep(1.6, 0.0, abs(br)) * flick * edge * 0.85);

    float wakeX = -q.x / u;
    float wakeGate = smoothstep(0.15, 0.45, wakeX) * (1.0 - smoothstep(0.7, 1.8, wakeX));
    float wakeY = u * (0.06 + wakeX * 0.18) + u * 0.012 * sin(wakeX * 12.0 - time * 3.0);
    float wakeWave = smoothstep(1.3, 0.0, abs(abs(q.y) - wakeY));
    layer(acc, cover, float3(0.82, 1.0, 1.0), wakeWave * wakeGate * live * 0.35 * edge);

    // Gallery edit (MusicBar): the flower is drawn only near the flower. Every pixel of the bar used to work
    // through all four petal tiers, the stamens and the pod: about three skins' worth of GPU time per frame.
    [branch] if (length(q) < R * 1.5)
    {
        float2 shQ = q + float2(u * 0.04, u * 0.07);
        layer(acc, cover, float3(0.0, 0.06, 0.08), smoothstep(R * 1.05, R * 0.25, length(shQ)) * 0.42);

        float baseRot = time * 0.14 + 0.05 * sin(time * 1.3);
        float bloomPulse = 0.04 * vol + 0.05 * flick;

        lotusTier(q, 6.0, baseRot - bloomPulse, 1.0, R * 0.07, R * 0.93, R * 0.33, petalA * 0.88, tipTone, 0.22, acc, cover);
        lotusTier(q, 6.0, baseRot + 0.5236 + bloomPulse, 2.0, R * 0.06, R * 0.81, R * 0.30, petalA, tipTone, 0.30, acc, cover);
        lotusTier(q, 5.0, baseRot + 0.25 - bloomPulse * 0.7, 3.0, R * 0.05, R * 0.63, R * 0.25, lerp(petalA, float3(1, 0.95, 0.97), 0.18), tipTone, 0.28, acc, cover);
        lotusTier(q, 5.0, -baseRot * 0.6 + 0.60, 4.0, R * 0.03, R * 0.43, R * 0.19, lerp(petalA, float3(1, 0.97, 0.95), 0.35), float3(1, 0.96, 0.94), 0.25, acc, cover);

        float distC = length(q);
        float angC = atan2(q.y, q.x) - baseRot * 0.5;
        float stamenRays = pow(saturate(0.5 + 0.5 * cos(angC * 26.0)), 6.0);
        float stamenRing = smoothstep(R * 0.31, R * 0.22, distC) * smoothstep(R * 0.12, R * 0.18, distC);
        float antherDots = smoothstep(R * 0.035, R * 0.012, abs(distC - R * 0.25)) * stamenRays;
        layer(acc, cover, float3(0.95, 0.70, 0.18), stamenRing * (0.45 + 0.55 * stamenRays));
        layer(acc, cover, float3(1.0, 0.93, 0.55), antherDots * (0.85 + 0.15 * flick));

        float podR = R * 0.16;
        float podMask = smoothstep(0.6, -0.6, distC - podR);
        float3 podCol = lerp(float3(0.72, 0.78, 0.22), heartGold, smoothstep(podR, 0.0, distC));
        float seedDots = smoothstep(0.45, 0.75, sin(q.x / max(R, 0.001) * 55.0) * sin(q.y / max(R, 0.001) * 55.0));
        podCol = lerp(podCol, float3(0.48, 0.55, 0.15), seedDots * 0.35);
        layer(acc, cover, podCol, podMask);

        float heartGlow = exp(-distC / max(R * 0.18, 0.5));
        layer(acc, cover, heartGold, heartGlow * (0.12 + 0.18 * flick));
    }

    return paint(acc / max(cover, 0.001), saturate(cover));
}