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