31 if(!f.open(QIODevice::ReadOnly))
36 auto [_, desc] = isf::parser::parse_isf_header(score::readFileAsString(f));
37 if(desc.credits.starts_with(
"Automatically converted from "))
38 desc.credits = desc.credits.substr(strlen(
"Automatically converted from "));
39 else if(desc.credits.starts_with(
"by "))
40 desc.credits = desc.credits.substr(strlen(
"by "));
41 if(!desc.credits.empty())
42 base.author = QString::fromStdString(desc.credits);
43 if(!desc.description.empty())
44 base.description = QString::fromStdString(desc.description);
45 for(
auto& cat : desc.categories)
46 base.tags.push_back(QString::fromStdString(cat));
56 static void setupISFModelPorts(
57 T& self,
const isf::descriptor& desc,
58 const ossia::flat_map<QString, ossia::value>& previous_values)
78 const ossia::flat_map<QString, ossia::value>& previous_values;
79 const isf::input& input;
85 auto nm = QString::fromStdString(input.name);
89 self.m_inlets.push_back(port);
90 if(
auto it = previous_values.find(nm);
91 it != previous_values.end()
92 && it->second.get_type() == ossia::val_type::FLOAT)
93 port->setValue(it->second);
95 self.controlAdded(port->id());
101 auto nm = QString::fromStdString(input.name);
104 if(v.values.empty() && v.min && v.max)
109 if(
auto it = previous_values.find(nm);
110 it != previous_values.end()
111 && it->second.get_type() == port->value().get_type())
112 port->setValue(it->second);
114 self.m_inlets.push_back(port);
115 self.controlAdded(port->id());
120 std::vector<std::pair<QString, ossia::value>> alternatives;
121 if(v.labels.size() == v.values.size())
123 for(std::size_t value_idx = 0; value_idx < v.values.size(); value_idx++)
125 auto& val = v.values[value_idx];
126 if(
auto int_ptr = ossia::get_if<int64_t>(&val))
128 alternatives.emplace_back(
129 QString::fromStdString(v.labels[value_idx]), int(*int_ptr));
131 else if(
auto dbl_ptr = ossia::get_if<double>(&val))
133 alternatives.emplace_back(
134 QString::fromStdString(v.labels[value_idx]), int(*dbl_ptr));
138 alternatives.emplace_back(
139 QString::fromStdString(v.labels[value_idx]), int(value_idx));
145 for(std::size_t value_idx = 0; value_idx < v.values.size(); value_idx++)
147 auto& val = v.values[value_idx];
148 if(
auto int_ptr = ossia::get_if<int64_t>(&val))
150 alternatives.emplace_back(QString::number(*int_ptr), int(*int_ptr));
152 else if(
auto dbl_ptr = ossia::get_if<double>(&val))
154 alternatives.emplace_back(QString::number(*dbl_ptr), int(*dbl_ptr));
156 else if(
auto str_ptr = ossia::get_if<std::string>(&val))
158 alternatives.emplace_back(
159 QString::fromStdString(*str_ptr), int(value_idx));
164 if(alternatives.empty())
166 alternatives.emplace_back(
"0", 0);
167 alternatives.emplace_back(
"1", 1);
168 alternatives.emplace_back(
"2", 2);
174 if(
auto it = previous_values.find(nm);
175 it != previous_values.end()
176 && it->second.get_type() == port->value().get_type())
177 port->setValue(it->second);
179 self.m_inlets.push_back(port);
180 self.controlAdded(port->id());
186 auto nm = QString::fromStdString(input.name);
189 self.m_inlets.push_back(port);
190 self.controlAdded(port->id());
196 auto nm = QString::fromStdString(input.name);
199 if(
auto it = previous_values.find(nm);
200 it != previous_values.end()
201 && it->second.get_type() == port->value().get_type())
202 port->setValue(it->second);
204 self.m_inlets.push_back(port);
205 self.controlAdded(port->id());
211 auto nm = QString::fromStdString(input.name);
212 ossia::vec2f min{-100., -100.};
213 ossia::vec2f max{100., 100.};
214 ossia::vec2f init{0.0, 0.0};
216 std::copy_n(v.def->begin(), 2, init.begin());
218 std::copy_n(v.min->begin(), 2, min.begin());
220 std::copy_n(v.max->begin(), 2, max.begin());
224 auto& ctx = score::IDocument::documentContext(self);
225 auto& device_plug = ctx.template plugin<Explorer::DeviceDocumentPlugin>();
227 QString firstWindowDeviceName;
228 for(
auto dev : list.devices())
230 if(
auto win = qobject_cast<WindowDevice*>(dev))
232 firstWindowDeviceName = win->name();
237 if(!firstWindowDeviceName.isEmpty())
239 if(nm.contains(
"iMouse"))
243 else if(nm.contains(
"mouse", Qt::CaseInsensitive))
249 if(
auto it = previous_values.find(nm);
250 it != previous_values.end()
251 && it->second.get_type() == port->value().get_type())
252 port->setValue(it->second);
254 self.m_inlets.push_back(port);
255 self.controlAdded(port->id());
261 auto nm = QString::fromStdString(input.name);
262 ossia::vec3f min{-100., -100., -100.};
263 ossia::vec3f max{100., 100., 100.};
264 ossia::vec3f init{0., 0., 0.};
266 std::copy_n(v.def->begin(), 3, init.begin());
268 std::copy_n(v.min->begin(), 3, min.begin());
270 std::copy_n(v.max->begin(), 3, max.begin());
274 if(
auto it = previous_values.find(nm);
275 it != previous_values.end()
276 && it->second.get_type() == port->value().get_type())
277 port->setValue(it->second);
279 self.m_inlets.push_back(port);
280 self.controlAdded(port->id());
286 auto nm = QString::fromStdString(input.name);
287 ossia::vec4f init{0.5, 0.5, 0.5, 1.};
290 std::copy_n(v.def->begin(), 4, init.begin());
295 if(
auto it = previous_values.find(nm);
296 it != previous_values.end()
297 && it->second.get_type() == port->value().get_type())
298 port->setValue(it->second);
300 self.m_inlets.push_back(port);
301 self.controlAdded(port->id());
306 auto port =
new Gfx::TextureInlet(
309 self.m_inlets.push_back(port);
314 auto port =
new Gfx::TextureInlet(
317 self.m_inlets.push_back(port);
324 self.m_inlets.push_back(port);
331 self.m_inlets.push_back(port);
338 self.m_inlets.push_back(port);
343 Process::Inlet* operator()(
const storage_input& v) {
return nullptr; }
344 Process::Inlet* operator()(
const texture_input& v) {
return nullptr; }
345 Process::Inlet* operator()(
const csf_image_input& v) {
return nullptr; }
346 Process::Inlet* operator()(
const geometry_input& v) {
return nullptr; }
349 for(
const isf::input& input : desc.inputs)
351 ossia::visit(input_vis{previous_values, input, i, self}, input.data);
356 if(!desc.outputs.empty())
358 qDeleteAll(self.m_outlets);
359 self.m_outlets.clear();
362 for(
const auto& out : desc.outputs)
364 self.m_outlets.push_back(
new Gfx::TextureOutlet{
365 QString::fromStdString(out.name),