forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user