dotfiles_chezmoi/dot_config/ghostty/shaders/custom/cash_money_dvd.glsl
2026-07-13 15:12:44 -04:00

142 lines
4.8 KiB
GLSL

#define PI 3.141592653589793
float sdEllipse(vec2 p, vec2 r) {
vec2 q = p / r;
return (length(q) - 1.0) * min(r.x, r.y);
}
float sdCircle(vec2 p, float r) {
return length(p) - r;
}
float sdBox(vec2 p, vec2 b) {
vec2 d = abs(p) - b;
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
}
float opStroke(float d, float w) {
return abs(d) - w;
}
float fill(float d) {
return 1.0 - smoothstep(0.0, 0.004, d);
}
float stroke(float d, float w) {
return 1.0 - smoothstep(0.0, 0.004, opStroke(d, w));
}
// Simple dollar sign SDF-ish shape
float dollarSign(vec2 p) {
float s = 0.0;
// main vertical bar
float bar = fill(sdBox(p, vec2(0.018, 0.18)));
// upper curve
vec2 pu = p - vec2(0.02, 0.07);
float upperOuter = stroke(sdCircle(pu, 0.11), 0.020);
float upperCut = fill(sdBox(pu - vec2(-0.07, 0.00), vec2(0.08, 0.14)));
float upper = upperOuter * (1.0 - upperCut);
// lower curve
vec2 pl = p - vec2(-0.02, -0.07);
float lowerOuter = stroke(sdCircle(pl, 0.11), 0.020);
float lowerCut = fill(sdBox(pl - vec2(0.07, 0.00), vec2(0.08, 0.14)));
float lower = lowerOuter * (1.0 - lowerCut);
s = max(bar, max(upper, lower));
return s;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = fragCoord.xy / iResolution.xy;
vec4 base = texture(iChannel0, uv);
vec3 col = base.rgb;
// ------------------------------------------------------------------
// Bouncing "DVD logo" style motion
// ------------------------------------------------------------------
vec2 logoSize = vec2(0.23, 0.13); // width/height of medallion in UV space
vec2 minP = logoSize * 0.5 + vec2(0.03, 0.04);
vec2 maxP = vec2(1.0) - minP;
// Ping-pong motion
vec2 travel = maxP - minP;
vec2 phase = fract(vec2(iTime * 0.070, iTime * 0.052) + vec2(0.17, 0.61));
vec2 tri = abs(phase * 2.0 - 1.0);
vec2 center = minP + travel * tri;
// Local coordinates around logo center
vec2 p = uv - center;
p.x *= iResolution.x / iResolution.y; // aspect correction
// ------------------------------------------------------------------
// Cash Money inspired medallion
// ------------------------------------------------------------------
float outer = sdEllipse(p, vec2(0.17, 0.095));
float inner = sdEllipse(p, vec2(0.145, 0.078));
float core = sdEllipse(p, vec2(0.122, 0.060));
float outerFill = fill(outer);
float innerRing = stroke(inner, 0.010);
float coreFill = fill(core);
// Rim beading / jewelry vibe
float angle = atan(p.y, p.x);
float beads = pow(0.5 + 0.5 * sin(angle * 26.0 - iTime * 2.2), 8.0);
beads *= stroke(sdEllipse(p, vec2(0.158, 0.086)), 0.008);
// Chrome/gold light sweep
float sweep = pow(max(0.0, sin((uv.x * 4.0 + uv.y * 2.6) * PI * 2.0 - iTime * 1.7)), 18.0);
vec3 darkGold = vec3(0.28, 0.12, 0.02);
vec3 gold = vec3(0.95, 0.67, 0.16);
vec3 paleGold = vec3(1.00, 0.88, 0.52);
vec3 diamond = vec3(1.00, 0.96, 0.85);
vec3 logoCol = vec3(0.0);
// outer medallion
logoCol += outerFill * mix(darkGold, gold, 0.65);
logoCol += innerRing * paleGold * 0.9;
logoCol += beads * paleGold * 0.8;
logoCol += coreFill * mix(gold, paleGold, 0.35);
// embossed center
float emboss = 0.5 + 0.5 * sin(p.x * 28.0 + p.y * 12.0 - iTime * 0.6);
logoCol += coreFill * emboss * vec3(0.10, 0.05, 0.01);
// dollar sign centerpiece
float ds = dollarSign(p * 1.7);
logoCol = mix(logoCol, diamond, ds * 0.9);
logoCol += ds * paleGold * 0.35;
// little sparkle hits
float sparkle1 = exp(-length((p - vec2(-0.07, 0.03)) * vec2(1.0, 1.2)) * 60.0);
float sparkle2 = exp(-length((p - vec2(0.08, -0.01)) * vec2(1.0, 1.2)) * 80.0);
float cross1 = (1.0 - smoothstep(0.0, 0.004, abs(p.x + 0.07))) * (1.0 - smoothstep(0.0, 0.05, abs(p.y - 0.03)));
cross1 += (1.0 - smoothstep(0.0, 0.004, abs(p.y - 0.03))) * (1.0 - smoothstep(0.0, 0.05, abs(p.x + 0.07)));
float cross2 = (1.0 - smoothstep(0.0, 0.003, abs(p.x - 0.08))) * (1.0 - smoothstep(0.0, 0.04, abs(p.y + 0.01)));
cross2 += (1.0 - smoothstep(0.0, 0.003, abs(p.y + 0.01))) * (1.0 - smoothstep(0.0, 0.04, abs(p.x - 0.08)));
float twinkle = 0.65 + 0.35 * sin(iTime * 5.0);
logoCol += (sparkle1 * cross1 + sparkle2 * cross2) * paleGold * twinkle * 0.9;
// moving light sweep across logo
logoCol += outerFill * sweep * vec3(1.0, 0.92, 0.60) * 0.45;
// subtle shadow behind logo
float shadow = fill(sdEllipse(p - vec2(0.010, -0.010), vec2(0.17, 0.095)));
shadow *= 0.18;
// Logo mask
float logoMask = outerFill;
// Keep it in background so text stays readable
// Darken behind medallion slightly, then add logo
col = mix(col, col * 0.82, shadow);
col = mix(col, col + logoCol, logoMask * 0.32);
fragColor = vec4(clamp(col, 0.0, 1.0), base.a);
}