diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-16 17:04:41 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-16 17:04:41 +0100 |
| commit | c79ebff06ae74135c5f67ecc01d5bb55aeb5eda9 (patch) | |
| tree | 6521b1ed109668715a4a75a27e2f6a13218ae480 | |
| parent | 5eba3e77c58941ee02257f077a80558dd152a52e (diff) | |
fix: calculate beat_phase for FlashEffect and refactor uniforms
- seq_compiler.py: Calculate beat_phase from beat_time (was hardcoded 0.0f)
- Refactor: Replace CommonPostProcessUniforms with UniformsSequenceParams
- Remove duplicate struct definition in post_process_helper.h
- Update all CNN effects and tests to use unified uniform struct
- Fixes FlashEffect showing solid white instead of flashing to beat
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
| -rw-r--r-- | cnn_v1/src/cnn_v1_effect.cc | 2 | ||||
| -rw-r--r-- | cnn_v1/src/cnn_v1_effect.h | 2 | ||||
| -rw-r--r-- | cnn_v2/src/cnn_v2_effect.cc | 4 | ||||
| -rw-r--r-- | cnn_v2/src/cnn_v2_effect.h | 4 | ||||
| -rw-r--r-- | common/shaders/sequence_uniforms.wgsl | 2 | ||||
| -rw-r--r-- | src/app/test_demo.cc | 2 | ||||
| -rw-r--r-- | src/gpu/post_process_helper.h | 14 | ||||
| -rw-r--r-- | src/gpu/sdf_effect.h | 2 | ||||
| -rw-r--r-- | src/tests/assets/test_sequence.cc | 6 | ||||
| -rw-r--r-- | tools/cnn_test.cc | 6 | ||||
| -rwxr-xr-x | tools/seq_compiler.py | 6 | ||||
| -rw-r--r-- | tools/shadertoy/template.cc | 4 |
12 files changed, 23 insertions, 31 deletions
diff --git a/cnn_v1/src/cnn_v1_effect.cc b/cnn_v1/src/cnn_v1_effect.cc index 1f44619..9118831 100644 --- a/cnn_v1/src/cnn_v1_effect.cc +++ b/cnn_v1/src/cnn_v1_effect.cc @@ -79,7 +79,7 @@ void CNNv1Effect::resize(int width, int height) { } void CNNv1Effect::render(WGPURenderPassEncoder pass, - const CommonPostProcessUniforms& uniforms) { + const UniformsSequenceParams& uniforms) { if (!bind_group_) { fprintf(stderr, "CNN render: no bind_group\n"); return; diff --git a/cnn_v1/src/cnn_v1_effect.h b/cnn_v1/src/cnn_v1_effect.h index e820275..6753db8 100644 --- a/cnn_v1/src/cnn_v1_effect.h +++ b/cnn_v1/src/cnn_v1_effect.h @@ -26,7 +26,7 @@ class CNNv1Effect : public PostProcessEffect { void init(MainSequence* demo) override; void resize(int width, int height) override; void render(WGPURenderPassEncoder pass, - const CommonPostProcessUniforms& uniforms) override; + const UniformsSequenceParams& uniforms) override; void update_bind_group(WGPUTextureView input_view) override; // Layer 0 needs framebuffer capture for original input diff --git a/cnn_v2/src/cnn_v2_effect.cc b/cnn_v2/src/cnn_v2_effect.cc index 133087a..42aa2bb 100644 --- a/cnn_v2/src/cnn_v2_effect.cc +++ b/cnn_v2/src/cnn_v2_effect.cc @@ -377,7 +377,7 @@ void CNNv2Effect::update_bind_group(WGPUTextureView input_view) { } void CNNv2Effect::compute(WGPUCommandEncoder encoder, - const CommonPostProcessUniforms& uniforms) { + const UniformsSequenceParams& uniforms) { if (!initialized_ || !static_pipeline_ || !static_bind_group_) return; @@ -446,7 +446,7 @@ void CNNv2Effect::compute(WGPUCommandEncoder encoder, } void CNNv2Effect::render(WGPURenderPassEncoder pass, - const CommonPostProcessUniforms& uniforms) { + const UniformsSequenceParams& uniforms) { (void)pass; (void)uniforms; // Compute-only effect, rendering is done by default composite pass diff --git a/cnn_v2/src/cnn_v2_effect.h b/cnn_v2/src/cnn_v2_effect.h index 7960b4f..b675736 100644 --- a/cnn_v2/src/cnn_v2_effect.h +++ b/cnn_v2/src/cnn_v2_effect.h @@ -19,9 +19,9 @@ class CNNv2Effect : public PostProcessEffect { void init(MainSequence* demo) override; void resize(int width, int height) override; void compute(WGPUCommandEncoder encoder, - const CommonPostProcessUniforms& uniforms) override; + const UniformsSequenceParams& uniforms) override; void render(WGPURenderPassEncoder pass, - const CommonPostProcessUniforms& uniforms) override; + const UniformsSequenceParams& uniforms) override; void update_bind_group(WGPUTextureView input_view) override; void set_beat_modulation(bool enabled, float scale = 1.0f) { diff --git a/common/shaders/sequence_uniforms.wgsl b/common/shaders/sequence_uniforms.wgsl index b302329..be47ad9 100644 --- a/common/shaders/sequence_uniforms.wgsl +++ b/common/shaders/sequence_uniforms.wgsl @@ -1,5 +1,5 @@ // Sequence v2 uniform structure for WGSL shaders -// Matches UniformsSequenceParams in sequence_v2.h +// Matches UniformsSequenceParams in sequence.h struct UniformsSequenceParams { resolution: vec2<f32>, diff --git a/src/app/test_demo.cc b/src/app/test_demo.cc index cf1a577..83e6f8b 100644 --- a/src/app/test_demo.cc +++ b/src/app/test_demo.cc @@ -95,7 +95,7 @@ class PeakMeterEffect : public PostProcessEffectV2 { } void render(WGPURenderPassEncoder pass, - const CommonPostProcessUniforms& uniforms) override { + const UniformsSequenceParams& uniforms) override { uniforms_.update(ctx_.queue, uniforms); PostProcessEffect::render(pass, uniforms); } diff --git a/src/gpu/post_process_helper.h b/src/gpu/post_process_helper.h index 33ef20b..963f671 100644 --- a/src/gpu/post_process_helper.h +++ b/src/gpu/post_process_helper.h @@ -4,20 +4,10 @@ #pragma once #include "gpu/gpu.h" +#include "gpu/sequence.h" #include "util/mini_math.h" -// Uniform data common to all post-processing effects -struct CommonPostProcessUniforms { - vec2 resolution; // Screen dimensions - float aspect_ratio; // Width/height ratio - float time; // Physical time in seconds (unaffected by tempo) - float beat_time; // Musical time in beats (absolute, tempo-scaled) - float beat_phase; // Fractional beat (0.0-1.0 within current beat) - float audio_intensity; // Audio peak for beat sync - float _pad; // Padding for 16-byte alignment -}; -static_assert(sizeof(CommonPostProcessUniforms) == 32, - "CommonPostProcessUniforms must be 32 bytes for WGSL alignment"); +// Use UniformsSequenceParams (defined in sequence.h) for post-process effects // Standard post-process bind group layout (group 0): #define PP_BINDING_SAMPLER 0 // Sampler for input texture diff --git a/src/gpu/sdf_effect.h b/src/gpu/sdf_effect.h index 4f23604..aacea69 100644 --- a/src/gpu/sdf_effect.h +++ b/src/gpu/sdf_effect.h @@ -12,7 +12,7 @@ // Provides CameraParams uniform buffer and helper methods // // Binding convention: -// @group(0) @binding(2): CommonPostProcessUniforms (from Effect base) +// @group(0) @binding(2): UniformsSequenceParams (from Effect base) // @group(0) @binding(3): CameraParams // @group(0) @binding(4+): Per-effect custom parameters class SDFEffect : public Effect { diff --git a/src/tests/assets/test_sequence.cc b/src/tests/assets/test_sequence.cc index edf5c2d..445e44b 100644 --- a/src/tests/assets/test_sequence.cc +++ b/src/tests/assets/test_sequence.cc @@ -42,13 +42,13 @@ class DummyEffect : public Effect { ++start_calls; } void render(WGPURenderPassEncoder pass, - const CommonPostProcessUniforms& uniforms) override { + const UniformsSequenceParams& uniforms) override { ++render_calls; (void)pass; (void)uniforms; } void compute(WGPUCommandEncoder encoder, - const CommonPostProcessUniforms& uniforms) override { + const UniformsSequenceParams& uniforms) override { (void)encoder; (void)uniforms; } @@ -75,7 +75,7 @@ class DummyPostProcessEffect : public PostProcessEffect { (void)demo; } void render(WGPURenderPassEncoder pass, - const CommonPostProcessUniforms& uniforms) override { + const UniformsSequenceParams& uniforms) override { ++render_calls; (void)pass; (void)uniforms; diff --git a/tools/cnn_test.cc b/tools/cnn_test.cc index d88956d..a209cdf 100644 --- a/tools/cnn_test.cc +++ b/tools/cnn_test.cc @@ -1332,7 +1332,7 @@ int main(int argc, char** argv) { // Create uniform buffers const WGPUBufferDescriptor common_uniform_desc = { .usage = WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst, - .size = sizeof(CommonPostProcessUniforms), + .size = sizeof(UniformsSequenceParams), }; WGPUBuffer common_uniform_buffer = wgpuDeviceCreateBuffer(device, &common_uniform_desc); @@ -1384,7 +1384,7 @@ int main(int argc, char** argv) { printf("Processing layer %d/%d...\n", layer + 1, NUM_LAYERS); // Update uniforms - CommonPostProcessUniforms common_u = { + UniformsSequenceParams common_u = { .resolution = {static_cast<float>(width), static_cast<float>(height)}, .aspect_ratio = static_cast<float>(width) / static_cast<float>(height), .time = 0.0f, @@ -1410,7 +1410,7 @@ int main(int argc, char** argv) { BindGroupBuilder() .sampler(0, sampler) .texture(1, current_input) - .buffer(2, common_uniform_buffer, sizeof(CommonPostProcessUniforms)) + .buffer(2, common_uniform_buffer, sizeof(UniformsSequenceParams)) .buffer(3, layer_params_buffer, sizeof(CNNv1LayerParams)) .texture(4, original_view) .build(device, bgl); diff --git a/tools/seq_compiler.py b/tools/seq_compiler.py index 6b72ebd..3b8d126 100755 --- a/tools/seq_compiler.py +++ b/tools/seq_compiler.py @@ -516,7 +516,8 @@ void RenderTimeline(WGPUCommandEncoder encoder, float time, int width, int heigh float beat_time, float audio_intensity) { Sequence* seq = GetActiveSequence(time); if (seq) { - seq->preprocess(time, beat_time, 0.0f, audio_intensity); + float beat_phase = fmodf(beat_time, 1.0f); + seq->preprocess(time, beat_time, beat_phase, audio_intensity); seq->render_effects(encoder); } } @@ -584,7 +585,8 @@ void RenderTimeline(WGPUSurface surface, float time, int width, int height, seq->set_sink_view(g_sink_view); // Update uniforms via preprocess - seq->preprocess(time, beat_time, 0.0f, audio_intensity); + float beat_phase = fmodf(beat_time, 1.0f); + seq->preprocess(time, beat_time, beat_phase, audio_intensity); WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(ctx->device, nullptr); diff --git a/tools/shadertoy/template.cc b/tools/shadertoy/template.cc index 7636c0a..56b4ab5 100644 --- a/tools/shadertoy/template.cc +++ b/tools/shadertoy/template.cc @@ -83,7 +83,7 @@ void ShaderToyEffect::init(MainSequence* demo) { {.binding = 1, .textureView = prev_view}, {.binding = 2, .buffer = uniforms_.get().buffer, - .size = sizeof(CommonPostProcessUniforms)}, + .size = sizeof(UniformsSequenceParams)}, {.binding = 3, .buffer = params_.get().buffer, .size = sizeof(ShaderToyParams)}, @@ -98,7 +98,7 @@ void ShaderToyEffect::init(MainSequence* demo) { void ShaderToyEffect::render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) { - const CommonPostProcessUniforms uniforms = { + const UniformsSequenceParams uniforms = { .resolution = {static_cast<float>(width_), static_cast<float>(height_)}, .aspect_ratio = aspect_ratio, .time = time, |
