QmlDesginer: Add functionality effect preview

Also some refactoring and fixes to the model

Task-number: QDS-10811
Change-Id: If27b2e8e9bac4d46200ed37bf0aec8255ee19022
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Amr Essam
2023-10-03 10:34:50 +03:00
committed by Amr Elsayed
parent 0ad9b6fb3a
commit 84bbfec651
3 changed files with 53 additions and 7 deletions

View File

@@ -17,6 +17,8 @@ Column {
required property Item mainRoot required property Item mainRoot
property var effectMakerModel: EffectMakerBackend.effectMakerModel property var effectMakerModel: EffectMakerBackend.effectMakerModel
property alias source: source property alias source: source
// The delay in ms to wait until updating the effect
readonly property int updateDelay: 200
Rectangle { // toolbar Rectangle { // toolbar
width: parent.width width: parent.width
@@ -160,7 +162,7 @@ Column {
try { try {
const newObject = Qt.createQmlObject( const newObject = Qt.createQmlObject(
effectMakerModel.qmlComponentString, //TODO effectMakerModel.qmlComponentString,
componentParent, componentParent,
"" ""
); );
@@ -178,11 +180,19 @@ Column {
} }
} }
Connections {
target: effectMakerModel
function onShadersBaked() {
console.log("Shaders Baked!")
//updateTimer.restart(); // Disable for now
}
}
Timer { Timer {
id: updateTimer id: updateTimer
interval: effectMakerModel.effectUpdateDelay(); //TODO interval: updateDelay;
onTriggered: { onTriggered: {
effectMakerModel.updateQmlComponent(); //TODO effectMakerModel.updateQmlComponent();
createNewComponent(); createNewComponent();
} }
} }

View File

@@ -104,6 +104,8 @@ void EffectMakerModel::addNode(const QString &nodeQenPath)
endInsertRows(); endInsertRows();
setIsEmpty(false); setIsEmpty(false);
bakeShaders();
} }
void EffectMakerModel::moveNode(int fromIdx, int toIdx) void EffectMakerModel::moveNode(int fromIdx, int toIdx)
@@ -115,6 +117,8 @@ void EffectMakerModel::moveNode(int fromIdx, int toIdx)
beginMoveRows({}, fromIdx, fromIdx, {}, toIdxAdjusted); beginMoveRows({}, fromIdx, fromIdx, {}, toIdxAdjusted);
m_nodes.move(fromIdx, toIdx); m_nodes.move(fromIdx, toIdx);
endMoveRows(); endMoveRows();
bakeShaders();
} }
void EffectMakerModel::removeNode(int idx) void EffectMakerModel::removeNode(int idx)
@@ -127,6 +131,8 @@ void EffectMakerModel::removeNode(int idx)
if (m_nodes.isEmpty()) if (m_nodes.isEmpty())
setIsEmpty(true); setIsEmpty(true);
else
bakeShaders();
} }
void EffectMakerModel::updateBakedShaderVersions() void EffectMakerModel::updateBakedShaderVersions()
@@ -170,6 +176,11 @@ void EffectMakerModel::setVertexShader(const QString &newVertexShader)
m_vertexShader = newVertexShader; m_vertexShader = newVertexShader;
} }
const QString &EffectMakerModel::qmlComponentString() const
{
return m_qmlComponentString;
}
const QList<Uniform *> EffectMakerModel::allUniforms() const QList<Uniform *> EffectMakerModel::allUniforms()
{ {
QList<Uniform *> uniforms = {}; QList<Uniform *> uniforms = {};
@@ -601,7 +612,7 @@ QString EffectMakerModel::generateVertexShader(bool includeUniforms)
const bool removeTags = includeUniforms; const bool removeTags = includeUniforms;
s += getDefineProperties(); s += getDefineProperties();
s += getConstVariables(); // s += getConstVariables(); // Not sure yet, will check on this later
// When the node is complete, add shader code in correct nodes order // When the node is complete, add shader code in correct nodes order
// split to root and main parts // split to root and main parts
@@ -661,7 +672,7 @@ QString EffectMakerModel::generateFragmentShader(bool includeUniforms)
const bool removeTags = includeUniforms; const bool removeTags = includeUniforms;
s += getDefineProperties(); s += getDefineProperties();
s += getConstVariables(); // s += getConstVariables(); // Not sure yet, will check on this later
// When the node is complete, add shader code in correct nodes order // When the node is complete, add shader code in correct nodes order
// split to root and main parts // split to root and main parts
@@ -787,14 +798,14 @@ void EffectMakerModel::bakeShaders()
// First update the features based on shader content // First update the features based on shader content
// This will make sure that next calls to "generate" will produce correct uniforms. // This will make sure that next calls to "generate" will produce correct uniforms.
m_shaderFeatures.update(generateVertexShader(false), generateFragmentShader(false), m_previewEffectPropertiesString); m_shaderFeatures.update(generateVertexShader(false), generateFragmentShader(false),
m_previewEffectPropertiesString);
updateCustomUniforms(); updateCustomUniforms();
setVertexShader(generateVertexShader()); setVertexShader(generateVertexShader());
QString vs = m_vertexShader; QString vs = m_vertexShader;
m_baker.setSourceString(vs.toUtf8(), QShader::VertexStage); m_baker.setSourceString(vs.toUtf8(), QShader::VertexStage);
QShader vertShader = m_baker.bake(); QShader vertShader = m_baker.bake();
if (!vertShader.isValid()) { if (!vertShader.isValid()) {
qWarning() << "Shader baking failed:" << qPrintable(m_baker.errorMessage()); qWarning() << "Shader baking failed:" << qPrintable(m_baker.errorMessage());
@@ -840,5 +851,20 @@ void EffectMakerModel::setShadersUpToDate(bool UpToDate)
emit shadersUpToDateChanged(); emit shadersUpToDateChanged();
} }
QString EffectMakerModel::getQmlComponentString(bool localFiles)
{
Q_UNUSED(localFiles)
// TODO
return QString();
}
void EffectMakerModel::updateQmlComponent()
{
// Clear possible QML runtime errors
resetEffectError(ErrorQMLRuntime);
m_qmlComponentString = getQmlComponentString(false);
}
} // namespace EffectMaker } // namespace EffectMaker

View File

@@ -36,6 +36,8 @@ class EffectMakerModel : public QAbstractListModel
Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged) Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged)
Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged) Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged)
Q_PROPERTY(bool shadersUpToDate READ shadersUpToDate WRITE setShadersUpToDate NOTIFY shadersUpToDateChanged) Q_PROPERTY(bool shadersUpToDate READ shadersUpToDate WRITE setShadersUpToDate NOTIFY shadersUpToDateChanged)
Q_PROPERTY(QString qmlComponentString READ qmlComponentString)
public: public:
EffectMakerModel(QObject *parent = nullptr); EffectMakerModel(QObject *parent = nullptr);
@@ -61,6 +63,11 @@ public:
QString vertexShader() const; QString vertexShader() const;
void setVertexShader(const QString &newVertexShader); void setVertexShader(const QString &newVertexShader);
const QString &qmlComponentString() const;
void setQmlComponentString(const QString &string);
Q_INVOKABLE void updateQmlComponent();
signals: signals:
void isEmptyChanged(); void isEmptyChanged();
void selectedIndexChanged(int idx); void selectedIndexChanged(int idx);
@@ -117,6 +124,8 @@ private:
void updateCustomUniforms(); void updateCustomUniforms();
void bakeShaders(); void bakeShaders();
QString getQmlComponentString(bool localFiles);
QList<CompositionNode *> m_nodes; QList<CompositionNode *> m_nodes;
int m_selectedIndex = -1; int m_selectedIndex = -1;
@@ -139,6 +148,7 @@ private:
QString m_exportedEffectPropertiesString; QString m_exportedEffectPropertiesString;
// Used in preview QML, at ShaderEffect component of the file // Used in preview QML, at ShaderEffect component of the file
QString m_previewEffectPropertiesString; QString m_previewEffectPropertiesString;
QString m_qmlComponentString;
const QRegularExpression m_spaceReg = QRegularExpression("\\s+"); const QRegularExpression m_spaceReg = QRegularExpression("\\s+");
}; };