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) {