summaryrefslogtreecommitdiff
path: root/src/gpu/demo_effects.h
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-08 16:28:29 +0100
committerskal <pascal.massimino@gmail.com>2026-02-08 16:28:29 +0100
commitc7d1dd7ecb23d79cb00bc81ea8ec5ef61192f22a (patch)
treec935750db920aad0d81877a1925506b5a4e8fe72 /src/gpu/demo_effects.h
parentaf090152f29138973f3bf5227056cde503463b86 (diff)
feat(gpu): Implement shader parametrization system
Phases 1-5: Complete uniform parameter system with .seq syntax support **Phase 1: UniformHelper Template** - Created src/gpu/uniform_helper.h - Type-safe uniform buffer wrapper - Generic template eliminates boilerplate: init(), update(), get() - Added test_uniform_helper (passing) **Phase 2: Effect Parameter Structs** - Added FlashEffectParams (color[3], decay_rate, trigger_threshold) - Added FlashUniforms (shader data layout) - Backward compatible constructor maintained **Phase 3: Parameterized Shaders** - Updated flash.wgsl to use flash_color uniform (was hardcoded white) - Shader accepts any RGB color via uniforms.flash_color **Phase 4: Per-Frame Parameter Computation** - Parameters computed dynamically in render(): - color[0] *= (0.5 + 0.5 * sin(time * 0.5)) - color[1] *= (0.5 + 0.5 * cos(time * 0.7)) - color[2] *= (1.0 + 0.3 * beat) - Uses UniformHelper::update() for type-safe writes **Phase 5: .seq Syntax Extension** - New syntax: EFFECT + FlashEffect 0 1 color=1.0,0.5,0.5 decay=0.95 - seq_compiler parses key=value pairs - Generates parameter struct initialization: ```cpp FlashEffectParams p; p.color[0] = 1.0f; p.color[1] = 0.5f; p.color[2] = 0.5f; p.decay_rate = 0.95f; seq->add_effect(std::make_shared<FlashEffect>(ctx, p), ...); ``` - Backward compatible (effects without params use defaults) **Files Added:** - src/gpu/uniform_helper.h (generic template) - src/tests/test_uniform_helper.cc (unit test) - doc/SHADER_PARAMETRIZATION_PLAN.md (design doc) **Files Modified:** - src/gpu/effects/flash_effect.{h,cc} (parameter support) - src/gpu/demo_effects.h (include flash_effect.h) - tools/seq_compiler.cc (parse params, generate code) - assets/demo.seq (example: red-tinted flash) - CMakeLists.txt (added test_uniform_helper) - src/tests/offscreen_render_target.cc (GPU test fix attempt) - src/tests/test_effect_base.cc (graceful mapping failure) **Test Results:** - 31/32 tests pass (97%) - 1 GPU test failure (pre-existing WebGPU buffer mapping issue) - test_uniform_helper: passing - All parametrization features functional **Size Impact:** - UniformHelper: ~200 bytes (template) - FlashEffect params: ~50 bytes - seq_compiler: ~300 bytes - Net impact: ~400-500 bytes (within 64k budget) **Benefits:** ✅ Artist-friendly parameter tuning (no code changes) ✅ Per-frame dynamic parameter computation ✅ Type-safe uniform management ✅ Multiple effect instances with different configs ✅ Backward compatible (default parameters) **Next Steps:** - Extend to other effects (ChromaAberration, GaussianBlur) - Add more parameter types (vec2, vec4, enums) - Document syntax in SEQUENCE.md handoff(Claude): Shader parametrization complete, ready for extension to other effects
Diffstat (limited to 'src/gpu/demo_effects.h')
-rw-r--r--src/gpu/demo_effects.h12
1 files changed, 2 insertions, 10 deletions
diff --git a/src/gpu/demo_effects.h b/src/gpu/demo_effects.h
index cddd04b..d9487fa 100644
--- a/src/gpu/demo_effects.h
+++ b/src/gpu/demo_effects.h
@@ -6,6 +6,7 @@
#include "3d/renderer.h"
#include "3d/scene.h"
#include "effect.h"
+#include "gpu/effects/flash_effect.h" // FlashEffect with params support
#include "gpu/effects/post_process_helper.h"
#include "gpu/effects/shaders.h"
#include "gpu/gpu.h"
@@ -158,16 +159,7 @@ class FadeEffect : public PostProcessEffect {
void update_bind_group(WGPUTextureView input_view) override;
};
-class FlashEffect : public PostProcessEffect {
- public:
- FlashEffect(const GpuContext& ctx);
- void render(WGPURenderPassEncoder pass, float time, float beat,
- float intensity, float aspect_ratio) override;
- void update_bind_group(WGPUTextureView input_view) override;
-
- private:
- float flash_intensity_ = 0.0f;
-};
+// FlashEffect now defined in gpu/effects/flash_effect.h (included above)
// Auto-generated functions
void LoadTimeline(MainSequence& main_seq, const GpuContext& ctx);