From a5fb9fc95f8399365d1002d1114d7521a32bb68e Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 5 Dec 2022 15:54:45 +0200 Subject: [PATCH] QmlDesigner: Add "Apply as light probe" option to material browser Textures in material browser can now be applied as light probes to the active SceneEnvironment node. Also changed the logic for resolving the active SceneEnvironment node to prefer a currently single-selected SceneEnvironment node over the SceneEnvironment node associated with currently active 3D scene. Fixes: QDS-8472 Change-Id: I9a3a7b9c2fad3c8120e85ade507a7ea66de19f1d Reviewed-by: Mahmoud Badri --- .../TextureBrowserContextMenu.qml | 7 ++++ .../qmldesigner/components/createtexture.cpp | 5 ++- .../qmldesigner/components/createtexture.h | 3 +- .../materialbrowsertexturesmodel.cpp | 28 ++++++++++++++ .../materialbrowsertexturesmodel.h | 10 +++++ .../materialbrowser/materialbrowserview.cpp | 37 +++++++------------ 6 files changed, 64 insertions(+), 26 deletions(-) diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureBrowserContextMenu.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureBrowserContextMenu.qml index 5081356b29f..4ac0d72635f 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureBrowserContextMenu.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureBrowserContextMenu.qml @@ -15,6 +15,7 @@ StudioControls.Menu { function popupMenu(targetTexture = null) { this.targetTexture = targetTexture + materialBrowserTexturesModel.updateSceneEnvState() popup() } @@ -32,6 +33,12 @@ StudioControls.Menu { onTriggered: materialBrowserTexturesModel.applyToSelectedMaterial(root.targetTexture.textureInternalId) } + StudioControls.MenuItem { + text: qsTr("Apply as light probe") + enabled: root.targetTexture && materialBrowserTexturesModel.hasSceneEnv + onTriggered: materialBrowserTexturesModel.applyAsLightProbe(root.targetTexture.textureInternalId) + } + StudioControls.MenuSeparator {} StudioControls.MenuItem { diff --git a/src/plugins/qmldesigner/components/createtexture.cpp b/src/plugins/qmldesigner/components/createtexture.cpp index c7ab9701a98..91e40959806 100644 --- a/src/plugins/qmldesigner/components/createtexture.cpp +++ b/src/plugins/qmldesigner/components/createtexture.cpp @@ -99,8 +99,11 @@ void CreateTexture::assignTextureAsLightProbe(const ModelNode &texture, int scen ModelNode CreateTexture::resolveSceneEnv(int sceneId) { ModelNode activeSceneEnv; + ModelNode selectedNode = m_view->firstSelectedModelNode(); - if (sceneId != -1) { + if (selectedNode.metaInfo().isQtQuick3DSceneEnvironment()) { + activeSceneEnv = selectedNode; + } else if (sceneId != -1) { ModelNode activeScene = m_view->active3DSceneNode(); if (activeScene.isValid()) { QmlObjectNode view3D; diff --git a/src/plugins/qmldesigner/components/createtexture.h b/src/plugins/qmldesigner/components/createtexture.h index ba29397c205..3898b67862f 100644 --- a/src/plugins/qmldesigner/components/createtexture.h +++ b/src/plugins/qmldesigner/components/createtexture.h @@ -17,13 +17,12 @@ public: CreateTexture(AbstractView *view, bool importFiles = false); void execute(const QString &filePath, AddTextureMode mode, int sceneId); ModelNode resolveSceneEnv(int sceneId); + void assignTextureAsLightProbe(const ModelNode &texture, int sceneId); private: bool addFileToProject(const QString &filePath); ModelNode createTextureFromImage(const QString &assetPath, AddTextureMode mode); - void assignTextureAsLightProbe(const ModelNode &texture, int sceneId); - private: AbstractView *m_view = nullptr; bool m_importFile = false; diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp index 0184b1cae15..b732b9265e0 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp @@ -214,6 +214,20 @@ void MaterialBrowserTexturesModel::setHasSingleModelSelection(bool b) emit hasSingleModelSelectionChanged(); } +bool MaterialBrowserTexturesModel::hasSceneEnv() const +{ + return m_hasSceneEnv; +} + +void MaterialBrowserTexturesModel::setHasSceneEnv(bool b) +{ + if (b == m_hasSceneEnv) + return; + + m_hasSceneEnv = b; + emit hasSceneEnvChanged(); +} + void MaterialBrowserTexturesModel::resetModel() { beginResetModel(); @@ -273,4 +287,18 @@ void MaterialBrowserTexturesModel::openTextureEditor() QmlDesignerPlugin::instance()->mainWidget()->showDockWidget("TextureEditor", true); } +void MaterialBrowserTexturesModel::updateSceneEnvState() +{ + emit updateSceneEnvStateRequested(); +} + +void MaterialBrowserTexturesModel::applyAsLightProbe(qint64 internalId) +{ + int idx = m_textureIndexHash.value(internalId); + if (idx != -1) { + ModelNode tex = m_textureList.at(idx); + emit applyAsLightProbeRequested(tex); + } +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h index a1db791beaf..53b27e68a6c 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h @@ -18,6 +18,7 @@ class MaterialBrowserTexturesModel : public QAbstractListModel Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged) Q_PROPERTY(bool hasSingleModelSelection READ hasSingleModelSelection WRITE setHasSingleModelSelection NOTIFY hasSingleModelSelectionChanged) + Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv NOTIFY hasSceneEnvChanged) public: MaterialBrowserTexturesModel(QObject *parent = nullptr); @@ -41,6 +42,9 @@ public: bool hasSingleModelSelection() const; void setHasSingleModelSelection(bool b); + bool hasSceneEnv() const; + void setHasSceneEnv(bool b); + bool isEmpty() const { return m_isEmpty; } void resetModel(); @@ -52,6 +56,8 @@ public: Q_INVOKABLE void applyToSelectedMaterial(qint64 internalId); Q_INVOKABLE void applyToSelectedModel(qint64 internalId); Q_INVOKABLE void openTextureEditor(); + Q_INVOKABLE void updateSceneEnvState(); + Q_INVOKABLE void applyAsLightProbe(qint64 internalId); signals: void isEmptyChanged(); @@ -61,6 +67,9 @@ signals: void applyToSelectedMaterialTriggered(const QmlDesigner::ModelNode &texture); void applyToSelectedModelTriggered(const QmlDesigner::ModelNode &texture); void addNewTextureTriggered(); + void updateSceneEnvStateRequested(); + void hasSceneEnvChanged(); + void applyAsLightProbeRequested(const QmlDesigner::ModelNode &texture); private: bool isTextureVisible(int idx) const; @@ -74,6 +83,7 @@ private: int m_selectedIndex = 0; bool m_isEmpty = true; bool m_hasSingleModelSelection = false; + bool m_hasSceneEnv = false; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 37fd15000da..997e7ab563a 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -4,6 +4,7 @@ #include "materialbrowserview.h" #include "bindingproperty.h" +#include "createtexture.h" #include "materialbrowsermodel.h" #include "materialbrowsertexturesmodel.h" #include "materialbrowserwidget.h" @@ -186,6 +187,19 @@ WidgetInfo MaterialBrowserView::widgetInfo() connect(texturesModel, &MaterialBrowserTexturesModel::addNewTextureTriggered, this, [&] { emitCustomNotification("add_new_texture"); }); + + connect(texturesModel, &MaterialBrowserTexturesModel::updateSceneEnvStateRequested, this, [&]() { + ModelNode activeSceneEnv = CreateTexture(this).resolveSceneEnv(m_sceneId); + const bool sceneEnvExists = activeSceneEnv.isValid(); + m_widget->materialBrowserTexturesModel()->setHasSceneEnv(sceneEnvExists); + }); + + connect(texturesModel, &MaterialBrowserTexturesModel::applyAsLightProbeRequested, this, + [&] (const ModelNode &texture) { + executeInTransaction(__FUNCTION__, [&] { + CreateTexture(this).assignTextureAsLightProbe(texture, m_sceneId); + }); + }); } return createWidgetInfo(m_widget.data(), @@ -458,29 +472,6 @@ void MaterialBrowserView::active3DSceneChanged(qint32 sceneId) m_sceneId = sceneId; } -ModelNode MaterialBrowserView::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")); - } - } - - return activeSceneEnv; -} - void MaterialBrowserView::instancesCompleted(const QVector &completedNodeList) { for (const ModelNode &node : completedNodeList) {