138 const QMap<QString, QVariant>& results)
const
141 static const QRegularExpression refRe(QStringLiteral(
"ref\\('([^']+)'\\)"));
144 QRegularExpressionMatch refMatch = refRe.match(expr.trimmed());
145 if (refMatch.hasMatch() && refMatch.capturedStart() == 0
146 && refMatch.capturedEnd() == expr.trimmed().length()) {
147 const QString path = refMatch.captured(1);
148 if (m_params.contains(path)) {
149 return m_params.value(path);
151 return results.value(path);
155 static const QRegularExpression clampRe(
156 QStringLiteral(
"clamp\\((.+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+)\\)"));
157 QRegularExpressionMatch clampMatch = clampRe.match(expr.trimmed());
158 if (clampMatch.hasMatch()) {
160 double val = inner.toDouble();
161 double lo = clampMatch.captured(2).toDouble();
162 double hi = clampMatch.captured(3).toDouble();
163 return QVariant(std::clamp(val, lo, hi));
167 static const QRegularExpression scaleRe(
168 QStringLiteral(
"scale\\((.+),\\s*([\\d.eE+-]+)\\)"));
169 QRegularExpressionMatch scaleMatch = scaleRe.match(expr.trimmed());
170 if (scaleMatch.hasMatch()) {
172 double factor = scaleMatch.captured(2).toDouble();
173 return QVariant(inner.toDouble() * factor);
177 static const QRegularExpression threshRe(
178 QStringLiteral(
"threshold\\((.+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+),\\s*([\\d.eE+-]+)\\)"));
179 QRegularExpressionMatch threshMatch = threshRe.match(expr.trimmed());
180 if (threshMatch.hasMatch()) {
182 double val = inner.toDouble();
183 double thresh = threshMatch.captured(2).toDouble();
184 double above = threshMatch.captured(3).toDouble();
185 double below = threshMatch.captured(4).toDouble();
186 return QVariant(val > thresh ? above : below);
190 static const QRegularExpression lerpRe(
191 QStringLiteral(
"lerp\\(([\\d.eE+-]+),\\s*([\\d.eE+-]+),\\s*(.+)\\)"));
192 QRegularExpressionMatch lerpMatch = lerpRe.match(expr.trimmed());
193 if (lerpMatch.hasMatch()) {
194 double a = lerpMatch.captured(1).toDouble();
195 double b = lerpMatch.captured(2).toDouble();
197 double t = tVal.toDouble();
198 return QVariant(a + (b - a) * t);
208 double numVal = expr.trimmed().toDouble(&ok);
210 return QVariant(numVal);
214 static const QRegularExpression mulRe(QStringLiteral(
"^(.+)\\s*\\*\\s*([\\d.eE+-]+)$"));
215 QRegularExpressionMatch mulMatch = mulRe.match(expr.trimmed());
216 if (mulMatch.hasMatch()) {
218 double right = mulMatch.captured(2).toDouble();
219 return QVariant(left.toDouble() * right);
223 static const QRegularExpression divRe(QStringLiteral(
"^([\\d.eE+-]+)\\s*/\\s*\\((.+)\\)$"));
224 QRegularExpressionMatch divMatch = divRe.match(expr.trimmed());
225 if (divMatch.hasMatch()) {
226 double left = divMatch.captured(1).toDouble();
228 double rightVal = right.toDouble();
229 if (std::abs(rightVal) < 1e-15) {
232 return QVariant(left / rightVal);
236 static const QRegularExpression addRe(QStringLiteral(
"^(.+)\\s*\\+\\s*([\\d.eE+-]+)$"));
237 QRegularExpressionMatch addMatch = addRe.match(expr.trimmed());
238 if (addMatch.hasMatch()) {
240 double right = addMatch.captured(2).toDouble();
241 return QVariant(left.toDouble() + right);