aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2022-11-28 16:51:42 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2022-11-29 11:06:54 +0000
commit26c1747ae658a251bc9c6dd6784a7c8c0037a1ea (patch)
tree1193e6b166f1c4122483bd3bfa2d0bc5c931c474
parent86ed12e7299c1e6be61f6c42c486acb6fcd4c0de (diff)
QmlDesigner: Fix issues with adding texture as light probe
Changed resolving the currently active scene environment to be done on demand instead of trying to track it realtime, since resolving it is relatively cheap operation, so it doesn't cause noticeable delay at context menu opening. The alternative would be to implement multiple different notification handlers in ContentLibraryView, which would slow down all operations and would be much more complex to ensure all edge cases are covered. Fixes: QDS-8437 Change-Id: Ib33cd1ad549d836b9d780f9b0f92e70d223e2a25 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r--share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml1
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp69
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h3
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp5
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h2
5 files changed, 49 insertions, 31 deletions
diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml
index 61bd0ebfd7..f9d3d88a78 100644
--- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml
+++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryTextureContextMenu.qml
@@ -15,6 +15,7 @@ StudioControls.Menu {
function popupMenu(targetTexture = null)
{
this.targetTexture = targetTexture
+ rootView.updateSceneEnvState();
popup()
}
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
index ae1d87276b..347512a837 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
@@ -3,7 +3,6 @@
#include "contentlibraryview.h"
-#include "bindingproperty.h"
#include "contentlibrarybundleimporter.h"
#include "contentlibrarywidget.h"
#include "contentlibrarymaterial.h"
@@ -88,11 +87,14 @@ WidgetInfo ContentLibraryView::widgetInfo()
}
// assign the texture as scene environment's light probe
- if (mode == ContentLibraryWidget::AddTextureMode::LightProbe && m_activeSceneEnv.isValid()) {
- BindingProperty lightProbeProp = m_activeSceneEnv.bindingProperty("lightProbe");
- lightProbeProp.setExpression(texNode.id());
- VariantProperty bgModeProp = m_activeSceneEnv.variantProperty("backgroundMode");
- bgModeProp.setValue(QVariant::fromValue(Enumeration("SceneEnvironment", "SkyBox")));
+ if (mode == ContentLibraryWidget::AddTextureMode::LightProbe && m_sceneId != -1) {
+ QmlObjectNode sceneEnv = resolveSceneEnv();
+ if (sceneEnv.isValid()) {
+ sceneEnv.setBindingProperty("lightProbe", texNode.id());
+ sceneEnv.setVariantProperty("backgroundMode",
+ QVariant::fromValue(Enumeration("SceneEnvironment",
+ "SkyBox")));
+ }
}
QTimer::singleShot(0, this, [this, texNode]() {
if (model() && texNode.isValid())
@@ -101,6 +103,9 @@ WidgetInfo ContentLibraryView::widgetInfo()
});
});
+ connect(m_widget, &ContentLibraryWidget::updateSceneEnvStateRequested,
+ this, &ContentLibraryView::resolveSceneEnv);
+
ContentLibraryMaterialsModel *materialsModel = m_widget->materialsModel().data();
connect(materialsModel, &ContentLibraryMaterialsModel::applyToSelectedTriggered, this,
@@ -187,30 +192,7 @@ void ContentLibraryView::importsChanged(const QList<Import> &addedImports, const
void ContentLibraryView::active3DSceneChanged(qint32 sceneId)
{
- m_activeSceneEnv = {};
- bool sceneEnvExists = false;
- if (sceneId != -1) {
- ModelNode activeScene = active3DSceneNode();
- if (activeScene.isValid()) {
- ModelNode view3D;
- if (activeScene.metaInfo().isQtQuick3DView3D()) {
- view3D = activeScene;
- } else {
- ModelNode sceneParent = activeScene.parentProperty().parentModelNode();
- if (sceneParent.metaInfo().isQtQuick3DView3D())
- view3D = sceneParent;
- }
-
- if (view3D.isValid()) {
- m_activeSceneEnv = modelNodeForId(view3D.bindingProperty("environment").expression());
- if (m_activeSceneEnv.isValid())
- sceneEnvExists = true;
- }
- }
- }
-
- m_widget->texturesModel()->setHasSceneEnv(sceneEnvExists);
- m_widget->environmentsModel()->setHasSceneEnv(sceneEnvExists);
+ m_sceneId = sceneId;
}
void ContentLibraryView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
@@ -361,6 +343,33 @@ ModelNode ContentLibraryView::createMaterial(const NodeMetaInfo &metaInfo)
return newMatNode;
}
+ModelNode ContentLibraryView::resolveSceneEnv()
+{
+ ModelNode activeSceneEnv;
+
+ if (m_sceneId != -1) {
+ ModelNode activeScene = active3DSceneNode();
+ if (activeScene.isValid()) {
+ QmlObjectNode view3D;
+ if (activeScene.metaInfo().isQtQuick3DView3D()) {
+ view3D = activeScene;
+ } else {
+ ModelNode sceneParent = activeScene.parentProperty().parentModelNode();
+ if (sceneParent.metaInfo().isQtQuick3DView3D())
+ view3D = sceneParent;
+ }
+ if (view3D.isValid())
+ activeSceneEnv = modelNodeForId(view3D.expression("environment"));
+ }
+ }
+
+ const bool sceneEnvExists = activeSceneEnv.isValid();
+ m_widget->texturesModel()->setHasSceneEnv(sceneEnvExists);
+ m_widget->environmentsModel()->setHasSceneEnv(sceneEnvExists);
+
+ return activeSceneEnv;
+}
+
void ContentLibraryView::updateBundleMaterialsImportedState()
{
using namespace Utils;
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
index aae27c9140..5b4914a50c 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
@@ -43,15 +43,16 @@ private:
void applyBundleMaterialToDropTarget(const ModelNode &bundleMat, const NodeMetaInfo &metaInfo = {});
ModelNode getBundleMaterialDefaultInstance(const TypeName &type);
ModelNode createMaterial(const NodeMetaInfo &metaInfo);
+ ModelNode resolveSceneEnv();
QPointer<ContentLibraryWidget> m_widget;
QList<ModelNode> m_bundleMaterialTargets;
QList<ModelNode> m_selectedModels; // selected 3D model nodes
ContentLibraryMaterial *m_draggedBundleMaterial = nullptr;
ContentLibraryTexture *m_draggedBundleTexture = nullptr;
- ModelNode m_activeSceneEnv;
bool m_bundleMaterialAddToSelected = false;
bool m_hasQuick3DImport = false;
+ qint32 m_sceneId = -1;
};
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp
index 729e41b693..75eff3af98 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp
@@ -221,6 +221,11 @@ void ContentLibraryWidget::addLightProbe(ContentLibraryTexture *tex)
emit addTextureRequested(tex->path(), AddTextureMode::LightProbe);
}
+void ContentLibraryWidget::updateSceneEnvState()
+{
+ emit updateSceneEnvStateRequested();
+}
+
QPointer<ContentLibraryMaterialsModel> ContentLibraryWidget::materialsModel() const
{
return m_materialsModel;
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h
index ec0b26cbc2..4d77068632 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h
@@ -44,6 +44,7 @@ public:
Q_INVOKABLE void addImage(QmlDesigner::ContentLibraryTexture *tex);
Q_INVOKABLE void addTexture(QmlDesigner::ContentLibraryTexture *tex);
Q_INVOKABLE void addLightProbe(QmlDesigner::ContentLibraryTexture *tex);
+ Q_INVOKABLE void updateSceneEnvState();
enum class AddTextureMode { Image, Texture, LightProbe };
@@ -51,6 +52,7 @@ signals:
void bundleMaterialDragStarted(QmlDesigner::ContentLibraryMaterial *bundleMat);
void bundleTextureDragStarted(QmlDesigner::ContentLibraryTexture *bundleTex);
void addTextureRequested(const QString texPath, QmlDesigner::ContentLibraryWidget::AddTextureMode mode);
+ void updateSceneEnvStateRequested();
protected:
bool eventFilter(QObject *obj, QEvent *event) override;