QmlDesigner: Create the composition stack with multiple effects

Task-number: QDS-11064
Change-Id: I55fab43e572a989b450d4411f1208b959c4dd9c4
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Amr Essam
2023-11-01 15:25:43 +02:00
committed by Amr Elsayed
parent 673cf2605f
commit 4f2a062977
2 changed files with 45 additions and 40 deletions

View File

@@ -47,20 +47,6 @@ static bool writeToFile(const QByteArray &buf, const QString &filename, FileType
EffectMakerModel::EffectMakerModel(QObject *parent) EffectMakerModel::EffectMakerModel(QObject *parent)
: QAbstractListModel{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]() { connect(&m_fileWatcher, &Utils::FileSystemWatcher::fileChanged, this, [this]() {
// Update component with images not set. // Update component with images not set.
m_loadComponentImages = false; m_loadComponentImages = false;
@@ -641,19 +627,15 @@ QString EffectMakerModel::generateVertexShader(bool includeUniforms)
m_shaderVaryingVariables.clear(); m_shaderVaryingVariables.clear();
for (const CompositionNode *n : std::as_const(m_nodes)) { for (const CompositionNode *n : std::as_const(m_nodes)) {
if (!n->vertexCode().isEmpty() && n->isEnabled()) { if (!n->vertexCode().isEmpty() && n->isEnabled()) {
if (n->type() == CompositionNode::NodeType::SourceNode) { const QStringList vertexCode = n->vertexCode().split('\n');
s_sourceCode = n->vertexCode().split('\n'); int mainIndex = getTagIndex(vertexCode, "main");
} else if (n->type() == CompositionNode::NodeType::CustomNode) { int line = 0;
const QStringList vertexCode = n->vertexCode().split('\n'); for (const QString &ss : vertexCode) {
int mainIndex = getTagIndex(vertexCode, QStringLiteral("main")); if (mainIndex == -1 || line > mainIndex)
int line = 0; s_main += " " + ss + '\n';
for (const QString &ss : vertexCode) { else if (line < mainIndex)
if (mainIndex == -1 || line > mainIndex) s_root += processVertexRootLine(ss);
s_main += QStringLiteral(" ") + ss + '\n'; line++;
else if (line < mainIndex)
s_root += processVertexRootLine(ss);
line++;
}
} }
} }
} }
@@ -700,19 +682,15 @@ QString EffectMakerModel::generateFragmentShader(bool includeUniforms)
QStringList s_sourceCode; QStringList s_sourceCode;
for (const CompositionNode *n : std::as_const(m_nodes)) { for (const CompositionNode *n : std::as_const(m_nodes)) {
if (!n->fragmentCode().isEmpty() && n->isEnabled()) { if (!n->fragmentCode().isEmpty() && n->isEnabled()) {
if (n->type() == CompositionNode::NodeType::SourceNode) { const QStringList fragmentCode = n->fragmentCode().split('\n');
s_sourceCode = n->fragmentCode().split('\n'); int mainIndex = getTagIndex(fragmentCode, QStringLiteral("main"));
} else if (n->type() == CompositionNode::NodeType::CustomNode) { int line = 0;
const QStringList fragmentCode = n->fragmentCode().split('\n'); for (const QString &ss : fragmentCode) {
int mainIndex = getTagIndex(fragmentCode, QStringLiteral("main")); if (mainIndex == -1 || line > mainIndex)
int line = 0; s_main += QStringLiteral(" ") + ss + '\n';
for (const QString &ss : fragmentCode) { else if (line < mainIndex)
if (mainIndex == -1 || line > mainIndex) s_root += processFragmentRootLine(ss);
s_main += QStringLiteral(" ") + ss + '\n'; line++;
else if (line < mainIndex)
s_root += processFragmentRootLine(ss);
line++;
}
} }
} }
} }
@@ -830,6 +808,30 @@ void EffectMakerModel::updateCustomUniforms()
m_exportedEffectPropertiesString = exportedEffectPropertiesString; 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() void EffectMakerModel::bakeShaders()
{ {
const QString failMessage = "Shader baking failed: "; const QString failMessage = "Shader baking failed: ";
@@ -840,6 +842,8 @@ void EffectMakerModel::bakeShaders()
return; return;
} }
createFiles();
resetEffectError(ErrorPreprocessor); resetEffectError(ErrorPreprocessor);
if (m_vertexShader == generateVertexShader() && m_fragmentShader == generateFragmentShader()) { if (m_vertexShader == generateVertexShader() && m_fragmentShader == generateFragmentShader()) {
setShadersUpToDate(true); setShadersUpToDate(true);

View File

@@ -139,6 +139,7 @@ private:
void clearImageWatchers(); void clearImageWatchers();
void updateCustomUniforms(); void updateCustomUniforms();
void createFiles();
void bakeShaders(); void bakeShaders();
QString mipmapPropertyName(const QString &name) const; QString mipmapPropertyName(const QString &name) const;