// Horizontal film scratch lines utility // Returns scratch intensity [0,1] to additively overlay on a color buffer. // // Parameters: // uv - normalized texture coordinates [0,1] // resolution - screen size in pixels (used for sub-pixel thickness) // time - physical time in seconds // // Simulates aged/damaged film: ~8 random horizontal lines per frame, // each with independent position, thickness, brightness and on/off state. // Time is quantized to 24 buckets/sec so scratches flicker like film frames. #include "math/noise" fn scratch_lines(uv: vec2f, resolution: vec2f, time: f32) -> f32 { // Quantize to ~24fps to simulate film frame rate let t = floor(time * 24.0); var intensity = 0.0; for (var i = 0; i < 8; i++) { let seed = f32(i) * 17.3 + t; // ~25% chance this scratch is visible this frame let visible = step(0.75, hash_1f(seed + 3.1)); // Random vertical position [0, 1] let y = hash_1f(seed + 7.9); // Thickness in pixels [1, 4] let thickness = hash_1f(seed + 13.5) * 3.0 + 1.0; // Brightness [0.5, 1.0] let brightness = hash_1f(seed + 21.7) * 0.5 + 0.5; // Soft linear falloff from line center let dy = abs(uv.y - y) * resolution.y; let line = clamp(1.0 - dy / thickness, 0.0, 1.0); intensity += line * brightness * visible; } return clamp(intensity, 0.0, 1.0); }