mirror of
https://github.com/mr0xb/dotfiles_chezmoi.git
synced 2026-08-28 03:44:57 -04:00
142 lines
4.8 KiB
GLSL
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);
|
|
}
|