| 1 | // Copyright (C) 2022 The Qt Company Ltd. |
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only |
| 3 | |
| 4 | #include "shaderfeatures.h" |
| 5 | #include <QStringList> |
| 6 | #include <QDebug> |
| 7 | |
| 8 | ShaderFeatures::ShaderFeatures() |
| 9 | { |
| 10 | } |
| 11 | |
| 12 | // Browse the shaders and check which features are used in them. |
| 13 | void ShaderFeatures::update(const QString &vs, const QString &fs, const QString &qml) |
| 14 | { |
| 15 | QStringList vsList = vs.split(sep: "\n" ); |
| 16 | QStringList fsList = fs.split(sep: "\n" ); |
| 17 | |
| 18 | QStringList code = vsList + fsList; |
| 19 | Features newFeatures = {}; |
| 20 | m_gridMeshWidth = 1; |
| 21 | m_gridMeshHeight = 1; |
| 22 | for (const auto &line : code) |
| 23 | checkLine(line, features&: newFeatures); |
| 24 | |
| 25 | // iTime may also be used in QML side, without being used in shaders. |
| 26 | // In this case enable the time helpers creation. |
| 27 | if (qml.contains(s: "iTime" )) |
| 28 | newFeatures.setFlag(flag: Time, on: true); |
| 29 | |
| 30 | if (newFeatures != m_enabledFeatures) |
| 31 | m_enabledFeatures = newFeatures; |
| 32 | } |
| 33 | |
| 34 | void ShaderFeatures::checkLine(const QString &line, Features &features) { |
| 35 | if (line.contains(s: "iTime" )) |
| 36 | features.setFlag(flag: Time, on: true); |
| 37 | |
| 38 | if (line.contains(s: "iFrame" )) |
| 39 | features.setFlag(flag: Frame, on: true); |
| 40 | |
| 41 | if (line.contains(s: "iResolution" )) |
| 42 | features.setFlag(flag: Resolution, on: true); |
| 43 | |
| 44 | if (line.contains(s: "iSource" )) |
| 45 | features.setFlag(flag: Source, on: true); |
| 46 | |
| 47 | if (line.contains(s: "iMouse" )) |
| 48 | features.setFlag(flag: Mouse, on: true); |
| 49 | |
| 50 | if (line.contains(s: "fragCoord" )) |
| 51 | features.setFlag(flag: FragCoord, on: true); |
| 52 | |
| 53 | if (line.contains(s: "@mesh" )) { |
| 54 | // Get the mesh size, remove "@mesh" |
| 55 | QString l = line.trimmed().sliced(pos: 5); |
| 56 | QStringList list = l.split(sep: QLatin1Char(',')); |
| 57 | if (list.size() >= 2) { |
| 58 | int w = list.at(i: 0).trimmed().toInt(); |
| 59 | int h = list.at(i: 1).trimmed().toInt(); |
| 60 | // Set size to max values |
| 61 | m_gridMeshWidth = std::max(a: m_gridMeshWidth, b: w); |
| 62 | m_gridMeshHeight = std::max(a: m_gridMeshHeight, b: h); |
| 63 | } |
| 64 | // If is bigger than default (1, 1), set the feature |
| 65 | if (m_gridMeshWidth > 1 || m_gridMeshHeight > 1) |
| 66 | features.setFlag(flag: GridMesh, on: true); |
| 67 | } |
| 68 | if (line.contains(s: "@blursources" )) |
| 69 | features.setFlag(flag: BlurSources, on: true); |
| 70 | } |
| 71 | |