From af5d0e4c3a6cb773a4fb51ac32f4c33a7f8d8224 Mon Sep 17 00:00:00 2001 From: skal Date: Mon, 16 Feb 2026 11:54:46 +0100 Subject: feat(sequence): complete v2 migration with DAG-based routing Phase 4 complete: V1 system removed, v2 fully operational. Architecture Changes: - Explicit Node system with typed buffers (u8x4_norm, f32x4, depth24) - DAG effect routing with multi-input/multi-output support - Python compiler (seq_compiler_v2.py) with topological sort and ping-pong optimization - Compile-time node aliasing for framebuffer reuse V1 Removal (~4KB): - Deleted effect.h/cc base classes (1.4KB) - Deleted 19 v1 effect pairs: heptagon, particles, passthrough, gaussian_blur, solarize, scene1, chroma_aberration, vignette, hybrid_3d, flash_cube, theme_modulation, fade, flash, circle_mask, rotating_cube, sdf_test, distort, moving_ellipse, particle_spray (2.7KB) V2 Effects Ported: - PassthroughEffectV2, PlaceholderEffectV2 - GaussianBlurEffectV2 (multi-pass with temp nodes) - HeptagonEffectV2 (scene effect with dummy texture) - ParticlesEffectV2 (compute + render, format fixed) - RotatingCubeEffectV2 (3D with depth node) - Hybrid3DEffectV2 (Renderer3D integration, dummy textures for noise/sky) Compiler Features: - DAG validation (cycle detection, connectivity checks) - Topological sort for execution order - Ping-pong optimization (aliased node detection) - Surface-based and encoder-based RenderV2Timeline generation - init_effect_nodes() automatic generation Fixes Applied: - WebGPU binding layout validation (standard v2 post-process layout) - Surface format mismatch (ctx.format for blit, RGBA8Unorm for framebuffers) - Depth attachment compatibility (removed forced depth from gpu_create_render_pass) - Renderer3D texture initialization (created dummy 1x1 white textures) - ParticlesEffectV2 format (changed from ctx.format to RGBA8Unorm) - Encoder-based RenderV2Timeline (added missing preprocess() call) Testing: - 34/36 tests passing (2 v1-dependent tests disabled) - demo64k runs successfully (no crashes) - All seek positions work (--seek 12, --seek 15 validated) Documentation: - Updated PROJECT_CONTEXT.md (v2 status, reference to SEQUENCE_v2.md) - Added completion entry to COMPLETED.md TODO (Future): - Port CNN effects to v2 - Implement flatten mode (--flatten code generation) - Port remaining 10+ effects - Update HTML timeline editor for v2 (deferred) handoff(Claude): Sequence v2 migration complete, v1 removed, system operational. Phase 5 (editor) deferred per user preference. Co-Authored-By: Claude Sonnet 4.5 --- src/effects/flash_cube_effect.cc | 104 --------------------------------------- 1 file changed, 104 deletions(-) delete mode 100644 src/effects/flash_cube_effect.cc (limited to 'src/effects/flash_cube_effect.cc') diff --git a/src/effects/flash_cube_effect.cc b/src/effects/flash_cube_effect.cc deleted file mode 100644 index c578776..0000000 --- a/src/effects/flash_cube_effect.cc +++ /dev/null @@ -1,104 +0,0 @@ -// This file is part of the 64k demo project. -// It implements the FlashCubeEffect - a flashing background cube with Perlin -// noise. - -#include "effects/flash_cube_effect.h" -#include "generated/assets.h" -#include "util/asset_manager_utils.h" -#include -#include - -FlashCubeEffect::FlashCubeEffect(const GpuContext& ctx) : Effect(ctx) { -} - -void FlashCubeEffect::resize(int width, int height) { - if (width == width_ && height == height_) - return; - - Effect::resize(width, height); - - if (!initialized_) - return; - - renderer_.resize(width_, height_); -} - -void FlashCubeEffect::init(MainSequence* demo) { - (void)demo; - WGPUTextureFormat format = demo->gpu_ctx.format; - - renderer_.init(ctx_.device, ctx_.queue, ctx_.format); - renderer_.resize(width_, height_); - initialized_ = true; - - // Texture Manager - texture_manager_.init(ctx_.device, ctx_.queue); - - // Load Perlin noise texture - TextureAsset noise_tex = GetTextureAsset(AssetId::ASSET_NOISE_TEX); - if (noise_tex.pixels && noise_tex.width == 256 && noise_tex.height == 256) { - texture_manager_.create_texture("noise", noise_tex.width, noise_tex.height, - noise_tex.pixels); - renderer_.set_noise_texture(texture_manager_.get_texture_view("noise")); - } else { - std::cerr << "Failed to load NOISE_TEX asset for FlashCubeEffect." - << std::endl; - } - - // Create a very large background cube - // Scale and distance ensure it's clearly behind foreground objects - scene_.clear(); - Object3D cube(ObjectType::BOX); - cube.position = vec3(0, 0, 0); - cube.scale = vec3(30.0f, 30.0f, 30.0f); // Much larger cube - cube.color = vec4(0.3f, 0.3f, 0.5f, 1.0f); // Dark blue base color - scene_.add_object(cube); -} - -void FlashCubeEffect::render(WGPURenderPassEncoder pass, - const CommonPostProcessUniforms& uniforms) { - // Detect beat changes for flash trigger (using intensity as proxy for beat - // hits) Intensity spikes on beats, so we can use it to trigger flashes - if (uniforms.audio_intensity > 0.5f && - flash_intensity_ < 0.2f) { // High intensity + flash cooled down - flash_intensity_ = 1.0f; // Trigger full flash - } - - // Exponential decay of flash - flash_intensity_ *= 0.95f; // Slower fade for more visible effect - - // Always have base brightness, add flash on top - float base_brightness = 0.2f; - float flash_boost = - base_brightness + flash_intensity_ * 0.8f; // 0.2 to 1.0 range - - scene_.objects[0].color = - vec4(0.4f * flash_boost, // Reddish tint - 0.6f * flash_boost, // More green - 1.0f * flash_boost, // Strong blue for background feel - 1.0f); - - // Slowly rotate the cube for visual interest - scene_.objects[0].rotation = - quat::from_axis(vec3(0.3f, 1, 0.2f), uniforms.time * 0.04f); - - // Position camera OUTSIDE the cube looking at it from a distance - // This way we see the cube as a background element - float cam_distance = 150.0f; // Much farther to ensure it's behind everything - float orbit_angle = uniforms.time * 0.1f; - - camera_.set_look_at( - vec3(std::sin(orbit_angle) * cam_distance, - std::cos(orbit_angle * 0.3f) * 30.0f, - std::cos(orbit_angle) * cam_distance), // Camera orbits around - vec3(0, 0, 0), // Look at cube center - vec3(0, 1, 0)); - - camera_.aspect_ratio = uniforms.aspect_ratio; - // Extend far plane to accommodate distant camera position (150 units + cube - // size) - camera_.far_plane = 300.0f; - - // Draw the cube - renderer_.draw(pass, scene_, camera_, uniforms.time); -} -- cgit v1.2.3