From 766c0b0a41ddb4ac1fae68f720a9176a1b5f6070 Mon Sep 17 00:00:00 2001 From: skal Date: Mon, 16 Feb 2026 09:43:06 +0100 Subject: feat(sequence): add inline post-process functions for v2 - Create postprocess_inline.wgsl with 7 inline effect functions - Functions: vignette, flash, fade, theme, solarize, chroma_aberration, distort - Add example combined_postprocess_v2.wgsl showing usage - Register postprocess_inline snippet with ShaderComposer - Add to main and test workspace assets - All tests passing (36/36) Strategy: Simple effects become inline functions instead of separate classes. Complex effects (rotating_cube, hybrid_3d, particles) remain as TODO for v2 port. handoff(Claude): Inline functions ready, 7 simple effects consolidated --- common/shaders/postprocess_inline.wgsl | 61 ++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 common/shaders/postprocess_inline.wgsl (limited to 'common/shaders/postprocess_inline.wgsl') diff --git a/common/shaders/postprocess_inline.wgsl b/common/shaders/postprocess_inline.wgsl new file mode 100644 index 0000000..fcc5e27 --- /dev/null +++ b/common/shaders/postprocess_inline.wgsl @@ -0,0 +1,61 @@ +// Inline post-process functions for simple effects +// Use these instead of separate effect classes for v2 sequences + +// Vignette: darkens edges based on distance from center +fn apply_vignette(color: vec4, uv: vec2, radius: f32, softness: f32, intensity: f32) -> vec4 { + let d = distance(uv, vec2(0.5, 0.5)); + let vignette = smoothstep(radius, radius - softness, d); + return vec4(color.rgb * mix(1.0, vignette, intensity), color.a); +} + +// Flash: additive white flash +fn apply_flash(color: vec4, flash_intensity: f32) -> vec4 { + return color + vec4(flash_intensity, flash_intensity, flash_intensity, 0.0); +} + +// Fade: linear interpolation to target color +fn apply_fade(color: vec4, fade_amount: f32, fade_color: vec3) -> vec4 { + return vec4(mix(color.rgb, fade_color, fade_amount), color.a); +} + +// Theme modulation: multiply by color tint +fn apply_theme(color: vec4, theme_color: vec3, strength: f32) -> vec4 { + return vec4(mix(color.rgb, color.rgb * theme_color, strength), color.a); +} + +// Solarize: threshold-based color inversion +fn apply_solarize(color: vec4, threshold: f32, strength: f32, time: f32) -> vec4 { + let pattern_num = u32(time / 2.0); + let is_even = (pattern_num % 2u) == 0u; + let thr = threshold + 0.15 * sin(time); + var col = color; + + if (is_even) { + if (col.r < thr) { col.r = mix(col.r, 1.0 - col.r, strength); } + if (col.g < thr) { col.g = mix(col.g, 1.0 - col.g * 0.7, strength * 0.7); } + if (col.b < thr) { col.b = mix(col.b, col.b * 0.5, strength); } + } else { + if (col.r < thr) { col.r = mix(col.r, col.r * 0.6, strength); } + if (col.g < thr) { col.g = mix(col.g, 1.0 - col.g * 0.8, strength * 0.8); } + if (col.b < thr) { col.b = mix(col.b, 1.0 - col.b, strength); } + } + return col; +} + +// Chroma aberration: RGB channel offset +fn apply_chroma_aberration(input_tex: texture_2d, input_sampler: sampler, + uv: vec2, offset: f32, resolution: vec2) -> vec4 { + let pixel_offset = offset / resolution; + let r = textureSample(input_tex, input_sampler, uv + vec2(pixel_offset.x, 0.0)).r; + let g = textureSample(input_tex, input_sampler, uv).g; + let b = textureSample(input_tex, input_sampler, uv - vec2(pixel_offset.x, 0.0)).b; + let a = textureSample(input_tex, input_sampler, uv).a; + return vec4(r, g, b, a); +} + +// Distort: UV distortion based on time +fn apply_distort(uv: vec2, time: f32, strength: f32) -> vec2 { + let distort_x = sin(uv.y * 10.0 + time * 2.0) * strength; + let distort_y = cos(uv.x * 10.0 + time * 2.0) * strength; + return uv + vec2(distort_x, distort_y); +} -- cgit v1.2.3