From 4f2a06297752398b2a0eac498e28da16d2f0b0ea Mon Sep 17 00:00:00 2001 From: Amr Essam Date: Wed, 1 Nov 2023 15:25:43 +0200 Subject: [PATCH] QmlDesigner: Create the composition stack with multiple effects Task-number: QDS-11064 Change-Id: I55fab43e572a989b450d4411f1208b959c4dd9c4 Reviewed-by: Mahmoud Badri --- .../effectmakernew/effectmakermodel.cpp | 84 ++++++++++--------- src/plugins/effectmakernew/effectmakermodel.h | 1 + 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/src/plugins/effectmakernew/effectmakermodel.cpp b/src/plugins/effectmakernew/effectmakermodel.cpp index 7f8296fd3c7..de34128747b 100644 --- a/src/plugins/effectmakernew/effectmakermodel.cpp +++ b/src/plugins/effectmakernew/effectmakermodel.cpp @@ -47,20 +47,6 @@ static bool writeToFile(const QByteArray &buf, const QString &filename, FileType EffectMakerModel::EffectMakerModel(QObject *parent) : QAbstractListModel{parent} { - m_vertexSourceFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.vert"); - m_fragmentSourceFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.frag"); - m_vertexShaderFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.vert.qsb"); - m_fragmentShaderFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.frag.qsb"); - if (!m_vertexSourceFile.open() || !m_fragmentSourceFile.open() - || !m_vertexShaderFile.open() || !m_fragmentShaderFile.open()) { - qWarning() << "Unable to open temporary files"; - } else { - m_vertexSourceFilename = m_vertexSourceFile.fileName(); - m_fragmentSourceFilename = m_fragmentSourceFile.fileName(); - m_vertexShaderFilename = m_vertexShaderFile.fileName(); - m_fragmentShaderFilename = m_fragmentShaderFile.fileName(); - } - connect(&m_fileWatcher, &Utils::FileSystemWatcher::fileChanged, this, [this]() { // Update component with images not set. m_loadComponentImages = false; @@ -641,19 +627,15 @@ QString EffectMakerModel::generateVertexShader(bool includeUniforms) m_shaderVaryingVariables.clear(); for (const CompositionNode *n : std::as_const(m_nodes)) { if (!n->vertexCode().isEmpty() && n->isEnabled()) { - if (n->type() == CompositionNode::NodeType::SourceNode) { - s_sourceCode = n->vertexCode().split('\n'); - } else if (n->type() == CompositionNode::NodeType::CustomNode) { - const QStringList vertexCode = n->vertexCode().split('\n'); - int mainIndex = getTagIndex(vertexCode, QStringLiteral("main")); - int line = 0; - for (const QString &ss : vertexCode) { - if (mainIndex == -1 || line > mainIndex) - s_main += QStringLiteral(" ") + ss + '\n'; - else if (line < mainIndex) - s_root += processVertexRootLine(ss); - line++; - } + const QStringList vertexCode = n->vertexCode().split('\n'); + int mainIndex = getTagIndex(vertexCode, "main"); + int line = 0; + for (const QString &ss : vertexCode) { + if (mainIndex == -1 || line > mainIndex) + s_main += " " + ss + '\n'; + else if (line < mainIndex) + s_root += processVertexRootLine(ss); + line++; } } } @@ -700,19 +682,15 @@ QString EffectMakerModel::generateFragmentShader(bool includeUniforms) QStringList s_sourceCode; for (const CompositionNode *n : std::as_const(m_nodes)) { if (!n->fragmentCode().isEmpty() && n->isEnabled()) { - if (n->type() == CompositionNode::NodeType::SourceNode) { - s_sourceCode = n->fragmentCode().split('\n'); - } else if (n->type() == CompositionNode::NodeType::CustomNode) { - const QStringList fragmentCode = n->fragmentCode().split('\n'); - int mainIndex = getTagIndex(fragmentCode, QStringLiteral("main")); - int line = 0; - for (const QString &ss : fragmentCode) { - if (mainIndex == -1 || line > mainIndex) - s_main += QStringLiteral(" ") + ss + '\n'; - else if (line < mainIndex) - s_root += processFragmentRootLine(ss); - line++; - } + const QStringList fragmentCode = n->fragmentCode().split('\n'); + int mainIndex = getTagIndex(fragmentCode, QStringLiteral("main")); + int line = 0; + for (const QString &ss : fragmentCode) { + if (mainIndex == -1 || line > mainIndex) + s_main += QStringLiteral(" ") + ss + '\n'; + else if (line < mainIndex) + s_root += processFragmentRootLine(ss); + line++; } } } @@ -830,6 +808,30 @@ void EffectMakerModel::updateCustomUniforms() m_exportedEffectPropertiesString = exportedEffectPropertiesString; } +void EffectMakerModel::createFiles() +{ + if (QFileInfo(m_vertexShaderFilename).exists()) + QFile(m_vertexShaderFilename).remove(); + if (QFileInfo(m_fragmentShaderFilename).exists()) + QFile(m_fragmentShaderFilename).remove(); + + auto vertexShaderFile = QTemporaryFile(QDir::tempPath() + "/dsem_XXXXXX.vert.qsb"); + auto fragmentShaderFile = QTemporaryFile(QDir::tempPath() + "/dsem_XXXXXX.frag.qsb"); + + m_vertexSourceFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.vert"); + m_fragmentSourceFile.setFileTemplate(QDir::tempPath() + "/dsem_XXXXXX.frag"); + + if (!m_vertexSourceFile.open() || !m_fragmentSourceFile.open() + || !vertexShaderFile.open() || !fragmentShaderFile.open()) { + qWarning() << "Unable to open temporary files"; + } else { + m_vertexSourceFilename = m_vertexSourceFile.fileName(); + m_fragmentSourceFilename = m_fragmentSourceFile.fileName(); + m_vertexShaderFilename = vertexShaderFile.fileName(); + m_fragmentShaderFilename = fragmentShaderFile.fileName(); + } +} + void EffectMakerModel::bakeShaders() { const QString failMessage = "Shader baking failed: "; @@ -840,6 +842,8 @@ void EffectMakerModel::bakeShaders() return; } + createFiles(); + resetEffectError(ErrorPreprocessor); if (m_vertexShader == generateVertexShader() && m_fragmentShader == generateFragmentShader()) { setShadersUpToDate(true); diff --git a/src/plugins/effectmakernew/effectmakermodel.h b/src/plugins/effectmakernew/effectmakermodel.h index 77f3df5577e..02d7c57085d 100644 --- a/src/plugins/effectmakernew/effectmakermodel.h +++ b/src/plugins/effectmakernew/effectmakermodel.h @@ -139,6 +139,7 @@ private: void clearImageWatchers(); void updateCustomUniforms(); + void createFiles(); void bakeShaders(); QString mipmapPropertyName(const QString &name) const;