| Age | Commit message (Collapse) | Author |
|
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>
|
|
currentLayerIdx indexes layerOutputs array (0=Static Features, 1=Layer 0).
Filename should use layer number, not array index.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Root cause: Binary format is [header:20B][layer_info:20B×N][weights].
Both cnn_test and CNNv2Effect uploaded entire file to weights_buffer,
but shader reads weights_buffer[0] expecting first weight, not header.
Fix: Skip header + layer_info when uploading to GPU buffer.
- cnn_test.cc: Calculate weights_offset, upload only weights section
- cnn_v2_effect.cc: Same fix for runtime effect
Before: layer_0 output showed [R, uv_x, uv_y, black] (wrong channels)
After: layer_0 output shows [R, G, B, D] (correct identity mapping)
Tests: 34/36 passing (2 unrelated failures)
|
|
When using --weights option:
- Layer count and kernel sizes loaded from binary header
- Warnings shown if --layers or --cnn-version specified
- Help text clarifies precedence order
- Binary weights always take precedence over CLI args
Updated documentation:
- doc/CNN_TEST_TOOL.md: Usage examples with --weights
- doc/HOWTO.md: Runtime weight loading example
handoff(Claude): cnn_test --weights config override
|
|
Enables testing different CNN v2 weight files without rebuilding. Automatically forces CNN v2 when --weights is specified, with warning if --cnn-version conflicts.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
All layers now use scale 1.0, shader clamps values >1.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Layer 0 output is clamped [0,1], does not need 0.5 dimming.
Middle layers (ReLU) keep 0.5 scale for values >1.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Add identity weight generator and composited layer save for debugging
HTML/C++ output differences.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Cast depth array to float32 when provided, preventing torch Double/Float
dtype mismatch during forward pass.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|