// WgslEffect: generic shader-only post-process effect. // Replaces boilerplate .h/.cc pairs for simple single-pass effects. #pragma once #include "gpu/effect.h" #include "gpu/uniform_helper.h" #include "gpu/wgpu_resource.h" // Generic per-effect uniform params (binding 3, 32 bytes). // Matches WgslEffectParams in WGSL: struct { p: vec4f, c: vec4f } // effect_params.p — 4 generic floats (strength, scale, etc.) // effect_params.c — color or secondary vec4 struct WgslEffectParams { float p[4]; // vec4: generic float params float c[4]; // vec4: color / secondary params }; static_assert(sizeof(WgslEffectParams) == 32, "WgslEffectParams must be 32 bytes"); class WgslEffect : public Effect { public: // Mutate per-frame for dynamic parameter modulation. WgslEffectParams effect_params; WgslEffect(const GpuContext& ctx, const std::vector& inputs, const std::vector& outputs, float start_time, float end_time, const char* shader_code, WGPULoadOp load_op = WGPULoadOp_Clear, WgslEffectParams initial_params = {}); void render(WGPUCommandEncoder encoder, const UniformsSequenceParams& params, NodeRegistry& nodes) override; private: RenderPipeline pipeline_; BindGroup bind_group_; UniformBuffer params_buffer_; WGPULoadOp load_op_; };