138 const QMap<QString, QVariant>& results)
const
141 static const QRegularExpression cmpRe(QStringLiteral(
"^(.+?)\\s*(>=|<=|==|!=|>|<)\\s*(.+)$"));
142 const QRegularExpressionMatch cmpMatch = cmpRe.match(expr.trimmed());
143 if (cmpMatch.hasMatch()) {
146 if (!left.isValid() || !right.isValid())
148 const double a = left.toDouble();
149 const double b = right.toDouble();
150 const QString op = cmpMatch.captured(2);
151 return QVariant(op ==
">=" ? a >= b : op ==
"<=" ? a <= b
152 : op ==
"==" ? a == b
153 : op ==
"!=" ? a != b
157 if (expr.trimmed() == QLatin1String(
"true") || expr.trimmed() == QLatin1String(
"false"))
158 return QVariant(expr.trimmed() == QLatin1String(
"true"));
161 static const QRegularExpression refRe(QStringLiteral(
"ref\\('([^']+)'\\)"));
164 QRegularExpressionMatch refMatch = refRe.match(expr.trimmed());
165 if (refMatch.hasMatch() && refMatch.capturedStart() == 0 && refMatch.capturedEnd() == expr.trimmed().length()) {
166 const QString path = refMatch.captured(1);
167 if (m_params.contains(path)) {
168 return m_params.value(path);
170 return results.value(path);
174 static const QRegularExpression clampRe(
175 QStringLiteral(
"clamp\\((.+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+)\\)"));
176 QRegularExpressionMatch clampMatch = clampRe.match(expr.trimmed());
177 if (clampMatch.hasMatch()) {
179 if (!inner.isValid())
181 double val = inner.toDouble();
182 double lo = clampMatch.captured(2).toDouble();
183 double hi = clampMatch.captured(3).toDouble();
184 return QVariant(std::clamp(val, lo, hi));
188 static const QRegularExpression scaleRe(
189 QStringLiteral(
"scale\\((.+),\\s*([\\d.eE+-]+)\\)"));
190 QRegularExpressionMatch scaleMatch = scaleRe.match(expr.trimmed());
191 if (scaleMatch.hasMatch()) {
193 if (!inner.isValid())
195 double factor = scaleMatch.captured(2).toDouble();
196 return QVariant(inner.toDouble() * factor);
200 static const QRegularExpression threshRe(
201 QStringLiteral(
"threshold\\((.+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+)\\)"));
202 QRegularExpressionMatch threshMatch = threshRe.match(expr.trimmed());
203 if (threshMatch.hasMatch()) {
205 if (!inner.isValid())
207 double val = inner.toDouble();
208 double thresh = threshMatch.captured(2).toDouble();
209 double above = threshMatch.captured(3).toDouble();
210 double below = threshMatch.captured(4).toDouble();
211 return QVariant(val > thresh ? above : below);
215 static const QRegularExpression lerpRe(
216 QStringLiteral(
"lerp\\(([\\d.eE+-]+),\\s*([\\d.eE+-]+),\\s*(.+)\\)"));
217 QRegularExpressionMatch lerpMatch = lerpRe.match(expr.trimmed());
218 if (lerpMatch.hasMatch()) {
219 double a = lerpMatch.captured(1).toDouble();
220 double b = lerpMatch.captured(2).toDouble();
224 double t = tVal.toDouble();
225 return QVariant(a + (b - a) * t);
235 double numVal = expr.trimmed().toDouble(&ok);
237 return QVariant(numVal);
241 static const QRegularExpression nameRe(QStringLiteral(
"^[A-Za-z_][\\w./:]*$"));
242 if (nameRe.match(expr.trimmed()).hasMatch()) {
243 const QString name = expr.trimmed();
244 return m_params.contains(name) ? m_params.value(name) : results.value(name);
248 static const QRegularExpression mulRe(QStringLiteral(
"^(.+)\\s*\\*\\s*([\\d.eE+-]+)$"));
249 QRegularExpressionMatch mulMatch = mulRe.match(expr.trimmed());
250 if (mulMatch.hasMatch()) {
254 double right = mulMatch.captured(2).toDouble();
255 return QVariant(left.toDouble() * right);
259 static const QRegularExpression divRe(QStringLiteral(
"^([\\d.eE+-]+)\\s*/\\s*\\((.+)\\)$"));
260 QRegularExpressionMatch divMatch = divRe.match(expr.trimmed());
261 if (divMatch.hasMatch()) {
262 double left = divMatch.captured(1).toDouble();
264 if (!right.isValid())
266 double rightVal = right.toDouble();
267 if (std::abs(rightVal) < 1e-15) {
270 return QVariant(left / rightVal);
274 static const QRegularExpression addRe(QStringLiteral(
"^(.+)\\s*\\+\\s*([\\d.eE+-]+)$"));
275 QRegularExpressionMatch addMatch = addRe.match(expr.trimmed());
276 if (addMatch.hasMatch()) {
280 double right = addMatch.captured(2).toDouble();
281 return QVariant(left.toDouble() + right);