31 QTemporaryDir temporary;
32 if (!temporary.isValid())
34 const QString root = temporary.path();
35 if (!
write_file(QDir(root).filePath(QStringLiteral(
"z.frag")),
36 QByteArrayLiteral(
"#version 450\n")) ||
37 !
write_file(QDir(root).filePath(QStringLiteral(
"a.frag")),
39 "#define slider1 ext.custom_uniforms[5].x\n")) ||
40 !
write_file(QDir(root).filePath(QStringLiteral(
"compute/fx.comp")),
41 QByteArrayLiteral(
"#version 450\n"))) {
48 std::cerr << error.toStdString() <<
'\n';
56 const QString manifestPath = QDir(root).filePath(QStringLiteral(
"library.json"));
58 const QJsonArray shaders = manifest.value(QStringLiteral(
"shaders")).toArray();
59 if (manifest.value(QStringLiteral(
"backend")).toString() !=
60 QStringLiteral(
"acmxvk") ||
61 manifest.value(QStringLiteral(
"library_type")).toString() !=
62 QStringLiteral(
"source") ||
63 shaders.size() != 3 || shaders.at(0).toString() != QStringLiteral(
"a.frag") ||
64 shaders.at(2).toString() != QStringLiteral(
"compute/fx.comp")) {
68 QJsonObject uniforms =
69 manifest.value(QStringLiteral(
"custom_uniforms")).toObject();
70 QJsonObject slider = uniforms.value(QStringLiteral(
"slider1")).toObject();
71 slider.insert(QStringLiteral(
"value"), 0.75);
72 slider.insert(QStringLiteral(
"maximum"), 2.0);
73 uniforms.insert(QStringLiteral(
"slider1"), slider);
74 manifest.insert(QStringLiteral(
"custom_uniforms"), uniforms);
76 QJsonDocument(manifest).toJson(QJsonDocument::Indented))) {
80 std::cerr << error.toStdString() <<
'\n';
84 .value(QStringLiteral(
"custom_uniforms"))
86 .value(QStringLiteral(
"slider1"))
88 if (slider.value(QStringLiteral(
"slot")).toInt() != 20 ||
89 slider.value(QStringLiteral(
"value")).toDouble() != 0.75 ||
90 slider.value(QStringLiteral(
"maximum")).toDouble() != 2.0) {
96 std::cerr << error.toStdString() <<
'\n';
99 QStringList remainingShaders;
101 remainingShaders.contains(QStringLiteral(
"z.frag"),
102 Qt::CaseInsensitive) ||
103 !QFileInfo::exists(QDir(root).filePath(QStringLiteral(
"z.frag")))) {
106 if (!
write_file(QDir(root).filePath(QStringLiteral(
"new.frag")),
107 QByteArrayLiteral(
"#version 450\n"))) {
110 remainingShaders.append(QStringLiteral(
"new.frag"));
112 root, remainingShaders, QString(), result, error)) {
113 std::cerr << error.toStdString() <<
'\n';
116 remainingShaders.clear();
118 remainingShaders.contains(QStringLiteral(
"z.frag"),
119 Qt::CaseInsensitive) ||
120 !remainingShaders.contains(QStringLiteral(
"new.frag"),
121 Qt::CaseInsensitive)) {
125 QList<acmx2::CustomUniformDefinition> customUniforms;
127 customUniforms.size() != 27) {
130 customUniforms.append({QStringLiteral(
"custom_knob"), 0.0, 2.0, 0.1,
133 std::cerr << error.toStdString() <<
'\n';
136 QJsonObject writtenUniforms =
138 .value(QStringLiteral(
"custom_uniforms"))
140 if (writtenUniforms.value(QStringLiteral(
"custom_knob"))
142 .value(QStringLiteral(
"slot"))
147 customUniforms.removeLast();
150 .value(QStringLiteral(
"custom_uniforms"))
152 .contains(QStringLiteral(
"custom_knob"))) {
156 while (customUniforms.size() < 65) {
157 const int slot = customUniforms.size();
158 customUniforms.append(
159 {QStringLiteral(
"extra_%1").arg(slot), 0.0, 1.0, 0.01, 0.0,
163 !error.contains(QStringLiteral(
"at most 64"))) {
167 QTemporaryDir runtimeDirectory;
168 if (!runtimeDirectory.isValid())
171 QJsonObject runtimeUniforms =
172 runtimeManifest.value(QStringLiteral(
"custom_uniforms")).toObject();
173 QJsonObject runtimeSlider =
174 runtimeUniforms.value(QStringLiteral(
"slider1")).toObject();
175 runtimeSlider.insert(QStringLiteral(
"value"), 0.75000000000001);
176 runtimeUniforms.insert(QStringLiteral(
"slider1"), runtimeSlider);
177 runtimeManifest.insert(QStringLiteral(
"custom_uniforms"), runtimeUniforms);
179 .filePath(QStringLiteral(
"library.json")),
180 QJsonDocument(runtimeManifest)
181 .toJson(QJsonDocument::Indented))) {
184 bool metadataMatches =
false;
186 root, runtimeDirectory.path(), metadataMatches, error) ||
190 runtimeSlider.insert(QStringLiteral(
"value"), 0.8);
191 runtimeUniforms.insert(QStringLiteral(
"slider1"), runtimeSlider);
192 runtimeManifest.insert(QStringLiteral(
"custom_uniforms"), runtimeUniforms);
194 .filePath(QStringLiteral(
"library.json")),
195 QJsonDocument(runtimeManifest)
196 .toJson(QJsonDocument::Indented)) ||
198 root, runtimeDirectory.path(), metadataMatches, error) ||