Skip to main content

ishou_render/
glsl.rs

1//! GLSL renderer — emits a `#define` / `const` header consumable by the 13
2//! blackmatter-ghostty shaders. Drop-in replacement for their hand-written
3//! `nord-common.glsl`.
4
5use ishou_tokens::TokenSet;
6
7pub fn render(t: &TokenSet) -> String {
8    let mut out = String::from("// ishou — pleme-io design tokens (GLSL, generated)\n\n");
9    for (k, v) in t.color.entries() {
10        out.push_str(&format!(
11            "#define ISHOU_{} vec3({:.4}, {:.4}, {:.4})\n",
12            k.to_uppercase(),
13            f32::from(v.r) / 255.0,
14            f32::from(v.g) / 255.0,
15            f32::from(v.b) / 255.0,
16        ));
17    }
18    // shader uniform defaults — renderers / hosts can override per-shader.
19    let sh = &t.shader;
20    out.push_str("\n// Default shader uniforms\n");
21    out.push_str(&format!(
22        "#define ISHOU_BLOOM_THRESHOLD {:.3}\n",
23        sh.bloom.threshold
24    ));
25    out.push_str(&format!(
26        "#define ISHOU_BLOOM_INTENSITY {:.3}\n",
27        sh.bloom.intensity
28    ));
29    out.push_str(&format!(
30        "#define ISHOU_CA_MAGNITUDE {:.4}\n",
31        sh.chromatic_aberration.magnitude
32    ));
33    out.push_str(&format!(
34        "#define ISHOU_CURSOR_GLOW_RADIUS {:.2}\n",
35        sh.cursor_glow.radius_px
36    ));
37    out.push_str(&format!(
38        "#define ISHOU_FILM_GRAIN {:.4}\n",
39        sh.film_grain.intensity
40    ));
41    out.push_str(&format!(
42        "#define ISHOU_FROST_HAZE {:.3}\n",
43        sh.frost_haze.intensity
44    ));
45    out.push_str(&format!(
46        "#define ISHOU_SCREEN_CURV {:.4}\n",
47        sh.screen_curvature.curvature
48    ));
49    out.push_str(&format!(
50        "#define ISHOU_SCREEN_VIGN {:.3}\n",
51        sh.screen_curvature.vignette
52    ));
53    out.push_str(&format!(
54        "#define ISHOU_SONIC_INTENSITY {:.3}\n",
55        sh.sonic_boom.intensity
56    ));
57    out.push_str(&format!(
58        "#define ISHOU_SPOT_RADIUS {:.1}\n",
59        sh.spotlight.radius_px
60    ));
61    out.push_str(&format!(
62        "#define ISHOU_STARDUST_COUNT {}\n",
63        sh.stardust.particle_count
64    ));
65    out
66}