summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/seq_compiler.cc68
1 files changed, 63 insertions, 5 deletions
diff --git a/tools/seq_compiler.cc b/tools/seq_compiler.cc
index 87d6222..4a6b554 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,26 @@ 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)
@@ -824,13 +845,19 @@ 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 +913,40 @@ 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 {
+ // 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";