summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-03-05remove old .trackskal
2026-03-05add training photosskal
2026-03-05music = one big drum sample (for now!)skal
2026-03-05feat(tracker): add /* */ block comment support to .track parserskal
handoff(Gemini): tracker_compiler now handles single-line and multi-line block comments. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-03test(assets): add MP3 asset type test (TEST_MP3/ASSET_TEST_MP3)skal
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>
2026-03-03chore(audio): regenerate .spec files as v2 (OLA, Hann, hop=256)skal
handoff(Gemini): all .spec files rebuilt with v2 encoder; click-free OLA synthesis active.
2026-03-03feat(assets): replace is_procedural/is_gpu_procedural bools with AssetType ↵skal
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.
2026-03-03fix(build): add spectool to DEMO_BUILD_TOOLS cmake targetskal
spectool was missing from DemoTools.cmake; scripts/gen_spectrograms.sh could not find build/spectool. Document the regeneration workflow in HOWTO.md. handoff(Claude): spectool now builds with -DDEMO_BUILD_TOOLS=ON
2026-03-02docs: update PROJECT_CONTEXT, TODO, COMPLETED for OLA-IDCTskal
- PROJECT_CONTEXT: audio section reflects OLA-IDCT (Hann, 50% overlap); test count 35->34; Next Up notes .spec regen needed - TODO: remove stale MP3 sub-task (done), trim test TODOs, add .spec regen as Priority 3, update test count to 34/34 - COMPLETED: archive OLA-IDCT task with implementation summary
2026-03-02feat(audio): OLA-IDCT synthesis with Hann window to eliminate clicksskal
Add v2 spectrogram format (SPEC_VERSION_V2_OLA) using overlap-add IDCT with 50% overlap (hop=256, OLA_OVERLAP=256) and Hann windowing. - dct.h: OLA_HOP_SIZE=256, OLA_OVERLAP=256 - synth.h: SPEC_VERSION_V1/V2_OLA constants; version field on Spectrogram - window.h/cc: hann_window_512() alongside existing hamming_window_512() - synth.cc: g_hann[] precomputed at init; OLA path in synth_render when ola_mode=true (IDCT -> Hann -> add overlap tail -> save new tail -> output OLA_HOP_SIZE samples); v1 path unchanged for backward compat - tracker.cc: MP3 encoder now uses sliding 512-sample Hann window with OLA_HOP_SIZE advance per frame; sets version=SPEC_VERSION_V2_OLA; .spec files propagate header->version; generated notes stay v1 Existing .spec files must be regenerated to benefit from click-free OLA. handoff(Claude): OLA done. .spec files need regen via MP3 tool to activate v2.
2026-03-02add mp3 assetskal
2026-03-02feat(audio): MP3 asset support in tracker via decode-at-initskal
Detect MP3 blobs by magic bytes in tracker_init(), decode to spectrogram (hamming window + FDCT) using new mp3_decode(), and register with synth exactly like .spec assets. STRIP_ALL builds guard with FATAL_CHECK. handoff(Gemini): MP3 assets now usable in music.track with SAMPLE ASSET_* syntax; see doc/TRACKER.md for usage. No synth/compiler/packer changes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-01feat(audio): add experimental MP3 on-demand range decoderskal
Adds mp3_open/mp3_decode_range/mp3_close API backed by miniaudio ma_decoder for in-memory MP3 assets. Guarded by #if !defined(STRIP_ALL); any use in stripped builds is a compile error. No new dependencies: drmp3 is already compiled via MINIAUDIO_IMPLEMENTATION in audio.cc. handoff(Gemini): mp3_sample.{h,cc} in AUDIO_SOURCES. Usage: Mp3Decoder* d = mp3_open(GetAsset(id, &sz), sz); mp3_decode_range(d, start_frame, num_frames, pcm_out); mp3_close(d); Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28fix(shadertoy): update convert_shadertoy.py shader output path to src/effects/skal
Shader output and Next Steps instructions now use src/effects/<name>.wgsl instead of workspaces/main/shaders/<name>.wgsl. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28refactor(effects): co-locate effect WGSL shaders with their .h/.cc in ↵skal
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>
2026-02-28fix(scene2): rewrite broken WGSL shader to fix test_demo_effects crashskal
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>
2026-02-28fix Scene2 -> Scene2Effectskal
2026-02-28feat(tools/shadertoy): add --dry-run flag to skip file writingskal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28fix(tools/shadertoy): fix Next Steps instructions and update EFFECT_WORKFLOW.mdskal
- 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>
2026-02-28fix(tools/shadertoy): sync templates and script to current codebase conventionsskal
- template.h/cc: new Effect constructor/render signatures, RAII wrappers, HEADLESS_RETURN_IF_NULL, #pragma once - template.wgsl: sequence_uniforms + render/fullscreen_uv_vs includes, UniformsSequenceParams at binding 2, VertexOutput in fs_main - convert_shadertoy.py: paths src/effects/ + src/shaders/, new Effect pattern (create_post_process_pipeline, pp_update_bind_group), correct field names (beat_time/beat_phase), updated next-steps instructions - README.md: streamlined to quick-ref; accurate GLSL→WGSL table and uniforms Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28fix(shader_editor): sync CommonUniforms to current struct, fix layoutskal
- Update CommonUniforms: remove _pad0/_pad1, add beat_time/beat_phase, move _pad to end (matches src/shaders/common_uniforms.wgsl) - Fix JS uniform write order to match new layout - Fix flex-direction: row override (common.css forced column, hiding editor) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28refactor: move common/shaders/ to src/shaders/skal
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>
2026-02-28remove unused util/math.hskal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28misc: cleanup comments and formatting in headersskal
- asset_manager_dcl.h: clarify purpose vs asset_manager.h - camera_params.h: broaden description to include 3D rendering - sdf_cpu.h: simplify calc_normal formatting - platform.h: add missing newline at EOF Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28refactor(gpu): move RenderPipelineBuilder impl to pipeline_builder.ccskal
Keeps .h as declarations only; moves all method bodies to .cc. Adds pipeline_builder.cc to COMMON_GPU_EFFECTS in DemoSourceLists.cmake. handoff(Claude): pipeline_builder split to .h/.cc, builds clean.
2026-02-28refactor(gpu): move SamplerCache impl to .cc, expose single entry pointskal
get_or_create() and clear() moved out of the header-only class. SamplerSpec and presets remain inline (trivial, no deps). handoff(Gemini): sampler_cache split into .h/.cc, sampler_cache.cc added to COMMON_GPU_EFFECTS. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28remove SDFEffect base class and sdf_test, update SDF_EFFECT_GUIDEskal
- 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
2026-02-28remove vestigial demo_effects.ccskal
handoff(Gemini): deleted src/gpu/demo_effects.cc (empty stub), removed from headless GPU_SOURCES in DemoSourceLists.cmake, dropped stale #include from post_process_helper.cc. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28replace wgsl type: vec4<f32> -> vec4f ..skal
2026-02-28fix: double-free of external views in NodeRegistry and PASSTHROUGH shader testskal
- NodeRegistry: skip external nodes (texture==nullptr) in ~NodeRegistry() and resize() to avoid double-releasing views set via set_external_view() - test_shader_assets: update PASSTHROUGH check to match #include pattern handoff(Claude): 35/35 tests passing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28fix(shaders): deduplicate VertexOutput/vs_main via render/fullscreen_uv_vs ↵skal
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>
2026-02-27remove old files, add new training setskal
2026-02-23docs(build): add WSL (Windows 10) build support and documentationskal
- build_win.sh: platform-aware MinGW DLL search (macOS Homebrew vs Linux apt paths) - HOWTO.md: new WSL section covering native Linux build and Windows cross-compile - PROJECT_CONTEXT.md: note WSL support in Build status handoff(Gemini): WSL native + cross-compile build support added. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-21docs: Update WGSL files to use shorter vector and matrix type aliasesskal
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.
2026-02-21test: fix test_effect_base intermittent crashes and SIGTRAPskal
- Fix stack-use-after-scope dangling reference by storing mutable GpuContext in WebGPUTestFixture. - Fix wgpuDevicePoll causing SIGTRAP and replace with target.read_pixels() to block for GPU teardown safely. - Fix WGPUCommandEncoder leak.
2026-02-21refactor(wgsl): Use vec*f alias for vector typesskal
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.
2026-02-21fix(tests): Resolve intermittent SIGTRAP in test_effect_baseskal
The test `test_sequence_render` was disabled due to an intermittent SIGTRAP. The issue was caused by the test application exiting before the GPU finished rendering. This commit fixes the issue by adding a call to `wgpuDeviceTick()` after submitting the command buffer. This ensures that the GPU has completed its work before the test finishes. The test is now re-enabled and passes consistently.
2026-02-21split raymarching.wgsl in two: with id, or without id.skal
2026-02-21refactor(wgsl): Factorize getScreenCoord helperskal
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.
2026-02-21docs: Proposal for scene1.wgsl SDF helper integrationskal
2026-02-21docs: Update test count in PROJECT_CONTEXT.md to 35/35.skal
This commit resolves an inconsistency in the documentation by updating the test count in to match the 35/35 passing tests reported in .
2026-02-21feat(math): Add vec3::rotate methods for quaternion and axis-angle rotationskal
Adds two convenient methods to the struct: - : Rotates the vector by a given quaternion. - : Rotates the vector around a given axis by an angle in radians. These functions provide a more intuitive and streamlined syntax for vector rotation, improving code readability and usability.
2026-02-21feat: Add vec3::rotate function for quaternion rotation.skal
2026-02-21refine scene1 shaderskal
2026-02-20fix(scene1): refactor render0/render1 to accept Ray structskal
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>
2026-02-20feat(scene1): replace ad-hoc camera with CameraParams uniformskal
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>
2026-02-20feat(sequence): port Scene1Effect + fix seq_compiler absolute time bugskal
- 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>
2026-02-19update tools mq-editor TODOskal
2026-02-19fix(mq_editor): offset playhead to partial t_start when playing single ↵skal
partial (key 3) handoff(Claude): playhead offset fix for single partial playback
2026-02-19fix(mq_editor): remove duplicate mode toggle, add SINE badge, fix ↵skal
mini-spectrum invalidation - Remove redundant synthModeToggle from _updatePropPanel + index.html - Add SINE badge (grey) to panel title, matching existing RES badge (blue) - Invalidate mini-spectrum (viewer.render) on sinusoid/resonator switch handoff(Claude): mq_editor partial panel polish