From b2ede3f0680edc894a54e28374cb87ab2690afa2 Mon Sep 17 00:00:00 2001 From: skal Date: Mon, 16 Feb 2026 14:32:59 +0100 Subject: refactor: remove v2 versioning artifacts, establish Sequence as canonical system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- doc/EFFECT_WORKFLOW.md | 68 +++++++------- doc/SEQUENCE.md | 221 ++++++++++++++++++++++++++++++++++++++++++++ doc/SEQUENCE_v2.md | 221 -------------------------------------------- doc/archive/timeline_v1.seq | 97 +++++++++++++++++++ 4 files changed, 352 insertions(+), 255 deletions(-) create mode 100644 doc/SEQUENCE.md delete mode 100644 doc/SEQUENCE_v2.md create mode 100644 doc/archive/timeline_v1.seq (limited to 'doc') diff --git a/doc/EFFECT_WORKFLOW.md b/doc/EFFECT_WORKFLOW.md index bdec2b6..c4010db 100644 --- a/doc/EFFECT_WORKFLOW.md +++ b/doc/EFFECT_WORKFLOW.md @@ -1,8 +1,8 @@ -# Effect Creation Workflow (v2) +# Effect Creation Workflow **Target Audience:** AI coding agents and developers -Checklist for adding visual effects using Sequence v2 system. +Checklist for adding visual effects. --- @@ -10,7 +10,7 @@ Checklist for adding visual effects using Sequence v2 system. **ShaderToy:** `tools/shadertoy/convert_shadertoy.py` then follow steps below **SDF/Raymarching:** See `doc/SDF_EFFECT_GUIDE.md` -**Custom v2 effects:** Follow all steps 1-6 +**Custom effects:** Follow all steps 1-6 --- @@ -18,18 +18,18 @@ Checklist for adding visual effects using Sequence v2 system. ### 1. Create Effect Files -**Files** (v2 naming): -- Header: `src/effects/_effect_v2.h` -- Implementation: `src/effects/_effect_v2.cc` -- Shader: `workspaces/main/shaders/_v2.wgsl` +**Files**: +- Header: `src/effects/_effect.h` +- Implementation: `src/effects/_effect.cc` +- Shader: `workspaces/main/shaders/.wgsl` -**Class name**: `EffectV2` (e.g., `TunnelEffectV2`) +**Class name**: `Effect` (e.g., `TunnelEffect`) -**Base class**: `EffectV2` (all effects) +**Base class**: `Effect` (all effects) **Constructor**: ```cpp -MyEffectV2(const GpuContext& ctx, +MyEffect(const GpuContext& ctx, const std::vector& inputs, const std::vector& outputs); ``` @@ -59,7 +59,7 @@ params.aspect_ratio; // width/height **File**: `workspaces/main/assets.txt` ``` -SHADER_, NONE, shaders/_v2.wgsl, "Description" +SHADER_, NONE, shaders/.wgsl, "Description" ``` Asset ID: `AssetId::ASSET_SHADER_` @@ -68,7 +68,7 @@ Asset ID: `AssetId::ASSET_SHADER_` **File**: `CMakeLists.txt` -Add `src/effects/_effect_v2.cc` to **BOTH** GPU_SOURCES sections: +Add `src/effects/_effect.cc` to **BOTH** GPU_SOURCES sections: - Headless mode (around line 141-167) - Normal mode (around line 171-197) @@ -77,16 +77,16 @@ Add `src/effects/_effect_v2.cc` to **BOTH** GPU_SOURCES sections: **File**: `src/gpu/demo_effects.h` ```cpp -#include "effects/_effect_v2.h" +#include "effects/_effect.h" ``` ### 5. Add to Timeline -**File**: `workspaces/main/timeline_v2.seq` +**File**: `workspaces/main/timeline.seq` ``` SEQUENCE "name" - EFFECT + MyEffectV2 source -> sink 0.0 4.0 + EFFECT + MyEffect source -> sink 0.0 4.0 ``` **Priority modifiers** (REQUIRED): `+` (increment), `=` (same), `-` (decrement) @@ -95,7 +95,7 @@ SEQUENCE "name" ```bash # Regenerate timeline.cc -python3 tools/seq_compiler_v2.py workspaces/main/timeline_v2.seq \ +python3 tools/seq_compiler.py workspaces/main/timeline.seq \ --output src/generated/timeline.cc # Build @@ -112,17 +112,17 @@ cmake --build build -j4 ### Standard Post-Process Effect ```cpp -// my_effect_v2.h +// my_effect.h #pragma once -#include "gpu/effect_v2.h" +#include "gpu/effect.h" #include "gpu/uniform_helper.h" -class MyEffectV2 : public EffectV2 { +class MyEffect : public Effect { public: - MyEffectV2(const GpuContext& ctx, + MyEffect(const GpuContext& ctx, const std::vector& inputs, const std::vector& outputs); - ~MyEffectV2() override; + ~MyEffect() override; void render(WGPUCommandEncoder encoder, const UniformsSequenceParams& params, @@ -136,27 +136,27 @@ class MyEffectV2 : public EffectV2 { ``` ```cpp -// my_effect_v2.cc -#include "effects/my_effect_v2.h" +// my_effect.cc +#include "effects/my_effect.h" #include "gpu/post_process_helper.h" #include "gpu/shaders.h" -MyEffectV2::MyEffectV2(const GpuContext& ctx, +MyEffect::MyEffect(const GpuContext& ctx, const std::vector& inputs, const std::vector& outputs) - : EffectV2(ctx, inputs, outputs), pipeline_(nullptr), bind_group_(nullptr) { + : Effect(ctx, inputs, outputs), pipeline_(nullptr), bind_group_(nullptr) { uniforms_buffer_.init(ctx_.device); pipeline_ = create_post_process_pipeline(ctx_.device, WGPUTextureFormat_RGBA8Unorm, - my_shader_v2_wgsl); + my_shader_wgsl); } -MyEffectV2::~MyEffectV2() { +MyEffect::~MyEffect() { if (bind_group_) wgpuBindGroupRelease(bind_group_); if (pipeline_) wgpuRenderPipelineRelease(pipeline_); } -void MyEffectV2::render(WGPUCommandEncoder encoder, +void MyEffect::render(WGPUCommandEncoder encoder, const UniformsSequenceParams& params, NodeRegistry& nodes) { WGPUTextureView input_view = nodes.get_view(input_nodes_[0]); @@ -193,11 +193,11 @@ void MyEffectV2::render(WGPUCommandEncoder encoder, ### 3D Effect with Depth ```cpp -class My3DEffectV2 : public EffectV2 { +class My3DEffect : public Effect { std::string depth_node_; - My3DEffectV2(const GpuContext& ctx, ...) - : EffectV2(ctx, inputs, outputs), + My3DEffect(const GpuContext& ctx, ...) + : Effect(ctx, inputs, outputs), depth_node_(outputs[0] + "_depth") {} void declare_nodes(NodeRegistry& registry) override { @@ -251,6 +251,6 @@ class My3DEffectV2 : public EffectV2 { ## See Also -- `doc/SEQUENCE_v2.md` - Timeline syntax and architecture -- `tools/seq_compiler_v2.py` - Compiler implementation -- `src/effects/*_v2.{h,cc}` - Example effects +- `doc/SEQUENCE.md` - Timeline syntax and architecture +- `tools/seq_compiler.py` - Compiler implementation +- `src/effects/*.{h,cc}` - Example effects diff --git a/doc/SEQUENCE.md b/doc/SEQUENCE.md new file mode 100644 index 0000000..76e19d4 --- /dev/null +++ b/doc/SEQUENCE.md @@ -0,0 +1,221 @@ +# Sequence: DAG-based Effect Routing + +**Status:** ✅ Operational + +Explicit node system with DAG effect routing. + +## Quick Start + +```bash +# Compile timeline +python3 tools/seq_compiler.py workspaces/main/timeline.seq --output src/generated/timeline.cc + +# Flatten mode (future: inline effects, no vtables) +python3 tools/seq_compiler.py timeline.seq --output timeline.cc --flatten +``` + +## Timeline Syntax + +``` +# BPM 120 (optional, currently ignored) + +SEQUENCE ["name"] + # Node declarations (optional, auto-inferred as u8x4_norm) + NODE temp1 u8x4_norm + NODE depth depth24 + NODE gbuf_normal f16x8 + + # Asset dependencies (validated at compile-time) + ASSET shader_blur + + # Effect routing with priority modifier + EFFECT <+|=|-> EffectClass input1 input2 -> output1 output2 start end [params] +``` + +**Priority modifiers** (REQUIRED): +- `+` : Increment priority (foreground) +- `=` : Same priority as previous +- `-` : Decrement priority (background) + +**Node types**: `u8x4_norm` (default), `f32x4`, `f16x8`, `depth24`, `compute_f32` + +**Reserved nodes**: `source` (input), `sink` (output) + +### Examples + +**Simple chain:** +``` +SEQUENCE 0.0 0 "basic" + EFFECT + HeptagonEffect source -> temp1 0.0 10.0 + EFFECT + GaussianBlur temp1 -> sink 0.0 10.0 +``` + +**Multi-output (G-buffer):** +``` +SEQUENCE 0.0 0 "deferred" + NODE gbuf_n f16x8 + NODE gbuf_p f32x4 + NODE depth depth24 + + EFFECT + DeferredRender source depth -> gbuf_n gbuf_p 0.0 10.0 + EFFECT + Compose gbuf_n gbuf_p -> sink 0.0 10.0 +``` + +**Ping-pong (auto-optimized):** +``` +SEQUENCE 0.0 0 "blur" + # Compiler detects alternating pattern, aliases temp2 -> temp1 + EFFECT + BlurH source -> temp1 0.0 10.0 + EFFECT + BlurV temp1 -> temp2 0.0 10.0 + EFFECT + Sharpen temp2 -> sink 0.0 10.0 +``` + +## Architecture + +### Sequence Class + +```cpp +class Sequence { + NodeRegistry nodes_; // Typed texture management + std::vector effect_dag_; // Topologically sorted + UniformsSequenceParams params_; // Per-frame uniforms + + virtual void preprocess(float time, float beat_time, float beat_phase, float audio_intensity); + virtual void render_effects(WGPUCommandEncoder encoder); +}; +``` + +### Effect Class + +```cpp +class Effect { + std::vector input_nodes_; + std::vector output_nodes_; + + virtual void declare_nodes(NodeRegistry& registry) {} // Optional temp nodes + virtual void render(WGPUCommandEncoder encoder, + const UniformsSequenceParams& params, + NodeRegistry& nodes) = 0; +}; +``` + +### Node System + +**Types**: Match WGSL texture formats +- `U8X4_NORM`: RGBA8Unorm (default for source/sink/intermediate) +- `F32X4`: RGBA32Float (HDR, compute outputs) +- `F16X8`: 8-channel float16 (G-buffer normals/vectors) +- `DEPTH24`: Depth24Plus (3D rendering) +- `COMPUTE_F32`: Storage buffer (non-texture compute data) + +**Aliasing**: Compiler detects ping-pong patterns (Effect i writes A reads B, Effect i+1 writes B reads A) and aliases nodes to same backing texture. + +## Compiler Features + +**seq_compiler.py** generates optimized C++ from `.seq`: + +1. **DAG Validation**: Cycle detection, connectivity checks +2. **Topological Sort**: Execution order from dependencies +3. **Ping-pong Detection**: Automatic node aliasing +4. **Code Generation**: Sequence subclasses with node declarations and effect DAG + +**Output**: Single `.cc` file with: +- Multiple `Sequence` subclasses (one per SEQUENCE) +- `InitializeSequences()` - Registry initialization +- `GetActiveSequence(float time)` - Active sequence lookup +- `RenderTimeline()` - Encoder-based and surface-based variants + +## Creating Effects + +**For standard post-process:** +```cpp +class MyEffect : public Effect { + WGPURenderPipeline pipeline_; + UniformBuffer uniforms_; + + MyEffect(const GpuContext& ctx, const std::vector& inputs, const std::vector& outputs); + const std::vector& outputs) + : Effect(ctx, inputs, outputs) { + uniforms_.init(ctx_.device); + pipeline_ = create_post_process_pipeline(ctx_.device, + WGPUTextureFormat_RGBA8Unorm, + my_shader_wgsl); + } + + void render(WGPUCommandEncoder encoder, const UniformsSequenceParams& params, + NodeRegistry& nodes) override { + WGPUTextureView input = nodes.get_view(input_nodes_[0]); + WGPUTextureView output = nodes.get_view(output_nodes_[0]); + uniforms_.update(ctx_.queue, params); + // ... render pass + } +}; +``` + +**For 3D effects with depth:** +```cpp +class My3DEffect : public Effect { + std::string depth_node_; + + My3DEffect(...) : Effect(...), depth_node_(outputs[0] + "_depth") {} + + void declare_nodes(NodeRegistry& registry) override { + registry.declare_node(depth_node_, NodeType::DEPTH24, -1, -1); + } + + void render(...) { + WGPUTextureView color = nodes.get_view(output_nodes_[0]); + WGPUTextureView depth = nodes.get_view(depth_node_); + // ... render pass with depth attachment + } +}; +``` + +## Uniform Access + +```cpp +params.time; // Physical seconds (constant speed) +params.beat_time; // Musical beats (tempo-scaled) +params.beat_phase; // Fractional beat 0.0-1.0 +params.audio_intensity; // Audio peak for beat sync +params.resolution; // vec2(width, height) +params.aspect_ratio; // width/height +``` + +## Status & Limitations + +**Implemented** ✅: +- DAG validation, topological sort, ping-pong optimization +- Multi-input/multi-output effects +- Node aliasing (compile-time optimization) +- 7 effects ported (Passthrough, Placeholder, GaussianBlur, Heptagon, Particles, RotatingCube, Hybrid3D) + +**Missing/Future** ❌: +- Flatten mode (--flatten generates same code as dev mode) +- BPM handling (parsed but ignored) +- GetDemoDuration() calculation (hardcoded 40.0f) +- Sequence-relative time (uses global time) +- Asset validation (not checked against AssetId enum) +- Node type compatibility checking + +**TODO**: +- Port remaining effects (10+ effects, CNN effects) +- Implement flatten mode (inline effects, direct members) +- Update HTML timeline editor for graph visualization + +## Migration Notes + +**Key Features**: +- V1: Implicit framebuffer ping-pong (framebuffer_a_ ↔ framebuffer_b_) +- Explicit node declarations with routing + +**Breaking Changes**: +- Effect base class standardized +- Constructor signature: `(GpuContext, inputs[], outputs[])` +- Render signature: Added `NodeRegistry& nodes` parameter +- No `is_post_process()` method (routing makes it explicit) + +**See Also**: +- `doc/EFFECT_WORKFLOW.md` - Step-by-step effect creation +- `tools/seq_compiler.py` - Compiler implementation +- `workspaces/main/timeline.seq` - Example timeline diff --git a/doc/SEQUENCE_v2.md b/doc/SEQUENCE_v2.md deleted file mode 100644 index 7ce6efc..0000000 --- a/doc/SEQUENCE_v2.md +++ /dev/null @@ -1,221 +0,0 @@ -# Sequence v2: DAG-based Effect Routing - -**Status:** ✅ Operational (Phase 4 complete, v1 removed) - -Explicit node system with DAG effect routing. Replaces v1 implicit framebuffer ping-pong. - -## Quick Start - -```bash -# Compile timeline -python3 tools/seq_compiler_v2.py workspaces/main/timeline_v2.seq --output src/generated/timeline.cc - -# Flatten mode (future: inline effects, no vtables) -python3 tools/seq_compiler_v2.py timeline.seq --output timeline.cc --flatten -``` - -## Timeline Syntax - -``` -# BPM 120 (optional, currently ignored) - -SEQUENCE ["name"] - # Node declarations (optional, auto-inferred as u8x4_norm) - NODE temp1 u8x4_norm - NODE depth depth24 - NODE gbuf_normal f16x8 - - # Asset dependencies (validated at compile-time) - ASSET shader_blur - - # Effect routing with priority modifier - EFFECT <+|=|-> EffectClass input1 input2 -> output1 output2 start end [params] -``` - -**Priority modifiers** (REQUIRED): -- `+` : Increment priority (foreground) -- `=` : Same priority as previous -- `-` : Decrement priority (background) - -**Node types**: `u8x4_norm` (default), `f32x4`, `f16x8`, `depth24`, `compute_f32` - -**Reserved nodes**: `source` (input), `sink` (output) - -### Examples - -**Simple chain:** -``` -SEQUENCE 0.0 0 "basic" - EFFECT + HeptagonEffect source -> temp1 0.0 10.0 - EFFECT + GaussianBlur temp1 -> sink 0.0 10.0 -``` - -**Multi-output (G-buffer):** -``` -SEQUENCE 0.0 0 "deferred" - NODE gbuf_n f16x8 - NODE gbuf_p f32x4 - NODE depth depth24 - - EFFECT + DeferredRender source depth -> gbuf_n gbuf_p 0.0 10.0 - EFFECT + Compose gbuf_n gbuf_p -> sink 0.0 10.0 -``` - -**Ping-pong (auto-optimized):** -``` -SEQUENCE 0.0 0 "blur" - # Compiler detects alternating pattern, aliases temp2 -> temp1 - EFFECT + BlurH source -> temp1 0.0 10.0 - EFFECT + BlurV temp1 -> temp2 0.0 10.0 - EFFECT + Sharpen temp2 -> sink 0.0 10.0 -``` - -## Architecture - -### SequenceV2 Class - -```cpp -class SequenceV2 { - NodeRegistry nodes_; // Typed texture management - std::vector effect_dag_; // Topologically sorted - UniformsSequenceParams params_; // Per-frame uniforms - - virtual void preprocess(float time, float beat_time, float beat_phase, float audio_intensity); - virtual void render_effects(WGPUCommandEncoder encoder); -}; -``` - -### EffectV2 Class - -```cpp -class EffectV2 { - std::vector input_nodes_; - std::vector output_nodes_; - - virtual void declare_nodes(NodeRegistry& registry) {} // Optional temp nodes - virtual void render(WGPUCommandEncoder encoder, - const UniformsSequenceParams& params, - NodeRegistry& nodes) = 0; -}; -``` - -### Node System - -**Types**: Match WGSL texture formats -- `U8X4_NORM`: RGBA8Unorm (default for source/sink/intermediate) -- `F32X4`: RGBA32Float (HDR, compute outputs) -- `F16X8`: 8-channel float16 (G-buffer normals/vectors) -- `DEPTH24`: Depth24Plus (3D rendering) -- `COMPUTE_F32`: Storage buffer (non-texture compute data) - -**Aliasing**: Compiler detects ping-pong patterns (Effect i writes A reads B, Effect i+1 writes B reads A) and aliases nodes to same backing texture. - -## Compiler Features - -**seq_compiler_v2.py** generates optimized C++ from `.seq`: - -1. **DAG Validation**: Cycle detection, connectivity checks -2. **Topological Sort**: Execution order from dependencies -3. **Ping-pong Detection**: Automatic node aliasing -4. **Code Generation**: SequenceV2 subclasses with node declarations and effect DAG - -**Output**: Single `.cc` file with: -- Multiple `SequenceV2` subclasses (one per SEQUENCE) -- `InitializeV2Sequences()` - Registry initialization -- `GetActiveV2Sequence(float time)` - Active sequence lookup -- `RenderV2Timeline()` - Encoder-based and surface-based variants - -## Creating Effects - -**For standard post-process:** -```cpp -class MyEffectV2 : public EffectV2 { - WGPURenderPipeline pipeline_; - UniformBuffer uniforms_; - - MyEffectV2(const GpuContext& ctx, const std::vector& inputs, - const std::vector& outputs) - : EffectV2(ctx, inputs, outputs) { - uniforms_.init(ctx_.device); - pipeline_ = create_post_process_pipeline(ctx_.device, - WGPUTextureFormat_RGBA8Unorm, - my_shader_wgsl); - } - - void render(WGPUCommandEncoder encoder, const UniformsSequenceParams& params, - NodeRegistry& nodes) override { - WGPUTextureView input = nodes.get_view(input_nodes_[0]); - WGPUTextureView output = nodes.get_view(output_nodes_[0]); - uniforms_.update(ctx_.queue, params); - // ... render pass - } -}; -``` - -**For 3D effects with depth:** -```cpp -class My3DEffectV2 : public EffectV2 { - std::string depth_node_; - - My3DEffectV2(...) : EffectV2(...), depth_node_(outputs[0] + "_depth") {} - - void declare_nodes(NodeRegistry& registry) override { - registry.declare_node(depth_node_, NodeType::DEPTH24, -1, -1); - } - - void render(...) { - WGPUTextureView color = nodes.get_view(output_nodes_[0]); - WGPUTextureView depth = nodes.get_view(depth_node_); - // ... render pass with depth attachment - } -}; -``` - -## Uniform Access - -```cpp -params.time; // Physical seconds (constant speed) -params.beat_time; // Musical beats (tempo-scaled) -params.beat_phase; // Fractional beat 0.0-1.0 -params.audio_intensity; // Audio peak for beat sync -params.resolution; // vec2(width, height) -params.aspect_ratio; // width/height -``` - -## Status & Limitations - -**Implemented** ✅: -- DAG validation, topological sort, ping-pong optimization -- Multi-input/multi-output effects -- Node aliasing (compile-time optimization) -- 7 effects ported (Passthrough, Placeholder, GaussianBlur, Heptagon, Particles, RotatingCube, Hybrid3D) - -**Missing/Future** ❌: -- Flatten mode (--flatten generates same code as dev mode) -- BPM handling (parsed but ignored) -- GetDemoDuration() calculation (hardcoded 40.0f) -- Sequence-relative time (uses global time) -- Asset validation (not checked against AssetId enum) -- Node type compatibility checking - -**TODO**: -- Port remaining effects (10+ effects, CNN effects) -- Implement flatten mode (inline effects, direct members) -- Update HTML timeline editor for v2 graph visualization - -## Migration Notes - -**V1 → V2 Differences**: -- V1: Implicit framebuffer ping-pong (framebuffer_a_ ↔ framebuffer_b_) -- V2: Explicit node declarations with routing - -**Breaking Changes**: -- Effect base class changed (Effect → EffectV2) -- Constructor signature: `(GpuContext, inputs[], outputs[])` -- Render signature: Added `NodeRegistry& nodes` parameter -- No `is_post_process()` method (routing makes it explicit) - -**See Also**: -- `doc/EFFECT_WORKFLOW.md` - Step-by-step effect creation -- `tools/seq_compiler_v2.py` - Compiler implementation -- `workspaces/main/timeline_v2.seq` - Example timeline diff --git a/doc/archive/timeline_v1.seq b/doc/archive/timeline_v1.seq new file mode 100644 index 0000000..b4663bb --- /dev/null +++ b/doc/archive/timeline_v1.seq @@ -0,0 +1,97 @@ +# Demo Timeline +# Generated by Timeline Editor +# BPM 90 + +SEQUENCE 0.00 0 + EFFECT - FlashCubeEffect 0.00 4.00 +# EFFECT + FlashEffect 0.00 2.00 color=1.0,0.5,0.5 decay=0.95 +# EFFECT + FadeEffect 2.00 4.00 +# EFFECT + SolarizeEffect 0.00 4.00 + EFFECT + VignetteEffect 0.00 4.00 radius=0.6 softness=0.1 + +SEQUENCE 4.00 0 "rotating cube" + EFFECT + CircleMaskEffect 0.00 4.00 0.50 + EFFECT + RotatingCubeEffect 0.00 4.00 + EFFECT + GaussianBlurEffect 1.00 4.00 strength=1.0 + +SEQUENCE 8.00 0 "Flash Cube" + EFFECT - FlashCubeEffect 0.00 4.02 + EFFECT + FlashEffect 0.00 0.40 + +SEQUENCE 12.00 1 "spray" + EFFECT + ParticleSprayEffect 0.00 2.00 + EFFECT + ParticlesEffect 2.00 4.00 + EFFECT = GaussianBlurEffect 0.00 4.00 strength=3.0 + +SEQUENCE 16.00 2 "Hybrid3D + CNN" + EFFECT + ThemeModulationEffect 0.00 4.00 + EFFECT + HeptagonEffect 0.00 4.00 + EFFECT + ParticleSprayEffect 0.00 2.00 + EFFECT = ParticlesEffect 2.00 4.00 + EFFECT + Hybrid3DEffect 0.00 4.00 + EFFECT + CNNv1Effect 0.00 4.00 layers=3 blend=.9 + +SEQUENCE 20.00 0 "CNN effect" + EFFECT + HeptagonEffect 0.00 8.00 + EFFECT + Scene1Effect 0.00 8.00 + EFFECT + CNNv1Effect 6.00 8.00 layers=3 blend=.5 + +SEQUENCE 28.00 0 "buggy" + EFFECT + HeptagonEffect 0.00 2.00 + EFFECT + FadeEffect 0.00 2.00 + +SEQUENCE 30.00 3 "Seq-8" + EFFECT + ThemeModulationEffect 0.00 10.00 + EFFECT = HeptagonEffect 0.00 10.00 + EFFECT + GaussianBlurEffect 0.00 10.00 strength=1.5 + EFFECT + ChromaAberrationEffect 0.00 10.00 offset=0.03 angle=0.785 + EFFECT + SolarizeEffect 0.00 10.00 + +SEQUENCE 40.00 2 + EFFECT - FlashCubeEffect 0.00 4.00 + EFFECT + HeptagonEffect 0.00 4.00 + EFFECT + ParticleSprayEffect 0.00 4.00 + +SEQUENCE 44.00 2 "Fade" + EFFECT - FlashCubeEffect 0.00 2.00 + EFFECT + FlashEffect 1.00 2.00 + +SEQUENCE 46.00 10 + EFFECT - FlashCubeEffect 0.00 3.00 + EFFECT + GaussianBlurEffect 0.00 3.00 + EFFECT + FlashEffect 0.00 3.00 + +SEQUENCE 49.00 1 + EFFECT + ThemeModulationEffect 0.00 8.00 + EFFECT + HeptagonEffect 0.00 8.00 + EFFECT + ParticleSprayEffect 0.00 8.00 + EFFECT + Hybrid3DEffect 0.00 8.00 + EFFECT + GaussianBlurEffect 0.00 8.00 + EFFECT + ChromaAberrationEffect 0.00 8.00 + +SEQUENCE 57.00 0 + EFFECT + ThemeModulationEffect 0.00 7.00 + EFFECT + VignetteEffect 0.00 7.00 radius=0.6 softness=0.3 + EFFECT + SolarizeEffect 0.00 7.00 + +SEQUENCE 64.00 0 + EFFECT + ThemeModulationEffect 0.00 4.00 + EFFECT + HeptagonEffect 0.00 4.00 + EFFECT + GaussianBlurEffect 0.00 4.00 + EFFECT + SolarizeEffect 0.00 4.00 + +SEQUENCE 68.00 0 "double hepta!" + EFFECT + ThemeModulationEffect 0.00 4.00 + EFFECT = HeptagonEffect 0.00 4.00 + EFFECT + Hybrid3DEffect 0.00 4.00 + EFFECT + ParticleSprayEffect 0.00 4.00 + EFFECT + HeptagonEffect 0.00 4.00 + EFFECT + ChromaAberrationEffect 0.00 4.00 + EFFECT + GaussianBlurEffect 0.00 4.00 + +SEQUENCE 72.00 0 "The End" + EFFECT + ThemeModulationEffect 0.00 7.00 + EFFECT + HeptagonEffect 0.00 7.00 + EFFECT + ChromaAberrationEffect 0.00 7.00 + EFFECT + GaussianBlurEffect 0.00 7.00 + -- cgit v1.2.3