Constant AGEING
Source pub const AGEING: &str = "fn fade_colour(base: vec3f, amount: f32, position: vec3f, seed: u32) -> vec3f {\n if (amount <= 0.0) {\n return base;\n }\n let y = dot(base, vec3f(0.2126, 0.7152, 0.0722));\n let n = value_noise3(position * 3.0 + vec3f(f32(seed) * 0.17, 0.0, 0.0), false);\n let t = clamp(amount * (0.65 + 0.35 * n), 0.0, 1.0);\n return mix(base, vec3f(y), t);\n}\n\nfn yellow(base: vec3f, amount: f32, uv: vec2f, seed: u32) -> vec3f {\n if (amount <= 0.0) {\n return base;\n }\n let shift = f32(seed) * 0.01;\n let fox = smoothstep(0.90, 0.97, value_noise3(vec3f(uv * 140.0 + vec2f(shift, 0.0), 11.0), true))\n * smoothstep(0.55, 0.85, value_noise3(vec3f(uv.x * 12.0, uv.y * 12.0 + shift, 12.0), true));\n var out = base * mix(vec3f(1.0), vec3f(0.86, 0.74, 0.60), clamp(fox * 0.35 * amount, 0.0, 1.0));\n let blot = fbm3(vec3f(uv * 5.0 + vec2f(shift, 0.0), 13.0), 4, true);\n let tide = smoothstep(0.60, 0.63, blot) * (1.0 - smoothstep(0.63, 0.68, blot));\n let stain = smoothstep(0.58, 0.72, blot) * 0.25 + tide * 0.3;\n out *= mix(vec3f(1.0), vec3f(0.95, 0.91, 0.84), clamp(stain * amount, 0.0, 1.0));\n let edge = 1.0 - smoothstep(0.0, 0.008, uv.y - 0.004) * smoothstep(0.0, 0.008, uv.x);\n return out * mix(vec3f(1.0), vec3f(0.93, 0.88, 0.78), clamp(edge * 0.5 * amount, 0.0, 1.0));\n}\n\nfn scratch(base: vec3f, roughness: f32, amount: f32, position: vec3f, seed: u32) -> vec4f {\n if (amount <= 0.0) {\n return vec4f(base, roughness);\n }\n let q = position * 900.0;\n let n = value_noise3(vec3f(q.x * 0.02 + f32(seed), q.y, q.z * 0.02), false);\n let line = 1.0 - smoothstep(0.0, 0.045, abs(n - 0.5));\n let smudge = smoothstep(0.52, 0.78, value_noise3(position * 22.0, false) * 0.65 + value_noise3(position * 61.0, false) * 0.35);\n let cell = vec3i(floor(position * 2600.0));\n let speck = select(0.0, 1.0, hash3_xor(vec3i(cell.x, cell.y, cell.z ^ i32(seed))) > 0.9985);\n let cover = min(amount, 1.0);\n let breakup = clamp(smudge * 0.55 + line * 0.35 + speck, 0.0, 1.0) * cover;\n let rough2 = roughness * roughness;\n let mixed = mix(rough2, min(rough2 * 3.0 + 0.03, 0.5), breakup);\n let albedo = mix(base, base * 0.9 + vec3f(0.06), speck * cover);\n return vec4f(albedo, sqrt(mixed));\n}\n\nfn worn_edge(base: vec3f, roughness: f32, amount: f32, edge: f32) -> vec4f {\n let w = clamp(amount, 0.0, 1.0) * clamp(edge, 0.0, 1.0);\n if (w <= 0.0) {\n return vec4f(base, roughness);\n }\n let lifted = base * mix(vec3f(1.0), vec3f(1.6, 1.42, 1.18), 0.6);\n return vec4f(mix(base, lifted, w), mix(roughness, min(roughness + 0.3, 0.92), w));\n}\n\nfn dust(base: vec3f, roughness: f32, amount: f32, position: vec3f, seed: u32) -> vec4f {\n if (amount <= 0.0) {\n return vec4f(base, roughness);\n }\n let n = value_noise3(position * 2.5 + vec3f(f32(seed) * 0.13, 0.0, 0.0), false);\n let mask = smoothstep(0.45, 0.8, n) * min(amount, 1.0);\n return vec4f(mix(base, vec3f(0.62, 0.58, 0.50), mask), mix(roughness, min(roughness + 0.2, 1.0), mask * 0.5));\n}\n\nfn patina(base: vec3f, roughness: f32, metalness: f32, amount_in: f32, position: vec3f, seed: u32) -> vec4f {\n let amount = clamp(amount_in, 0.0, 1.0);\n if (amount <= 0.0) {\n return vec4f(base, roughness);\n }\n let shift = f32(seed) * 0.001;\n let p = position + vec3f(shift);\n let bloom = smoothstep(0.35, 0.75, fbm3(p * 900.0, 4, true)) * amount;\n let rub = smoothstep(0.55, 0.85, fbm3(p * 300.0 + vec3f(3.0), 3, true)) * amount;\n let dull = clamp(0.5 * amount + 0.5 * bloom - 0.6 * rub, 0.0, 1.0);\n var f0 = base * mix(vec3f(1.0), vec3f(0.52, 0.44, 0.35), dull);\n let green = smoothstep(0.62, 0.9, fbm3(p * 1500.0 + vec3f(9.0), 3, true)) * amount * 0.45;\n f0 = mix(f0, vec3f(0.24, 0.30, 0.25), green);\n let rough = clamp(roughness + 0.3 * dull + 0.2 * green, 0.1, 0.85);\n let metal = mix(metalness, 0.5, green);\n return vec4f(f0, rough);\n}\n\nfn ink_age(at: vec2f, age_in: f32, seed: u32) -> vec4f {\n let age = clamp(age_in, 0.0, 1.0);\n let origin = round(at);\n let c = ink_sample(origin);\n if (age == 0.0) {\n return c;\n }\n let aged = inkfx(origin, seed);\n return mix(c, aged, age);\n}\n\nfn inkfx(at: vec2f, seed: u32) -> vec4f {\n let p = vec2i(at);\n let q = vec2f(p);\n let c = ink_sample(q);\n let angle = noise2(q * 0.006, seed) * 6.2832 * 2.0;\n let fiber = vec2f(cos(angle), sin(angle));\n var wick = c;\n for (var k = 1; k <= 3; k++) {\n let d = vec2i(round(fiber * f32(k)));\n let fall = pow(0.22, f32(k)) * (0.6 + 0.8 * noise2(q * 0.21 + vec2f(f32(k) * 13.0, 0.0), seed));\n let a = ink_sample(vec2f(p + d));\n let b = ink_sample(vec2f(p - d));\n wick = max(wick, max(a, b) * fall);\n }\n var wide = vec4f(0.0);\n for (var y = -3; y <= 3; y++) {\n for (var x = -3; x <= 3; x++) {\n wide += ink_sample(vec2f(p + vec2i(x * 2, y * 2)));\n }\n }\n wide *= 1.0 / 49.0;\n let grain = noise2(q * 0.45, seed) * 0.55 + noise2(q * 0.11, seed) * 0.45;\n let absorb = 0.97 + 0.06 * (grain - 0.5);\n let voids = smoothstep(0.80, 0.93, noise2(q * 0.38 + vec2f(71.0, 5.0), seed));\n let edge = max(c - wide, vec4f(0.0));\n let wash = smoothstep(0.05, 0.25, c.r) * (1.0 - smoothstep(0.55, 0.85, c.r));\n let local_age = 0.96 + 0.04 * noise2(q * 0.0025 + vec2f(3.0, 9.0), seed);\n let wear = smoothstep(0.62, 0.8, noise2(q * 0.09 + vec2f(40.0, 2.0), seed));\n return vec4f(\n clamp((wick.r * absorb * 1.12 + edge.r * 0.45 * wash) * (1.0 - 0.45 * voids * (1.0 - c.r * c.r)) * local_age, 0.0, 1.0),\n clamp(wick.g * (0.94 + 0.08 * grain) * (1.0 - 0.2 * voids), 0.0, 1.0),\n clamp(c.b * (1.0 - 0.35 * wear), 0.0, 1.0),\n clamp(wick.a * (0.8 + 0.2 * grain) * (1.0 - 0.3 * voids), 0.0, 1.0),\n );\n}\n";