summaryrefslogtreecommitdiff
path: root/src/test_demo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/test_demo.cc')
-rw-r--r--src/test_demo.cc39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/test_demo.cc b/src/test_demo.cc
index a438bbc..b8e9381 100644
--- a/src/test_demo.cc
+++ b/src/test_demo.cc
@@ -32,15 +32,23 @@ class PeakMeterEffect : public PostProcessEffect {
};
struct Uniforms {
- peak_value: f32,
+ resolution: vec2<f32>,
_pad0: f32,
_pad1: f32,
- _pad2: f32,
+ aspect_ratio: f32,
+ time: f32,
+ beat: f32,
+ audio_intensity: f32,
+ };
+
+ struct EffectParams {
+ unused: f32,
};
@group(0) @binding(0) var inputSampler: sampler;
@group(0) @binding(1) var inputTexture: texture_2d<f32>;
@group(0) @binding(2) var<uniform> uniforms: Uniforms;
+ @group(0) @binding(3) var<uniform> params: EffectParams;
@vertex
fn vs_main(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
@@ -69,7 +77,7 @@ class PeakMeterEffect : public PostProcessEffect {
// Optimization: Return bar color early (avoids texture sampling for ~5% of pixels)
if (in_bar_y && in_bar_x) {
let uv_x = (input.uv.x - bar_x_min) / (bar_x_max - bar_x_min);
- let factor = step(uv_x, uniforms.peak_value);
+ let factor = step(uv_x, uniforms.audio_intensity);
return mix(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0,1.0), factor);
}
@@ -80,24 +88,26 @@ class PeakMeterEffect : public PostProcessEffect {
pipeline_ =
create_post_process_pipeline(ctx_.device, ctx_.format, shader_code);
- uniforms_ = gpu_create_buffer(
- ctx_.device, 16, WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst);
}
void update_bind_group(WGPUTextureView input_view) {
pp_update_bind_group(ctx_.device, pipeline_, &bind_group_, input_view,
- uniforms_, {});
+ uniforms_.get(), {});
}
void render(WGPURenderPassEncoder pass, float time, float beat,
float peak_value, float aspect_ratio) {
(void)time;
(void)beat;
- (void)aspect_ratio;
- float uniforms[4] = {peak_value, 0.0f, 0.0f, 0.0f};
- wgpuQueueWriteBuffer(ctx_.queue, uniforms_.buffer, 0, uniforms,
- sizeof(uniforms));
+ CommonPostProcessUniforms u = {
+ .resolution = {(float)width_, (float)height_},
+ .aspect_ratio = aspect_ratio,
+ .time = time,
+ .beat = beat,
+ .audio_intensity = peak_value,
+ };
+ uniforms_.update(ctx_.queue, u);
wgpuRenderPassEncoderSetPipeline(pass, pipeline_);
wgpuRenderPassEncoderSetBindGroup(pass, 0, bind_group_, 0, nullptr);
@@ -209,6 +219,9 @@ int main(int argc, char** argv) {
platform_state = platform_init(fullscreen_enabled, width, height);
gpu_init(&platform_state);
+ // Load timeline from test_demo.seq
+ LoadTimeline(*gpu_get_main_sequence(), *gpu_get_context());
+
// Add peak meter visualization effect (renders as final post-process)
#if !defined(STRIP_ALL)
const GpuContext* gpu_ctx = gpu_get_context();
@@ -253,9 +266,9 @@ int main(int argc, char** argv) {
audio_render_ahead(g_music_time, audio_dt * g_tempo_scale);
};
- // Pre-fill audio buffer
- g_audio_engine.update(g_music_time, 1.0f / 60.0f);
- audio_render_ahead(g_music_time, 1.0f / 60.0f);
+ // Pre-fill using same pattern as main loop (100ms)
+ fill_audio_buffer(0.1f, 0.0);
+
audio_start();
g_last_audio_time = audio_get_playback_time();