| Age | Commit message (Collapse) | Author |
|
Two bugs kept the v2 OLA path permanently disabled:
1. SpectrogramResourceManager::load_asset() never set spec.version from
SpecHeader::version — all .spec assets loaded with version=0, so
ola_mode was always false in the voice.
2. spectool analyze_audio() used non-overlapping chunks (stride=DCT_SIZE),
hamming_window_512, and hardcoded header.version=1 — OLA analysis was
never implemented in the encoder.
Fixes: propagate header->version in load_asset(); switch spectool to
OLA_HOP_SIZE stride, hann_window_512, and SPEC_VERSION_V2_OLA.
Regenerated all .spec files.
handoff(Gemini): OLA enc/dec chain now correct end-to-end. .spec files
are v2 (50% overlap, Hann). No API changes; 33/34 tests pass
(WavDumpBackendTest pre-existing failure unrelated).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
|
|
Adds a minimal test.mp3 fixture to the test workspace and verifies
GetAssetType returns AssetType::MP3 and GetAsset returns non-null data.
handoff(Gemini): MP3 asset test added, 34/34 tests passing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
handoff(Gemini): all .spec files rebuilt with v2 encoder; click-free OLA synthesis active.
|
|
enum, add MP3 type
- Add AssetType enum {STATIC, PROC, PROC_GPU, MP3} to AssetRecord
- Add GetAssetType() API to asset_manager.h/cc
- asset_packer: parse 'MP3' compression keyword in assets.txt
- tracker: remove magic-byte is_mp3_asset(); use GetAssetType() instead
- assets.txt: NEVER_MP3 now uses 'MP3' compression type
- doc/ASSET_SYSTEM.md: rewritten to document new types and API
handoff(Gemini): AssetType enum landed; MP3 detection is now explicit via asset metadata.
|
|
|
|
src/effects/
Move 13 effect-specific shaders from workspaces/main/shaders/ to src/effects/
so each effect's .h, .cc, and .wgsl are together. Update assets.txt paths in
both main and test workspaces. Update EFFECT_WORKFLOW.md to reflect new location.
Shared/reusable snippets remain in src/shaders/.
handoff(Gemini): shaders moved; src/effects/ now has .h, .cc, and .wgsl per effect.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
scene2.wgsl was invalid WGSL (mixed GLSL syntax, wrong function signatures,
undeclared variables, no return statement). Rewrote as valid WGSL preserving
the original volumetric cloud raymarching logic. 11/11 effects now pass.
handoff(Claude): scene2.wgsl fixed, all tests green.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- Fix assets.txt path: shaders/xxx.wgsl (not ../../src/shaders/)
- Fix shader output path to workspaces/main/shaders/
- Step 5: reference cmake/DemoSourceLists.cmake COMMON_GPU_EFFECTS (not CMakeLists.txt GPU_SOURCES)
- Add step for test_demo_effects.cc
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Relocates shared WGSL shaders under src/ where all source code lives,
eliminating the top-level common/ directory.
- Update asset references in workspaces/main/assets.txt and workspaces/test/assets.txt
- Update docs: PROJECT_CONTEXT.md, ARCHITECTURE.md, WORKSPACE_SYSTEM.md, SHADER_REUSE_INVESTIGATION.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- Delete unused SDFEffect base class (src/gpu/sdf_effect.h)
- Delete sdf_test.wgsl and SHADER_SDF_TEST from assets.txt
- Rewrite SDF_EFFECT_GUIDE.md based on Scene1 canonical pattern:
correct bindings (2/3), vec4f syntax, UniformsSequenceParams
- Fix missing newline at end of gpu.h
handoff(Claude): SDF cleanup done, guide updated to match current Effect API
|
|
|
|
snippet
- Fix vs_main return type (VertexOutput, not vec4<f32>)
- Fix #include paths in passthrough, gaussian_blur, heptagon, combined_postprocess
- ShaderComposer: assert + suggest correct path on missing #include (non-STRIP_ALL)
- VerifyIncludes: upgrade WARNING to ERROR + assert, add "did you mean?" hint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Replaced `vec2<f32>`, `vec3<f32>`, `vec4<f32>`, `mat4x4<f32>`, and `mat3x3<f32>` with their shorter aliases `vec2f`, `vec3f`, `vec4f`, `mat4x4f`, and `mat3x3f` across all WGSL shader files in `workspaces/main/shaders/`. This improves readability and aligns with modern WGSL conventions.
|
|
Replaces all instances of `vec<f32>` with the more concise `vec*f` alias (e.g., `vec3f`) across all `.wgsl` shaders. This improves readability and aligns with common graphics programming conventions.
Also adds a new coding style rule to `doc/CODING_STYLE.md` to enforce this standard going forward.
Finally, this commit fixes a build error in `test_effect_base.cc` by replacing a call to the non-existent `wgpuDeviceTick` with `wgpuDevicePoll`, which resolves the test failure.
|
|
|
|
Factorizes the screen coordinate calculation from scene1.wgsl into a reusable getScreenCoord function in common/shaders/math/common_utils.wgsl.
This improves code reuse and simplifies fragment shaders.
|
|
|
|
Pass Ray directly instead of separate ro/rd params; minor cleanup (remove redundant consts, cache ray.direction.y).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Build camera via mat4::look_at + inverse in scene1_effect.cc, upload as
CameraParams at binding 3. Shader uses getCameraRay() from camera_common.
Enable camera_common snippet registration in shaders.cc.
handoff(Claude): Scene1 camera now driven by CameraParams uniform; fov=TAU/6 (60° vFOV) matches original tan(PI/3) parameterization.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- Add Scene1 effect: raymarching cube+sphere+ground (reflections, shadows)
- Fix scene1.wgsl: binding 0→2, CommonUniforms→UniformsSequenceParams
- Replace Heptagon+Placeholder stub in heptagon_scene with Scene1
- Fix seq_compiler.py: emit seq.start_time+effect.start/end (absolute times)
so dispatch_render active check works correctly for all sequences
Bug: effects in sequences starting after t=0 were never active because
local times (e.g. 0-8) never satisfied params.time<end for absolute time 20+.
34/34 tests passing.
handoff(Gemini): seq_compiler now emits absolute effect times. All existing
sequences affected — verify visual output across the full timeline.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Adds audio intensity visualization for debugging audio-visual sync.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Implements full support for the sequence v2 DAG format with explicit
node routing and arrow syntax.
New features:
- timeline-format.js module for parsing/serializing v2 format
- NODE declarations with typed buffers (u8x4_norm, f32x4, etc.)
- Arrow syntax for effect routing: input1 input2 -> output1 output2
- Buffer chain visualization in properties panel and tooltips
- Node editor modal for adding/deleting node declarations
- Validation for undeclared node references (when NODEs explicit)
- Backward compatible with auto-inferred nodes
Files added:
- tools/timeline_editor/timeline-format.js (214 lines)
- tools/timeline_editor/test_format.html (automated tests)
- workspaces/test/timeline_v2_test.seq (test file with NODE declarations)
Files modified:
- tools/timeline_editor/index.html (~40 changes for v2 support)
All success criteria met. Round-trip tested with existing timelines.
handoff(Claude): Timeline editor now fully supports v2 format with
explicit node routing, NODE declarations, and buffer chain visualization.
Parser handles both explicit NODE declarations and auto-inferred nodes.
Validation only runs when explicit NODEs exist. Ready for production use.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Change draw call from 21 to 3 vertices (fullscreen triangle)
- Replace broken folding-based SDF with IQ's atan-based regular polygon formula
- Simplify test timeline to render Heptagon directly to sink
- Reduce heptagon radius from 0.5 to 0.3 for better visibility
The effect was not visible due to incorrect vertex count and broken SDF
returning negative values everywhere (showing only fill color).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Hybrid3D was calling Renderer3D::render() which creates its own command
encoder, bypassing the sequence system. Now uses renderer_.draw() with
the passed encoder.
Also adds texture blit support for RotatingCube compositing.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Fix shader struct to match C++ (add strength_audio, stretch)
- Increase default blur strength to 8.0 for visibility
- Add blur effect to test sequence for validation
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Prevents compilation errors when multiple sequences share the same name.
Compiler now appends _{index}_Sequence for unique class names.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Remove END_DEMO keyword from timeline format. Demo duration now
calculated from max effect end time across all sequences. Sort
sequences by start time at compile time for deterministic ordering.
Changes:
- seq_compiler.py: Auto-calculate duration, sort sequences
- seq_compiler.cc: Remove END_DEMO parsing, sort by start time
- workspaces/test/timeline.seq: Remove END_DEMO directive
- Generated timeline.cc: Duration now 40.0f (was hardcoded)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
|
|
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Ports PeakMeterEffect to v2 Effect system with proper DAG routing.
Red horizontal bar overlay displays audio_intensity for visual debugging
of audio-visual synchronization.
Changes:
- New: src/effects/peak_meter_effect.{h,cc} - v2 implementation
- Timeline: FlashEffect -> flash_out -> PeakMeterEffect -> sink
- Build: Added to COMMON_GPU_EFFECTS and demo_effects.h
- Test: Added to test_demo_effects.cc (9/9 effects pass)
- Cleanup: Removed old disabled PeakMeterEffect code from test_demo.cc
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
FlashEffect requires flash.wgsl shader in main workspace.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- FlashEffect: Beat-synchronized white flash using ShaderComposer
- Loads shader from assets (flash.wgsl) with sequence_uniforms include
- Uses pow(1.0 - beat_phase, 4.0) for sharp flash at beat start
- Updated test_demo.seq to use FlashEffect (was HeptagonEffect)
- Added FlashEffect to test suite (test_demo_effects.cc)
- Made cnn_test conditional on main workspace (fixes build error)
- Flash intensity: 1.0 at beat start, fades to 0.0 by beat end
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Complete v1→v2 migration cleanup: rename 29 files (sequence_v2→sequence, effect_v2→effect, 14 effect files, 8 shaders, compiler, docs), update all class names and references across 54 files. Archive v1 timeline. System now uses standard naming with all versioning removed. 30/34 tests passing.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Add Hybrid3DEffectV2 with Renderer3D integration
- Simplified scene (1 center cube + 8 surrounding objects)
- Use NodeRegistry for depth buffer
- Update timeline_v2.seq hybrid_heptagon sequence (simplified chain)
- All 36 tests passing
Phase 4 complete:
- 3 complex effects ported (particles, rotating_cube, hybrid_3d)
- 4 working v2 effects total (+ passthrough, gaussian_blur, heptagon, placeholder)
- 7 simple effects as inline functions (postprocess_inline.wgsl)
- V2 timeline integrated with build system
- All sequences functional with v2 effects
handoff(Claude): Phase 4 effect ports complete
|
|
- Add RotatingCubeEffectV2 with 3D rendering + depth buffer
- Create rotating_cube_v2.wgsl (hardcoded cube geometry)
- Simplified: no auxiliary mask texture dependency
- Declare depth node via NodeRegistry
- Update timeline_v2.seq rotating_cube sequence
- Add shader exports to shaders.{h,cc}
- All 36 tests passing
handoff(Claude): RotatingCube v2 complete, hybrid_3d next
|
|
- Add ParticlesEffectV2 with compute + render passes
- Create particle_compute_v2.wgsl and particle_render_v2.wgsl
- Use UniformsSequenceParams for beat-synchronized particles
- Update timeline_v2.seq particles sequence (simplified 2-effect chain)
- Add shader exports to shaders.{h,cc}
- All 36 tests passing
handoff(Claude): Particles v2 complete, rotating_cube next
|
|
- Update main workspace to use timeline_v2.seq
- Add SEQ_COMPILER_V2 using Python script (seq_compiler_v2.py)
- Update DemoCodegen to use v2 compiler for main timeline
- Add v1 compatibility stubs (LoadTimeline, GetDemoDuration)
- Demo builds and links successfully
- All tests passing (36/36)
V2 timeline now integrated into build pipeline. Stub functions allow
linking while proper MainSequence v2 integration is pending.
handoff(Claude): V2 timeline integrated, ready for effect ports
|
|
- Add PlaceholderEffectV2 for unported effects (logs TODO warning)
- Create timeline_v2.seq with 8 sequences using v2 syntax
- Explicit node routing (source -> temp1 -> temp2 -> sink)
- Uses: HeptagonEffectV2, GaussianBlurEffectV2, PlaceholderEffectV2
- Compiler generates valid C++ for all sequences
- All tests passing (36/36)
Timeline structure validated. Placeholders allow demo to run while
complex effects (rotating_cube, hybrid_3d, particles) await porting.
handoff(Claude): V2 timeline operational, ready for MainSequence integration
|
|
- Create postprocess_inline.wgsl with 7 inline effect functions
- Functions: vignette, flash, fade, theme, solarize, chroma_aberration, distort
- Add example combined_postprocess_v2.wgsl showing usage
- Register postprocess_inline snippet with ShaderComposer
- Add to main and test workspace assets
- All tests passing (36/36)
Strategy: Simple effects become inline functions instead of separate classes.
Complex effects (rotating_cube, hybrid_3d, particles) remain as TODO for v2 port.
handoff(Claude): Inline functions ready, 7 simple effects consolidated
|
|
- Create v2-compatible WGSL shaders with UniformsSequenceParams
- Add sequence_v2_uniforms snippet for ShaderComposer
- Port 3 effects: PassthroughEffectV2, GaussianBlurEffectV2, HeptagonEffectV2
- Enable and fix end-to-end test (test_sequence_v2_e2e)
- Fix shader binding order (sampler at 0, texture at 1)
- Fix WebGPU validation (maxAnisotropy=1, explicit depthSlice)
- Add v2 shaders to main and test workspace assets
- All tests passing (36/36)
handoff(Claude): Phase 3 complete, v2 effects functional, ready for phase 4
|
|
Renamed files and classes:
- cnn_effect.{h,cc} → cnn_v1_effect.{h,cc}
- CNNEffect → CNNv1Effect
- CNNEffectParams → CNNv1EffectParams
- CNNLayerParams → CNNv1LayerParams
- CNN_EFFECT.md → CNN_V1_EFFECT.md
Updated all references:
- C++ includes and class usage
- CMake source list
- Timeline (workspaces/main/timeline.seq)
- Test file (test_demo_effects.cc)
- Documentation (CLAUDE.md, PROJECT_CONTEXT.md, READMEs)
Tests: 34/34 passing (100%)
|
|
Consolidate CNN v1 (CNNEffect) into dedicated directory:
- C++ effect: src/effects → cnn_v1/src/
- Shaders: workspaces/main/shaders/cnn → cnn_v1/shaders/
- Training: training/train_cnn.py → cnn_v1/training/
- Docs: doc/CNN*.md → cnn_v1/docs/
Updated all references:
- CMake source list
- C++ includes (relative paths: ../../cnn_v1/src/)
- Asset paths (../../cnn_v1/shaders/)
- Documentation cross-references
CNN v1 remains active in timeline. For new work, use CNN v2 with
enhanced features (7D static, storage buffer, sigmoid activation).
Tests: 34/34 passing (100%)
|
|
Move all CNN v2 files to dedicated cnn_v2/ directory to prepare for CNN v3 development. Zero functional changes.
Structure:
- cnn_v2/src/ - C++ effect implementation
- cnn_v2/shaders/ - WGSL shaders (6 files)
- cnn_v2/weights/ - Binary weights (3 files)
- cnn_v2/training/ - Python training scripts (4 files)
- cnn_v2/scripts/ - Shell scripts (train_cnn_v2_full.sh)
- cnn_v2/tools/ - Validation tools (HTML)
- cnn_v2/docs/ - Documentation (4 markdown files)
Changes:
- Update CMake source list to cnn_v2/src/cnn_v2_effect.cc
- Update assets.txt with relative paths to cnn_v2/
- Update includes to ../../cnn_v2/src/cnn_v2_effect.h
- Add PROJECT_ROOT resolution to Python/shell scripts
- Update doc references in HOWTO.md, TODO.md
- Add cnn_v2/README.md
Verification: 34/34 tests passing, demo runs correctly.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
|
|
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>
|
|
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>
|
|
|