diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-10 12:48:43 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-10 12:48:43 +0100 |
| commit | 6944733a6a2f05c18e7e0b73f847a4c9144801fd (patch) | |
| tree | 10713cd41a0e038a016a2e6b357471690f232834 /tools/seq_compiler.cc | |
| parent | cc9cbeb75353181193e3afb880dc890aa8bf8985 (diff) | |
feat: Add multi-layer CNN support with framebuffer capture and blend control
Implements automatic layer chaining and generic framebuffer capture API for
multi-layer neural network effects with proper original input preservation.
Key changes:
- Effect::needs_framebuffer_capture() - generic API for pre-render capture
- MainSequence: auto-capture to "captured_frame" auxiliary texture
- CNNEffect: multi-layer support via layer_index/total_layers params
- seq_compiler: expands "layers=N" to N chained effect instances
- Shader: @binding(4) original_input available to all layers
- Training: generates layer switches and original input binding
- Blend: mix(original, result, blend_amount) uses layer 0 input
Timeline syntax: CNNEffect layers=3 blend=0.7
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Diffstat (limited to 'tools/seq_compiler.cc')
| -rw-r--r-- | tools/seq_compiler.cc | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/tools/seq_compiler.cc b/tools/seq_compiler.cc index 4a671f4..fad2d88 100644 --- a/tools/seq_compiler.cc +++ b/tools/seq_compiler.cc @@ -995,6 +995,38 @@ int main(int argc, char* argv[]) { << eff.class_name << ">(ctx, p), " << eff.start << "f, " << eff.end << "f, " << eff.priority << ");\n"; out_file << " }\n"; + } else if (!eff.params.empty() && eff.class_name == "CNNEffect") { + // Generate parameter struct initialization for CNNEffect + // If layers>1, expand into multiple chained effect instances + int num_layers = 1; + float blend_amount = 1.0f; + + for (const auto& [key, value] : eff.params) { + if (key == "layers") { + num_layers = std::stoi(value); + } else if (key == "blend") { + blend_amount = std::stof(value); + } + } + + // Generate one effect per layer + for (int layer = 0; layer < num_layers; ++layer) { + out_file << " {\n"; + out_file << " CNNEffectParams p;\n"; + out_file << " p.layer_index = " << layer << ";\n"; + out_file << " p.total_layers = " << num_layers << ";\n"; + // Only apply blend_amount on the last layer + if (layer == num_layers - 1) { + out_file << " p.blend_amount = " << blend_amount << "f;\n"; + } else { + out_file << " p.blend_amount = 1.0f;\n"; + } + out_file << " seq->add_effect(std::make_shared<" + << eff.class_name << ">(ctx, p), " << eff.start << "f, " + << eff.end << "f, " << (std::stoi(eff.priority) + layer) + << ");\n"; + out_file << " }\n"; + } } else { // No parameters or unsupported effect - use default constructor out_file << " seq->add_effect(std::make_shared<" << eff.class_name |
