diff options
Diffstat (limited to 'tools/seq_compiler.cc')
| -rw-r--r-- | tools/seq_compiler.cc | 129 |
1 files changed, 121 insertions, 8 deletions
diff --git a/tools/seq_compiler.cc b/tools/seq_compiler.cc index 87d6222..0a17005 100644 --- a/tools/seq_compiler.cc +++ b/tools/seq_compiler.cc @@ -18,6 +18,7 @@ struct EffectEntry { std::string end; std::string priority; std::string extra_args; + std::vector<std::pair<std::string, std::string>> params; // key=value pairs }; struct SequenceEntry { @@ -36,6 +37,27 @@ std::string trim(const std::string& str) { return str.substr(first, (last - first + 1)); } +// Parse key=value parameters from extra_args string +// Example: "color=1.0,0.0,0.0 decay=0.95" -> {{"color", "1.0,0.0,0.0"}, +// {"decay", "0.95"}} +std::vector<std::pair<std::string, std::string>> +parse_parameters(const std::string& args) { + std::vector<std::pair<std::string, std::string>> params; + std::istringstream ss(args); + std::string token; + + while (ss >> token) { + size_t eq_pos = token.find('='); + if (eq_pos != std::string::npos) { + std::string key = token.substr(0, eq_pos); + std::string value = token.substr(eq_pos + 1); + params.push_back({key, value}); + } + } + + return params; +} + // Calculate adaptive tick interval based on timeline duration int calculate_tick_interval(float max_time) { if (max_time <= 5) @@ -146,8 +168,8 @@ void analyze_effect_depth(const std::vector<SequenceEntry>& sequences, std::cout << "Sample rate: " << sample_rate << " Hz (every " << dt << "s)\n"; std::cout << "\n"; - std::cout << "Max concurrent effects: " << max_depth << " at t=" << max_depth_time - << "s\n"; + std::cout << "Max concurrent effects: " << max_depth + << " at t=" << max_depth_time << "s\n"; std::cout << "\n"; // Print histogram @@ -179,7 +201,8 @@ void analyze_effect_depth(const std::vector<SequenceEntry>& sequences, // Print bottleneck warnings if (max_depth > 5) { std::cout << "\n⚠ WARNING: Performance bottlenecks detected!\n"; - std::cout << "Found " << peaks.size() << " time periods with >5 effects:\n\n"; + std::cout << "Found " << peaks.size() + << " time periods with >5 effects:\n\n"; int peak_count = 0; for (const auto& peak : peaks) { @@ -824,13 +847,20 @@ int main(int argc, char* argv[]) { // Remove leading/trailing whitespace rest_of_line = trim(rest_of_line); + // Parse parameters from rest of line + std::vector<std::pair<std::string, std::string>> params; std::string extra_args = ""; if (!rest_of_line.empty()) { - extra_args = ", " + rest_of_line; + params = parse_parameters(rest_of_line); + // Keep extra_args for backward compatibility (if no key=value pairs + // found) + if (params.empty()) { + extra_args = ", " + rest_of_line; + } } current_seq->effects.push_back( - {class_name, start_time, end_time, priority, extra_args}); + {class_name, start_time, end_time, priority, extra_args, params}); } else { std::cerr << "Error line " << line_num << ": Unknown command '" << command << "'\n"; @@ -886,9 +916,92 @@ int main(int argc, char* argv[]) { out_file << " seq->set_end_time(" << seq.end_time << "f);\n"; } for (const EffectEntry& eff : seq.effects) { - out_file << " seq->add_effect(std::make_shared<" << eff.class_name - << ">(ctx" << eff.extra_args << "), " << eff.start << "f, " - << eff.end << "f, " << eff.priority << ");\n"; + // Check if effect has parameters + if (!eff.params.empty() && eff.class_name == "FlashEffect") { + // Generate parameter struct initialization for FlashEffect + out_file << " {\n"; + out_file << " FlashEffectParams p;\n"; + + for (const auto& [key, value] : eff.params) { + if (key == "color") { + // Parse color as r,g,b + std::istringstream color_ss(value); + std::string r, g, b; + std::getline(color_ss, r, ','); + std::getline(color_ss, g, ','); + std::getline(color_ss, b, ','); + out_file << " p.color[0] = " << r << "f;\n"; + out_file << " p.color[1] = " << g << "f;\n"; + out_file << " p.color[2] = " << b << "f;\n"; + } else if (key == "decay") { + out_file << " p.decay_rate = " << value << "f;\n"; + } else if (key == "threshold") { + out_file << " p.trigger_threshold = " << value << "f;\n"; + } + } + + out_file << " seq->add_effect(std::make_shared<" + << 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 == "ChromaAberrationEffect") { + // Generate parameter struct initialization for ChromaAberrationEffect + out_file << " {\n"; + out_file << " ChromaAberrationParams p;\n"; + + for (const auto& [key, value] : eff.params) { + if (key == "offset") { + out_file << " p.offset_scale = " << value << "f;\n"; + } else if (key == "angle") { + out_file << " p.angle = " << value << "f;\n"; + } + } + + out_file << " seq->add_effect(std::make_shared<" + << 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 == "GaussianBlurEffect") { + // Generate parameter struct initialization for GaussianBlurEffect + out_file << " {\n"; + out_file << " GaussianBlurParams p;\n"; + + for (const auto& [key, value] : eff.params) { + if (key == "strength") { + out_file << " p.strength = " << value << "f;\n"; + } + } + + out_file << " seq->add_effect(std::make_shared<" + << 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 == "VignetteEffect") { + // Generate parameter struct initialization for VignetteEffect + out_file << " {\n"; + out_file << " VignetteParams p;\n"; + + for (const auto& [key, value] : eff.params) { + if (key == "radius") { + out_file << " p.radius = " << value << "f;\n"; + } else if (key == "softness") { + out_file << " p.softness = " << value << "f;\n"; + } + } + + out_file << " seq->add_effect(std::make_shared<" + << eff.class_name << ">(ctx, p), " << eff.start << "f, " + << eff.end << "f, " << eff.priority << ");\n"; + out_file << " }\n"; + } else { + // No parameters or unsupported effect - use default constructor + out_file << " seq->add_effect(std::make_shared<" << eff.class_name + << ">(ctx" << eff.extra_args << "), " << eff.start << "f, " + << eff.end << "f, " << eff.priority << ");\n"; + } } out_file << " main_seq.add_sequence(seq, " << seq.start_time << "f, " << seq.priority << ");\n"; |
