147 const QMap<QString, QVariant>& results)
const
150 static const QRegularExpression refRe(QStringLiteral(
"ref\\('([^']+)'\\)"));
153 QRegularExpressionMatch refMatch = refRe.match(expr.trimmed());
154 if (refMatch.hasMatch() && refMatch.capturedStart() == 0
155 && refMatch.capturedEnd() == expr.trimmed().length()) {
156 const QString path = refMatch.captured(1);
157 if (m_params.contains(path)) {
158 return m_params.value(path);
160 return results.value(path);
164 static const QRegularExpression clampRe(
165 QStringLiteral(
"clamp\\((.+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+)\\)"));
166 QRegularExpressionMatch clampMatch = clampRe.match(expr.trimmed());
167 if (clampMatch.hasMatch()) {
169 double val = inner.toDouble();
170 double lo = clampMatch.captured(2).toDouble();
171 double hi = clampMatch.captured(3).toDouble();
172 return QVariant(std::clamp(val, lo, hi));
176 static const QRegularExpression scaleRe(
177 QStringLiteral(
"scale\\((.+),\\s*([\\d.eE+-]+)\\)"));
178 QRegularExpressionMatch scaleMatch = scaleRe.match(expr.trimmed());
179 if (scaleMatch.hasMatch()) {
181 double factor = scaleMatch.captured(2).toDouble();
182 return QVariant(inner.toDouble() * factor);
186 static const QRegularExpression threshRe(
187 QStringLiteral(
"threshold\\((.+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+)\\)"));
188 QRegularExpressionMatch threshMatch = threshRe.match(expr.trimmed());
189 if (threshMatch.hasMatch()) {
191 double val = inner.toDouble();
192 double thresh = threshMatch.captured(2).toDouble();
193 double above = threshMatch.captured(3).toDouble();
194 double below = threshMatch.captured(4).toDouble();
195 return QVariant(val > thresh ? above : below);
199 static const QRegularExpression lerpRe(
200 QStringLiteral(
"lerp\\(([\\d.eE+-]+),\\s*([\\d.eE+-]+),\\s*(.+)\\)"));
201 QRegularExpressionMatch lerpMatch = lerpRe.match(expr.trimmed());
202 if (lerpMatch.hasMatch()) {
203 double a = lerpMatch.captured(1).toDouble();
204 double b = lerpMatch.captured(2).toDouble();
206 double t = tVal.toDouble();
207 return QVariant(a + (b - a) * t);
217 double numVal = expr.trimmed().toDouble(&ok);
219 return QVariant(numVal);
223 static const QRegularExpression mulRe(QStringLiteral(
"^(.+)\\s*\\*\\s*([\\d.eE+-]+)$"));
224 QRegularExpressionMatch mulMatch = mulRe.match(expr.trimmed());
225 if (mulMatch.hasMatch()) {
227 double right = mulMatch.captured(2).toDouble();
228 return QVariant(left.toDouble() * right);
232 static const QRegularExpression divRe(QStringLiteral(
"^([\\d.eE+-]+)\\s*/\\s*\\((.+)\\)$"));
233 QRegularExpressionMatch divMatch = divRe.match(expr.trimmed());
234 if (divMatch.hasMatch()) {
235 double left = divMatch.captured(1).toDouble();
237 double rightVal = right.toDouble();
238 if (std::abs(rightVal) < 1e-15) {
241 return QVariant(left / rightVal);
245 static const QRegularExpression addRe(QStringLiteral(
"^(.+)\\s*\\+\\s*([\\d.eE+-]+)$"));
246 QRegularExpressionMatch addMatch = addRe.match(expr.trimmed());
247 if (addMatch.hasMatch()) {
249 double right = addMatch.captured(2).toDouble();
250 return QVariant(left.toDouble() + right);