| Age | Commit message (Collapse) | Author |
|
Expanded HOWTO.md with complete CLI options list and WAV rendering
examples. Updated HEADLESS_MODE.md with new dump-wav options.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Adds CLI options to control WAV dump time range:
- --dump-wav-start TIME: Start dumping at specified time (seeks first)
- --dump-wav-duration TIME: Limit dump duration
Enables efficient rendering of specific segments without dumping entire demo.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Added audio_get_required_prefill_time() to query ring buffer lookahead
(400ms) and audio_is_prefilled() to check buffer state. audio_start()
now warns if buffer under-filled. Replaced hardcoded 100ms pre-fill
with automatic target-based pre-fill in main.cc and test_demo.cc.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
|
|
Waveform and timeline were using different width calculations, causing
beat markers and timeline ticks to misalign when BPM changed. Waveform
now uses same maxTime calculation as timeline (including sequence padding).
Also replaced magic constants (16, 0.4) with named constants for clarity:
- SEQUENCE_DEFAULT_DURATION = 16 beats
- WAVEFORM_AMPLITUDE_SCALE = 0.4
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Adds replay button that restarts playback from the position where Play was originally clicked. Button is always visible but disabled when no audio is loaded.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Fix indicator position to track scroll offset during zoom/wheel
- Add named constants for all magic numbers (layout, scroll, timing)
- Fix double-click seek positioning (account for left padding)
- Hide indicator by default, show only when audio loaded
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Major improvements to timeline editor playback indicator and user experience:
**Indicator positioning:**
- Consolidated all indicator positioning into single updateIndicatorPosition() function
- Removed dual indicator architecture (waveform + timeline), now single indicator spans full height
- Positioned at timeline-container level with correct offset calculation (beats * pixelsPerSecond + 20px)
- Indicator properly updates on all state changes: playback, zoom, BPM, seek, file load
**UX improvements:**
- Made BPM value editable (number input instead of span)
- Added faint vertical beat markers to waveform (rgba(255,255,255,0.15))
- Fixed keyboard event handling to not intercept number keys when typing in input fields
- Reset playback offset to 0 on file load and audio clear
**Bug fixes:**
- Removed timeline border-left that caused offset issues
- Fixed indicator not updating on mouse wheel zoom
- Fixed indicator visibility (z-index 110 above sticky header)
- All zoom/BPM/file operations now consistently update indicator
Architecture is now clean and maintainable with single source of truth for positioning.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
SDFTestEffect was failing with undefined dfWithID error. The raymarching.wgsl
include requires dfWithID even for single-pass effects. Added dummy implementation
that wraps df() for compatibility.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Split conditional compilation so --dump-wav works in normal builds.
Previously required cmake -DDEMO_HEADLESS=ON, now only needs !STRIP_ALL.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Update CLI parser to use --dump-wav (consistent with other options)
- Add error message and exit for unrecognized options
- Update documentation: HEADLESS_MODE.md, COMPLETED.md, FINAL_STRIP_REPORT.md
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Add descriptive labels to shader modules (render_shader, compute_shader)
to make shader compilation errors easier to identify in wgpu-native output.
Note: wgpu-native already reports detailed shader errors via device error
callback - look for "In wgpuDeviceCreateShaderModule" in error output.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Add interactive waveform timeline for determining SAMPLE OFFSET values:
Features:
- RMS envelope visualization (10ms windows, normalized)
- Uses synthesized PCM from spectrogram (not original WAV)
- Draggable offset marker with numeric input (0.001s precision)
- Snap-to-onset: auto-detects first transient (threshold 0.01)
- Copy button: generates `SAMPLE <name> OFFSET <seconds>` command
- Top panel (120px) with controls, z-indexed above spectrogram
Design rationale:
- Offset measured on procedural output (matches runtime behavior)
- Interactive workflow: load .spec → inspect → set offset → copy
- Supports tracker compile-time SAMPLE OFFSET feature
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Add RayMarchResult struct and functions for deferred SDF rendering:
- rayMarchWithID() tracks object ID and distance_max
- reconstructPosition(), normalWithID(), shadowWithStoredDistance()
- Pass 1: store geometry data, Pass 2: reuse for shading
Add WGSL style rule: prefer return values over pointers for small structs (≤16 bytes).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Add unified camera system for SDF raymarching effects:
- CameraParams struct (80 bytes): inv_view matrix + FOV/near/far/aspect
- SDFEffect base class: manages camera uniform, provides update_camera() helpers
- camera_common.wgsl: getCameraRay(), position/forward/up/right extractors
- SDFTestEffect: working example with orbiting camera + animated sphere
Refactor effect headers:
- Extract class definitions from demo_effects.h to individual .h files
- Update includes in .cc files to use specific headers
- Cleaner compilation dependencies, faster incremental builds
Documentation:
- Add SDF_EFFECT_GUIDE.md with complete workflow
- Update ARCHITECTURE.md, UNIFORM_BUFFER_GUIDELINES.md
- Update EFFECT_WORKFLOW.md, CONTRIBUTING.md
Tests: 34/34 passing, SDFTestEffect validated
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Add two low-priority sub-tasks:
- MP3 sample assets with miniaudio
- GPU-accelerated PCM synthesis via compute shader
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Implements two tracker realism features:
1. Sample Offset (compile-time):
- Add offset_sec field to NoteParams and Sample structs
- Parse OFFSET parameter in SAMPLE directive
- Apply timing shift during compilation (zero runtime cost)
- Use for attack-heavy samples to align perceived beat
2. Humanization (runtime, deterministic):
- Add humanize_seed, timing_variation_pct, volume_variation_pct to TrackerScore
- Parse HUMANIZE directive with SEED/TIMING/VOLUME params
- Apply per-event RNG jitter using std::minstd_rand
- Deterministic: same seed produces identical output
Both features work in real-time playback and WAV export.
Test file: data/test_humanize.track
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
|
|
Merge sdf_primitives.wgsl into math/sdf_shapes.wgsl to eliminate
duplication and establish single source of truth for all SDF functions.
Changes:
- Delete common/shaders/sdf_primitives.wgsl (duplicate of math/sdf_shapes.wgsl)
- Add sdBox2D() and sdEllipse() to math/sdf_shapes.wgsl
- Update ellipse.wgsl (main/test) to use #include "math/sdf_shapes"
- Update scene1.wgsl to use math/sdf_shapes instead of sdf_primitives
- Rename asset SHADER_SDF_PRIMITIVES → SHADER_SDF_SHAPES
- Update shader registration and tests
Impact:
- ~60 lines eliminated from ellipse shaders
- Single source for 3D primitives (sphere, box, torus, plane) and 2D (box, ellipse)
- Consistent include path across codebase
All tests passing (34/34).
handoff(Claude): SDF shapes consolidated to math/sdf_shapes.wgsl
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Replace duplicate fullscreen triangle vertex shader code with
#include "render/fullscreen_vs" in 8 workspace shaders. Eliminates
~60 lines of duplication and establishes single source of truth.
Modified shaders:
- circle_mask_compute.wgsl (main/test)
- circle_mask_render.wgsl (main/test)
- ellipse.wgsl (main/test)
- gaussian_blur.wgsl (main/test)
Updated test_shader_assets.cc to validate include directive instead
of inline @vertex keyword for affected shaders.
All tests passing (34/34).
handoff(Claude): Shader modularization - fullscreen_vs consolidated
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
|
|
Extracted common WGSL functions into separate files in `common/shaders/` to improve reusability and maintainability.
- Created `common/shaders/render/fullscreen_vs.wgsl` for a reusable fullscreen vertex shader.
- Created `common/shaders/math/color.wgsl` for color conversion and tone mapping functions.
- Created `common/shaders/math/utils.wgsl` for general math utilities.
- Created `common/shaders/render/raymarching.wgsl` for SDF raymarching logic.
- Updated multiple shaders to use these new common snippets via `#include`.
- Fixed the shader asset validation test to correctly handle shaders that include the common vertex shader.
This refactoring makes the shader code more modular and easier to manage.
|
|
This refactoring improves the project's structure by decoupling visual effects from the core GPU module. All effect implementations have been moved from to a new top-level directory. Shared utilities like , , and have been consolidated into the parent directory.
- **Motivation**: To create a clearer separation of concerns, making the codebase easier to navigate and maintain. This move treats effects as a distinct layer that depends on the core GPU module, rather than being embedded within it.
- **Changes**:
- Created new directory.
- Moved all effect source files (, ) to .
- Moved shared helpers (, , ) to .
- Updated and to reflect the new file locations for all build targets.
- Corrected all directives across the entire codebase (, , ) to point to the new paths.
- Updated all markdown documentation ( files) to ensure file paths and architectural descriptions are accurate.
- Fixed several compiler errors related to incorrect enum casting () that were exposed during cross-compilation for Windows.
- **Verification**:
- The entire project builds successfully for both native and Windows cross-compilation targets.
- All 34 tests pass (Usage
ctest [options]).
- The --- Running Native Build & Tests ---
Configuring with all options enabled (tests + tools)...
--
-- Build Configuration:
-- DEMO_SIZE_OPT: ON
-- DEMO_STRIP_ALL: ON
-- DEMO_FINAL_STRIP: OFF
-- DEMO_STRIP_EXTERNAL_LIBS: OFF
-- DEMO_BUILD_TESTS: ON
-- DEMO_BUILD_TOOLS: ON
-- DEMO_ENABLE_COVERAGE: OFF
-- DEMO_ENABLE_DEBUG_LOGS: OFF
-- DEMO_HEADLESS: OFF
-- DEMO_WORKSPACE: main
--
-- Loaded workspace: Main Demo
-- Timeline: timeline.seq
-- Music: pop_punk_drums.track
-- Assets: assets.txt
-- Using workspace: main
-- Configuring done (0.0s)
-- Generating done (0.1s)
-- Build files have been written to: /Users/skal/demo/build
Building all targets (demo, tests, and tools)...
[ 0%] Built target validate_uniforms_script
[ 1%] Built target procedural
[ 2%] Validating uniform buffer sizes and alignments...
[ 3%] Built target tracker_compiler
[ 4%] Built target test_3d
[ 4%] Built target test_maths
[ 4%] Built target seq_compiler
[ 4%] Built target tracker_compiler_host
[ 5%] Built target asset_packer
[ 5%] Built target test_procedural
[ 6%] Compiling demo sequence from workspace main...
[ 6%] Built target generate_tracker_music
[ 6%] Built target generate_test_demo_music
[ 6%] Compiling test_demo sequence...
Using BPM: 90
Successfully generated timeline with 16 sequences.
Using BPM: 120
Demo end time: 16.000000s
Successfully generated timeline with 1 sequences.
[ 6%] Built target generate_test_demo_timeline
[ 6%] Built target generate_timeline
Validation Warning for 'CommonPostProcessUniforms': Matching WGSL struct not found.
Validation OK for 'FadeParams': Size 16 matches C++ expected size.
Validation OK for 'ThemeModulationParams': Size 16 matches C++ expected size.
Validation OK for 'GaussianBlurParams': Size 8 matches C++ expected size.
Validation OK for 'DistortParams': Size 8 matches C++ expected size.
Validation OK for 'CircleMaskParams': Size 16 matches C++ expected size.
[ 6%] Built target generate_test_assets
[ 7%] Built target generate_demo_assets
[ 7%] Built target validate_uniforms
[ 8%] Built target util
[ 10%] Built target test_assets
[ 11%] Built target test_shader_assets
[ 12%] Built target test_file_watcher
[ 15%] Built target 3d
[ 21%] Built target test_platform
[ 22%] Built target audio
[ 23%] Built target test_window
[ 26%] Built target test_fft
[ 27%] Built target test_synth
[ 27%] Built target test_spectral_brush
[ 27%] Built target test_physics
[ 28%] Built target test_dct
[ 31%] Building CXX object CMakeFiles/gpu.dir/src/gpu/effect.cc.o
[ 30%] Built target test_mock_backend
[ 32%] Built target test_scene_loader
[ 33%] Built target test_audio_backend
[ 34%] Built target test_audio_gen
[ 36%] Built target test_silent_backend
[ 39%] Built target test_jittered_audio
[ 39%] Building CXX object CMakeFiles/gpu.dir/src/effects/heptagon_effect.cc.o
[ 42%] Built target test_wav_dump
[ 44%] Built target test_tracker_timing
[ 44%] Building CXX object CMakeFiles/gpu.dir/src/effects/particles_effect.cc.o
[ 45%] Building CXX object CMakeFiles/gpu.dir/src/effects/passthrough_effect.cc.o
[ 47%] Built target test_variable_tempo
[ 50%] Built target test_audio_engine
[ 52%] Built target test_tracker
[ 52%] Building CXX object CMakeFiles/gpu.dir/src/effects/moving_ellipse_effect.cc.o
[ 52%] Building CXX object CMakeFiles/gpu.dir/src/effects/particle_spray_effect.cc.o
[ 52%] Building CXX object CMakeFiles/gpu.dir/src/effects/gaussian_blur_effect.cc.o
[ 54%] Built target test_spectool
[ 55%] Building CXX object CMakeFiles/gpu.dir/src/effects/solarize_effect.cc.o
[ 55%] Building CXX object CMakeFiles/gpu.dir/src/effects/scene1_effect.cc.o
[ 55%] Building CXX object CMakeFiles/gpu.dir/src/effects/chroma_aberration_effect.cc.o
[ 55%] Building CXX object CMakeFiles/gpu.dir/src/gpu/shaders.cc.o
[ 57%] Building CXX object CMakeFiles/gpu.dir/src/effects/vignette_effect.cc.o
[ 57%] Building CXX object CMakeFiles/gpu.dir/src/gpu/post_process_helper.cc.o
[ 57%] Linking CXX static library libgpu.a
[ 60%] Built target gpu
[ 60%] Linking CXX executable test_uniform_helper
[ 60%] Linking CXX executable test_shader_composer
[ 60%] Building CXX object CMakeFiles/test_sequence.dir/src/tests/assets/test_sequence.cc.o
[ 61%] Linking CXX executable test_noise_functions
[ 62%] Linking CXX executable test_shader_compilation
[ 62%] Building CXX object CMakeFiles/test_demo.dir/src/app/test_demo.cc.o
[ 62%] Building CXX object CMakeFiles/demo64k.dir/src/app/main.cc.o
[ 62%] Building CXX object CMakeFiles/test_3d_render.dir/src/generated/timeline.cc.o
[ 63%] Built target test_uniform_helper
[ 64%] Built target test_shader_composer
[ 64%] Building CXX object CMakeFiles/test_3d_physics.dir/src/generated/timeline.cc.o
[ 65%] Built target test_noise_functions
[ 66%] Built target test_shader_compilation
[ 67%] Building CXX object CMakeFiles/test_mesh.dir/src/generated/timeline.cc.o
[ 67%] Building CXX object CMakeFiles/test_effect_base.dir/src/tests/gpu/test_effect_base.cc.o
[ 67%] Building CXX object CMakeFiles/test_demo_effects.dir/src/tests/gpu/test_demo_effects.cc.o
[ 67%] Building CXX object CMakeFiles/test_sequence.dir/src/generated/timeline.cc.o
[ 68%] Building CXX object CMakeFiles/test_demo.dir/src/generated/test_demo_timeline.cc.o
[ 68%] Building CXX object CMakeFiles/demo64k.dir/src/generated/timeline.cc.o
[ 68%] Linking CXX executable test_3d_render
[ 68%] Building CXX object CMakeFiles/test_effect_base.dir/src/generated/timeline.cc.o
[ 68%] Linking CXX executable test_3d_physics
[ 68%] Linking CXX executable test_mesh
[ 71%] Built target test_3d_render
[ 71%] Building CXX object CMakeFiles/test_post_process_helper.dir/src/tests/gpu/test_post_process_helper.cc.o
[ 72%] Building CXX object CMakeFiles/test_demo_effects.dir/src/generated/timeline.cc.o
[ 72%] Linking CXX executable test_demo
[ 75%] Built target test_3d_physics
[ 77%] Built target test_mesh
[ 77%] Linking CXX executable test_texture_manager
[ 78%] Linking CXX executable test_sequence
[ 78%] Linking CXX executable test_gpu_procedural
[ 80%] Built target test_demo
[ 81%] Linking CXX executable test_gpu_composite
[ 81%] Linking CXX executable demo64k
[ 83%] Built target test_sequence
[ 85%] Built target test_texture_manager
[ 86%] Built target test_gpu_procedural
[ 86%] Linking CXX executable test_post_process_helper
[ 86%] Linking CXX executable test_effect_base
[ 87%] Built target test_gpu_composite
[ 90%] Built target demo64k
[ 92%] Built target test_post_process_helper
[ 96%] Built target test_effect_base
[ 96%] Linking CXX executable test_demo_effects
[100%] Built target test_demo_effects
Running test suite...
Test project /Users/skal/demo/build
Start 1: HammingWindowTest
1/34 Test #1: HammingWindowTest ................ Passed 0.00 sec
Start 2: MathUtilsTest
2/34 Test #2: MathUtilsTest .................... Passed 0.00 sec
Start 3: FileWatcherTest
3/34 Test #3: FileWatcherTest .................. Passed 0.00 sec
Start 4: SynthEngineTest
4/34 Test #4: SynthEngineTest .................. Passed 0.00 sec
Start 5: DctTest
5/34 Test #5: DctTest .......................... Passed 0.00 sec
Start 6: FftTest
6/34 Test #6: FftTest .......................... Passed 0.01 sec
Start 7: SpectralBrushTest
7/34 Test #7: SpectralBrushTest ................ Passed 0.01 sec
Start 8: AudioGenTest
8/34 Test #8: AudioGenTest ..................... Passed 0.00 sec
Start 9: AudioBackendTest
9/34 Test #9: AudioBackendTest ................. Passed 0.00 sec
Start 10: SilentBackendTest
10/34 Test #10: SilentBackendTest ................ Passed 0.00 sec
Start 11: MockAudioBackendTest
11/34 Test #11: MockAudioBackendTest ............. Passed 0.00 sec
Start 12: WavDumpBackendTest
12/34 Test #12: WavDumpBackendTest ............... Passed 0.00 sec
Start 13: JitteredAudioBackendTest
13/34 Test #13: JitteredAudioBackendTest ......... Passed 0.00 sec
Start 14: TrackerTimingTest
14/34 Test #14: TrackerTimingTest ................ Passed 0.00 sec
Start 15: VariableTempoTest
15/34 Test #15: VariableTempoTest ................ Passed 0.00 sec
Start 16: TrackerSystemTest
16/34 Test #16: TrackerSystemTest ................ Passed 0.01 sec
Start 17: AudioEngineTest
17/34 Test #17: AudioEngineTest .................. Passed 0.00 sec
Start 18: ShaderAssetValidation
18/34 Test #18: ShaderAssetValidation ............ Passed 0.00 sec
Start 19: ShaderCompilationTest
19/34 Test #19: ShaderCompilationTest ............ Passed 0.02 sec
Start 20: NoiseFunctionsTest
20/34 Test #20: NoiseFunctionsTest ............... Passed 0.01 sec
Start 21: UniformHelperTest
21/34 Test #21: UniformHelperTest ................ Passed 0.00 sec
Start 22: AssetManagerTest
22/34 Test #22: AssetManagerTest ................. Passed 0.01 sec
Start 23: SequenceSystemTest
23/34 Test #23: SequenceSystemTest ............... Passed 0.01 sec
Start 24: ProceduralGenTest
24/34 Test #24: ProceduralGenTest ................ Passed 0.01 sec
Start 25: PhysicsTest
25/34 Test #25: PhysicsTest ...................... Passed 0.01 sec
Start 26: ThreeDSystemTest
26/34 Test #26: ThreeDSystemTest ................. Passed 0.00 sec
Start 27: ShaderComposerTest
27/34 Test #27: ShaderComposerTest ............... Passed 0.01 sec
Start 28: SceneLoaderTest
28/34 Test #28: SceneLoaderTest .................. Passed 0.01 sec
Start 29: EffectBaseTest
29/34 Test #29: EffectBaseTest ................... Passed 0.04 sec
Start 30: DemoEffectsTest
30/34 Test #30: DemoEffectsTest .................. Passed 0.03 sec
Start 31: PostProcessHelperTest
31/34 Test #31: PostProcessHelperTest ............ Passed 0.02 sec
Start 32: TextureManagerTest
32/34 Test #32: TextureManagerTest ............... Passed 0.02 sec
Start 33: GpuProceduralTest
33/34 Test #33: GpuProceduralTest ................ Passed 0.18 sec
Start 34: GpuCompositeTest
34/34 Test #34: GpuCompositeTest ................. Passed 0.20 sec
100% tests passed, 0 tests failed out of 34
Label Time Summary:
3d = 0.01 sec*proc (3 tests)
assets = 0.02 sec*proc (2 tests)
audio = 0.07 sec*proc (15 tests)
gpu = 0.54 sec*proc (11 tests)
util = 0.01 sec*proc (3 tests)
Total Test time (real) = 0.67 sec
Verifying tools compile...
[ 9%] Built target procedural
[ 18%] Built target tracker_compiler_host
[ 18%] Built target tracker_compiler
[ 18%] Built target generate_tracker_music
[ 18%] Built target asset_packer
[ 27%] Built target generate_demo_assets
[ 27%] Built target generate_test_assets
[ 36%] Built target util
[ 81%] Built target audio
[100%] Built target test_spectool
--- Running Windows Cross-Compilation Build ---
Building native tools...
--
-- Build Configuration:
-- DEMO_SIZE_OPT: OFF
-- DEMO_STRIP_ALL: OFF
-- DEMO_FINAL_STRIP: OFF
-- DEMO_STRIP_EXTERNAL_LIBS: OFF
-- DEMO_BUILD_TESTS: OFF
-- DEMO_BUILD_TOOLS: OFF
-- DEMO_ENABLE_COVERAGE: OFF
-- DEMO_ENABLE_DEBUG_LOGS: OFF
-- DEMO_HEADLESS: OFF
-- DEMO_WORKSPACE: main
--
-- Loaded workspace: Main Demo
-- Timeline: timeline.seq
-- Music: pop_punk_drums.track
-- Assets: assets.txt
-- Using workspace: main
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/skal/demo/build_native
[ 50%] Built target procedural
[100%] Built target asset_packer
[100%] Built target seq_compiler
[100%] Built target tracker_compiler_host
Cross-compiling for Windows...
--
-- Build Configuration:
-- DEMO_SIZE_OPT: ON
-- DEMO_STRIP_ALL: ON
-- DEMO_FINAL_STRIP: OFF
-- DEMO_STRIP_EXTERNAL_LIBS: OFF
-- DEMO_BUILD_TESTS: OFF
-- DEMO_BUILD_TOOLS: OFF
-- DEMO_ENABLE_COVERAGE: OFF
-- DEMO_ENABLE_DEBUG_LOGS: OFF
-- DEMO_HEADLESS: OFF
-- DEMO_WORKSPACE: main
--
-- Loaded workspace: Main Demo
-- Timeline: timeline.seq
-- Music: pop_punk_drums.track
-- Assets: assets.txt
-- Using workspace: main
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/skal/demo/build_win
[ 2%] Built target validate_uniforms_script
[ 2%] Built target generate_timeline
[ 4%] Built target generate_test_demo_timeline
[ 4%] Built target generate_demo_assets
[ 4%] Built target generate_test_assets
[ 6%] Built target procedural
[ 9%] Built target tracker_compiler_host
[ 10%] Validating uniform buffer sizes and alignments...
[ 11%] Built target generate_tracker_music
[ 13%] Built target generate_test_demo_music
[ 16%] Built target util
[ 28%] Built target 3d
[ 45%] Built target audio
[ 49%] Building CXX object CMakeFiles/gpu.dir/src/effects/heptagon_effect.cc.obj
[ 52%] Building CXX object CMakeFiles/gpu.dir/src/effects/gaussian_blur_effect.cc.obj
[ 54%] Building CXX object CMakeFiles/gpu.dir/src/effects/particles_effect.cc.obj
[ 54%] Building CXX object CMakeFiles/gpu.dir/src/effects/moving_ellipse_effect.cc.obj
[ 54%] Building CXX object CMakeFiles/gpu.dir/src/gpu/effect.cc.obj
[ 54%] Building CXX object CMakeFiles/gpu.dir/src/effects/passthrough_effect.cc.obj
[ 54%] Building CXX object CMakeFiles/gpu.dir/src/effects/particle_spray_effect.cc.obj
Validation Warning for 'CommonPostProcessUniforms': Matching WGSL struct not found.
Validation OK for 'FadeParams': Size 16 matches C++ expected size.
Validation OK for 'ThemeModulationParams': Size 16 matches C++ expected size.
Validation OK for 'GaussianBlurParams': Size 8 matches C++ expected size.
Validation OK for 'DistortParams': Size 8 matches C++ expected size.
Validation OK for 'CircleMaskParams': Size 16 matches C++ expected size.
[ 54%] Built target validate_uniforms
[ 55%] Building CXX object CMakeFiles/gpu.dir/src/effects/solarize_effect.cc.obj
[ 57%] Building CXX object CMakeFiles/gpu.dir/src/effects/scene1_effect.cc.obj
[ 57%] Building CXX object CMakeFiles/gpu.dir/src/effects/chroma_aberration_effect.cc.obj
[ 58%] Building CXX object CMakeFiles/gpu.dir/src/effects/vignette_effect.cc.obj
[ 59%] Building CXX object CMakeFiles/gpu.dir/src/gpu/post_process_helper.cc.obj
[ 60%] Building CXX object CMakeFiles/gpu.dir/src/gpu/shaders.cc.obj
[ 62%] Linking CXX static library libgpu.a
[ 77%] Built target gpu
[ 79%] Building CXX object CMakeFiles/demo64k.dir/src/app/main.cc.obj
[ 79%] Building CXX object CMakeFiles/test_demo.dir/src/app/test_demo.cc.obj
[ 80%] Building CXX object CMakeFiles/demo64k.dir/src/generated/timeline.cc.obj
[ 81%] Building CXX object CMakeFiles/test_demo.dir/src/generated/test_demo_timeline.cc.obj
[ 82%] Linking CXX executable test_demo.exe
[ 90%] Built target test_demo
[ 91%] Linking CXX executable demo64k.exe
[100%] Built target demo64k
Copying MinGW DLLs...
Crunching build_win/demo64k.exe...
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2026
UPX 5.1.0 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 7th 2026
File size Ratio Format Name
-------------------- ------ ----------- -----------
7036416 -> 4680704 66.52% win64/pe demo64k_packed.exe
Packed 1 file.
------------------------------------------------
Size Report:
-rwxr-xr-x 1 skal 89939 6.7M Feb 14 14:55 build_win/demo64k.exe
-rwxr-xr-x 1 skal 89939 6.7M Feb 14 14:55 build_win/demo64k_stripped.exe
-rwxr-xr-x 1 skal 89939 4.5M Feb 14 14:55 build_win/demo64k_packed.exe
------------------------------------------------
Top 20 Largest Symbols (from unstripped):
------------------------------------------------
Build complete. Output: build_win/demo64k.exe
All checks passed successfully. script completes without errors.
This change streamlines the project's architecture without altering any functionality.
|
|
Moved to to better organize test files.
Updated to reflect the new file location.
All tests pass after the move and build system update.
|
|
Synthesizes a comprehensive project overview by parsing all 44
documentation files. Updates the GEMINI.md state snapshot with detailed
knowledge of the project's architecture, status, and priorities.
- Goal: Capture a deep understanding of the project's 64k demo target,
cross-platform nature, and core technical pillars.
- Key Systems Captured:
- Workspace System: usage and shaders.
- Build & Asset Pipeline: , , files.
- Audio Engine: Real-time procedural synthesis, variable tempo.
- Graphics Pipeline: Hybrid SDF/rasterization, WGSL, BVH.
- CNNv2: 7D parametric features, Python/PyTorch training toolchain.
- State Update: Refreshes with the latest information on
project goals, constraints, key knowledge, and task status.
- Handoff: Prepares a detailed summary for user review.
|
|
Eliminates repetitive Renderer3D texture initialization across 3 test files.
Creates setup_standard_textures() helper that configures standard noise
(256x256, GPU procedural) and sky (512x256, Perlin) textures.
- New: src/3d/renderer_helpers.{h,cc}
- Refactor: test_3d_physics, test_3d_render, test_mesh use helper
- Build: Added renderer_helpers.cc to CMake 3D_SOURCES
- Result: -52 lines of boilerplate across 3 files
Production effects (Hybrid3DEffect, FlashCubeEffect) use asset-based
textures and retain custom initialization.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Adds new helper for common post-process texture pattern (RenderAttachment
| TextureBinding | CopySrc usage). Refactors test_post_process_helper.cc
to use gpu_create_buffer() and gpu_create_post_process_texture(),
eliminating 91 lines of boilerplate.
- New: gpu_create_post_process_texture() in gpu.{h,cc}
- Refactor: test_post_process_helper.cc uses helpers instead of raw WGPU
- Doc: Updated WGPU_HELPERS.md with usage examples
- Verified: All tests passing (test_post_process_helper, test_demo_effects)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Reduces WGPUTextureViewDescriptor boilerplate from 5-7 lines to 1-2.
Helper supports optional mip_levels parameter (defaults to 1).
Updated 17 call sites across gpu/, tests/, and tools/.
Net: -82 lines. All tests passing (34/34).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Comprehensive documentation for project-specific WGPU helpers (not wgpu-native wrappers).
**Covers:**
- Buffer management (gpu_create_buffer)
- Texture creation (gpu_create_texture_2d, storage textures, mip views)
- Pipeline helpers (compute/render pass creation)
- Cross-platform utilities (gpu_init_color_attachment)
- Test helpers (init_wgpu_with_surface)
**Usage patterns:**
- Effect uniforms setup
- Compute shader dispatch
- Multi-pass rendering
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Extracted duplicate WGPU initialization boilerplate from test_3d_physics,
test_3d_render, and test_mesh into shared helper (test_3d_helpers).
**Changes:**
- New: src/tests/common/test_3d_helpers.{h,cc} (~120 LOC)
- Removed ~280 LOC of duplicate init_wgpu() implementations
- Net savings: -141 LOC
**Benefits:**
- Single source of truth for surface+device initialization
- Eliminates cross-compile #ifdef duplication
- Easier maintenance for callback API changes
All 34 tests pass.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Replace textureSample() with textureSampleLevel() in compute shader.
textureSample() requires derivative calculations only available in fragment
shaders. Compute shaders must explicitly specify mip level.
Fixes: DemoEffectsTest CNNv2Effect initialization
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Add texture creation helpers (gpu_create_texture_2d, gpu_create_storage_texture_2d,
gpu_create_mip_view) and extend BindGroupLayoutBuilder with uint_texture and
storage_texture methods.
Refactored files:
- cnn_v2_effect.cc: Use texture helpers (~70% code reduction in create_textures)
- rotating_cube_effect.cc: Use BindGroupLayoutBuilder and texture helpers
- circle_mask_effect.cc: Use BindGroupBuilder
Benefits:
- Improved code readability
- Reduced boilerplate for texture/bind group creation
- Consistent patterns across effects
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
**CNN v2 Changes:**
- Replace point sampling with bilinear interpolation for mip-level features
- Add linear sampler (binding 6) to static features shader
- Update CNNv2Effect, cnn_test, and HTML tool
**HTML Tool UI:**
- Move controls to floating bottom bar in central view
- Consolidate video controls + Blend/Depth/Save PNG in single container
- Increase left panel width: 300px → 315px (+5%)
- Remove per-frame debug messages (visualization, rendering logs)
**Technical:**
- WGSL: textureSample() with linear_sampler vs textureLoad()
- C++: Create WGPUSampler with Linear filtering
- HTML: Change sampler from 'nearest' to 'linear'
handoff(Claude): CNN v2 now uses bilinear mip-level sampling across all tools
|
|
Refactor duplicated test setup/teardown code into shared fixtures:
- test_math_helpers.h: Float comparison (test_near, test_near_vec3)
- AudioTestFixture: RAII wrapper for AudioEngine lifecycle
- EffectTestFixture: Combined WebGPU + AudioEngine + MainSequence
Migrated 9 test files (3 math, 6 audio) to use fixtures.
Net reduction: 54 LOC (178 insertions, 232 deletions).
All 34 tests passing.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Tests failed due to missing assets/test_gantt.seq. Gantt output
functionality still works via seq_compiler tool.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- PROJECT_CONTEXT.md: Updated Effects section (sigmoid, stable training)
- TODO.md: Added sigmoid activation to CNN v2 status
- CNN_V2.md: Streamlined (removed outdated issues, updated code examples)
handoff(Claude): Documentation synchronized with sigmoid implementation.
|
|
Fixes training collapse where p1/p2 channels saturate due to gradient
blocking at clamp boundaries. Sigmoid provides smooth [0,1] mapping
with continuous gradients.
Changes:
- Layer 0: clamp(x, 0, 1) → sigmoid(x)
- Final layer: clamp(x, 0, 1) → sigmoid(x)
- Middle layers: ReLU unchanged (already stable)
Updated files:
- training/train_cnn_v2.py: PyTorch model activations
- workspaces/main/shaders/cnn_v2/cnn_v2_compute.wgsl: WGSL shader
- tools/cnn_v2_test/index.html: HTML validation tool
- doc/CNN_V2.md: Documentation
Validation:
- Build clean (no shader errors)
- 34/36 tests pass (2 unrelated script tests fail)
- 10-epoch training: loss 0.153 → 0.088 (good convergence)
- cnn_test processes images successfully
Breaking change: Old checkpoints trained with clamp() incompatible.
Retrain from scratch required.
handoff(Claude): CNN v2 sigmoid activation implemented and validated.
|
|
Support custom learning rate in train_cnn_v2_full.sh (default: 1e-3).
Usage: ./scripts/train_cnn_v2_full.sh --lr 1e-4
handoff(Claude): Added --lr flag to training wrapper script
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- HOWTO.md: Document always-save-checkpoint behavior and --quiet flag
- COMPLETED.md: Add milestone entry for Feb 14 CNN v2 fixes
- Details: checkpoint saving, num_layers derivation, output streamlining
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Add --quiet flag to export script (single-line summary)
- Compact validation output (all images on one line)
- Reduce noise: export 3 layers, 912 weights, 1904 bytes
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Always save final checkpoint after training completes
- Derive num_layers from kernel_sizes list when multiple values provided
- Add checkpoint validation in training pipeline script
- Quote shell variables when passing args to Python
Fixes issue where no checkpoint saved when epochs < checkpoint_every.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- train_cnn_v2_full.sh: Support custom output path via --output-weights
- Pass weights path to export and validation stages
- Update HOWTO.md: Add rapid debug example (1 layer, 5 epochs)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Updated gen_identity_weights.py --mix mode to use static features
p4-p7 (uv_x, uv_y, sin20_y, bias) at channels 8-11 instead of
p0-p3 (RGB+D) at channels 4-7.
Before: 0.5*prev[i] + 0.5*static_p{i} (channels 4-7)
After: 0.5*prev[i] + 0.5*static_p{4+i} (channels 8-11)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Fixed bug in gen_identity_weights.py --p47 mode: static features p4-p7
(uv_x, uv_y, sin20_y, bias) are at input channels 8-11, not 4-7.
Weight tensor layout:
- Channels 0-3: Previous layer output (4D RGBA)
- Channels 4-11: Static features (8D: p0-p7)
Static features:
- p0-p3 (channels 4-7): RGB+D from mip level
- p4-p7 (channels 8-11): uv_x, uv_y, sin20_y, bias
Updated:
- training/gen_identity_weights.py: Change weights[i,i+4] to weights[i,i+8]
- workspaces/main/weights/mix_p47.bin: Regenerated (not in repo)
- doc/CNN_V2.md: Add Input Channel Mapping section with full layout table
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Always use vizScale=1.0 for all layers. Shader clips to [0,1] for display.
Shows exact layer output values without artificial dimming.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Final layer output is clamped [0,1] and should use vizScale=1.0
like static features, not 0.5 like middle layers (unbounded ReLU).
Before: All layers except static used 0.5 (too dark)
After: Static + final layer use 1.0, middle layers use 0.5
Fixes brightness mismatch between big preview and thumbnails.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Updates --mix mode to use 50-50 weighting to avoid overflow:
- Before: p0+p4, p1+p5, p2+p6, p3+p7
- After: 0.5*p0+0.5*p4, 0.5*p1+0.5*p5, etc
Prevents saturation when blending input with static features.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Adds --p47 flag to output static features directly:
- p4 → ch0 (UV.x)
- p5 → ch1 (UV.y)
- p6 → ch2 (sin encoding)
- p7 → ch3 (bias)
Useful for visualizing static feature generation without input RGBA.
Updated doc/CNN_V2_DEBUG_TOOLS.md with --p47 usage.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Adds --mix flag to blend input channels with static features:
- p0+p4 → p0 (RGBA + UV.x)
- p1+p5 → p1 (RGBA + UV.y)
- p2+p6 → p2 (RGBA + sin encoding)
- p3+p7 → p3 (RGBA + bias)
Useful for debugging static feature contribution in CNN v2.
Updated doc/CNN_V2_DEBUG_TOOLS.md with --mix usage examples.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|