mirror of
https://github.com/mr0xb/dotfiles_chezmoi.git
synced 2026-08-28 03:44:57 -04:00
267 lines
10 KiB
GLSL
267 lines
10 KiB
GLSL
#define PI 3.141592653589793
|
|
|
|
float smin(float a, float b, float k) {
|
|
float h = max(k - abs(a - b), 0.0) / k;
|
|
return min(a, b) - h * h * h * k * (1.0 / 6.0);
|
|
}
|
|
|
|
float rectSDF(vec2 p, vec2 b) {
|
|
vec2 d = abs(p) - b;
|
|
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
|
|
}
|
|
|
|
float fill(float d, float aa) {
|
|
return 1.0 - smoothstep(0.0, aa, d);
|
|
}
|
|
|
|
float stroke(float d, float w, float aa) {
|
|
return 1.0 - smoothstep(0.0, aa, abs(d) - w);
|
|
}
|
|
|
|
float box01(vec2 uv, vec2 c, vec2 s, float aa) {
|
|
return fill(rectSDF(uv - c, s), aa);
|
|
}
|
|
|
|
float frame01(vec2 uv, vec2 c, vec2 s, float w, float aa) {
|
|
return stroke(rectSDF(uv - c, s), w, aa);
|
|
}
|
|
|
|
float in01(vec2 uv) {
|
|
return step(0.0, uv.x) * step(0.0, uv.y) * step(uv.x, 1.0) * step(uv.y, 1.0);
|
|
}
|
|
|
|
// ------------------------------------------------------------------
|
|
// Very simple block-letter glyphs in a 0..1 local cell.
|
|
// Not perfect typography, but close enough to read.
|
|
// ------------------------------------------------------------------
|
|
|
|
float glyphC(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.52, 0.84), vec2(0.30, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.52, 0.16), vec2(0.30, 0.08), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphA(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.78, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.30, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.30, 0.08), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphS(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.30, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.30, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.16), vec2(0.30, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.22, 0.67), vec2(0.10, 0.17), aa));
|
|
m = max(m, box01(uv, vec2(0.78, 0.33), vec2(0.10, 0.17), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphH(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.78, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.30, 0.08), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphM(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.16, 0.50), vec2(0.09, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.84, 0.50), vec2(0.09, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.38, 0.65), vec2(0.08, 0.27), aa));
|
|
m = max(m, box01(uv, vec2(0.62, 0.65), vec2(0.08, 0.27), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.25, 0.08), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphO(vec2 uv, float aa) {
|
|
float outer = box01(uv, vec2(0.50, 0.50), vec2(0.34, 0.42), aa);
|
|
float inner = box01(uv, vec2(0.50, 0.50), vec2(0.18, 0.24), aa);
|
|
return max(0.0, outer - inner) * in01(uv);
|
|
}
|
|
|
|
float glyphN(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.20, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.80, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.08, 0.42), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphE(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.52, 0.84), vec2(0.30, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.48, 0.50), vec2(0.26, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.52, 0.16), vec2(0.30, 0.08), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphY(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.22, 0.72), vec2(0.10, 0.20), aa));
|
|
m = max(m, box01(uv, vec2(0.78, 0.72), vec2(0.10, 0.20), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.10, 0.12), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.20), vec2(0.10, 0.20), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphR(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.28, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.72, 0.68), vec2(0.10, 0.16), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.26, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.68, 0.24), vec2(0.10, 0.20), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float glyphD(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.26, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.16), vec2(0.26, 0.08), aa));
|
|
m = max(m, box01(uv, vec2(0.74, 0.50), vec2(0.10, 0.34), aa));
|
|
return m * in01(uv);
|
|
}
|
|
|
|
float drawGlyph(int g, vec2 uv, float aa) {
|
|
if (g == 0) return glyphC(uv, aa);
|
|
if (g == 1) return glyphA(uv, aa);
|
|
if (g == 2) return glyphS(uv, aa);
|
|
if (g == 3) return glyphH(uv, aa);
|
|
if (g == 4) return glyphM(uv, aa);
|
|
if (g == 5) return glyphO(uv, aa);
|
|
if (g == 6) return glyphN(uv, aa);
|
|
if (g == 7) return glyphE(uv, aa);
|
|
if (g == 8) return glyphY(uv, aa);
|
|
if (g == 9) return glyphR(uv, aa);
|
|
if (g == 10) return glyphD(uv, aa);
|
|
return 0.0;
|
|
}
|
|
|
|
float placeGlyph(vec2 q, vec4 box, int glyphId, float aa) {
|
|
vec2 uv = (q - box.xy) / (box.zw - box.xy);
|
|
return drawGlyph(glyphId, uv, aa);
|
|
}
|
|
|
|
float dollarMark(vec2 uv, float aa) {
|
|
float m = 0.0;
|
|
|
|
// vertical bar
|
|
m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.05, 0.42), aa));
|
|
|
|
// top/bottom heavy bars to make a chunky $
|
|
m = max(m, box01(uv, vec2(0.50, 0.82), vec2(0.22, 0.10), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.22, 0.10), aa));
|
|
m = max(m, box01(uv, vec2(0.50, 0.18), vec2(0.22, 0.10), aa));
|
|
|
|
// left upper / right lower chunks
|
|
m = max(m, box01(uv, vec2(0.30, 0.66), vec2(0.10, 0.18), aa));
|
|
m = max(m, box01(uv, vec2(0.70, 0.34), vec2(0.10, 0.18), aa));
|
|
|
|
return m * in01(uv);
|
|
}
|
|
|
|
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
vec2 uv = fragCoord.xy / iResolution.xy;
|
|
vec4 base = texture(iChannel0, uv);
|
|
vec3 col = base.rgb;
|
|
|
|
float aa = 1.6 / iResolution.y;
|
|
|
|
// ----------------------------------------------------------
|
|
// Bouncing rectangular badge, DVD-logo style
|
|
// ----------------------------------------------------------
|
|
vec2 badgeSize = vec2(0.18, 0.44);
|
|
vec2 minP = badgeSize * 0.5 + vec2(0.02, 0.03);
|
|
vec2 maxP = vec2(1.0) - minP;
|
|
|
|
vec2 travel = maxP - minP;
|
|
vec2 phase = fract(vec2(iTime * 0.060, iTime * 0.047) + vec2(0.21, 0.58));
|
|
vec2 tri = abs(phase * 2.0 - 1.0);
|
|
vec2 center = minP + travel * tri;
|
|
|
|
vec2 p = uv - center;
|
|
p.x *= iResolution.x / iResolution.y;
|
|
|
|
vec2 halfSize = vec2(badgeSize.x * 0.5 * iResolution.x / iResolution.y, badgeSize.y * 0.5);
|
|
|
|
// q = normalized coordinates inside the badge
|
|
vec2 q = p / halfSize;
|
|
q = q * 0.5 + 0.5;
|
|
|
|
float outer = fill(rectSDF(p, halfSize), aa);
|
|
float border = frame01(p, vec2(0.0), halfSize, 0.006, aa);
|
|
|
|
// shadow
|
|
float shadow = fill(rectSDF(p - vec2(0.010, -0.012), halfSize), aa) * 0.18;
|
|
col = mix(col, col * 0.80, shadow);
|
|
|
|
// white sticker body
|
|
vec3 logoCol = vec3(0.0);
|
|
logoCol += outer * vec3(0.96);
|
|
logoCol = mix(logoCol, vec3(0.04), border);
|
|
|
|
// top word: CASH MONEY
|
|
float top = 0.0;
|
|
float y0 = 0.78;
|
|
float y1 = 0.96;
|
|
float w = 0.075;
|
|
float gap = 0.010;
|
|
|
|
top = max(top, placeGlyph(q, vec4(0.04, y0, 0.04 + w, y1), 0, aa)); // C
|
|
top = max(top, placeGlyph(q, vec4(0.04 + 1.0*(w+gap), y0, 0.04 + 1.0*(w+gap) + w, y1), 1, aa)); // A
|
|
top = max(top, placeGlyph(q, vec4(0.04 + 2.0*(w+gap), y0, 0.04 + 2.0*(w+gap) + w, y1), 2, aa)); // S
|
|
top = max(top, placeGlyph(q, vec4(0.04 + 3.0*(w+gap), y0, 0.04 + 3.0*(w+gap) + w, y1), 3, aa)); // H
|
|
|
|
float start2 = 0.40;
|
|
top = max(top, placeGlyph(q, vec4(start2 + 0.0*(w+gap), y0, start2 + 0.0*(w+gap) + w, y1), 4, aa)); // M
|
|
top = max(top, placeGlyph(q, vec4(start2 + 1.0*(w+gap), y0, start2 + 1.0*(w+gap) + w, y1), 5, aa)); // O
|
|
top = max(top, placeGlyph(q, vec4(start2 + 2.0*(w+gap), y0, start2 + 2.0*(w+gap) + w, y1), 6, aa)); // N
|
|
top = max(top, placeGlyph(q, vec4(start2 + 3.0*(w+gap), y0, start2 + 3.0*(w+gap) + w, y1), 7, aa)); // E
|
|
top = max(top, placeGlyph(q, vec4(start2 + 4.0*(w+gap), y0, start2 + 4.0*(w+gap) + w, y1), 8, aa)); // Y
|
|
|
|
// bottom word: RECORDS
|
|
float bottom = 0.0;
|
|
float by0 = 0.03;
|
|
float by1 = 0.19;
|
|
float bw = 0.095;
|
|
float bg = 0.012;
|
|
float bstart = 0.10;
|
|
|
|
bottom = max(bottom, placeGlyph(q, vec4(bstart + 0.0*(bw+bg), by0, bstart + 0.0*(bw+bg) + bw, by1), 9, aa)); // R
|
|
bottom = max(bottom, placeGlyph(q, vec4(bstart + 1.0*(bw+bg), by0, bstart + 1.0*(bw+bg) + bw, by1), 7, aa)); // E
|
|
bottom = max(bottom, placeGlyph(q, vec4(bstart + 2.0*(bw+bg), by0, bstart + 2.0*(bw+bg) + bw, by1), 0, aa)); // C
|
|
bottom = max(bottom, placeGlyph(q, vec4(bstart + 3.0*(bw+bg), by0, bstart + 3.0*(bw+bg) + bw, by1), 5, aa)); // O
|
|
bottom = max(bottom, placeGlyph(q, vec4(bstart + 4.0*(bw+bg), by0, bstart + 4.0*(bw+bg) + bw, by1), 9, aa)); // R
|
|
bottom = max(bottom, placeGlyph(q, vec4(bstart + 5.0*(bw+bg), by0, bstart + 5.0*(bw+bg) + bw, by1), 10, aa)); // D
|
|
bottom = max(bottom, placeGlyph(q, vec4(bstart + 6.0*(bw+bg), by0, bstart + 6.0*(bw+bg) + bw, by1), 2, aa)); // S
|
|
|
|
// central $
|
|
vec2 suv = (q - vec2(0.18, 0.23)) / vec2(0.64, 0.50);
|
|
float dollar = dollarMark(suv, aa);
|
|
|
|
// black print
|
|
float printMask = max(max(top, bottom), dollar);
|
|
logoCol = mix(logoCol, vec3(0.03), printMask);
|
|
|
|
// small gold glint so it still fits the bling theme
|
|
float glint = pow(max(0.0, sin((uv.x * 4.0 + uv.y * 2.0) * PI * 2.0 - iTime * 1.4)), 18.0);
|
|
logoCol += outer * glint * vec3(1.0, 0.84, 0.35) * 0.12;
|
|
|
|
// subtle sticker highlight
|
|
float shine = 1.0 - smoothstep(0.0, 0.25, abs(q.x - 0.25) + abs(q.y - 0.78));
|
|
logoCol += outer * shine * vec3(1.0) * 0.08;
|
|
|
|
// composite behind text
|
|
col = mix(col, col + logoCol, outer * 0.22);
|
|
|
|
fragColor = vec4(clamp(col, 0.0, 1.0), base.a);
|
|
}
|