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 <mahmoud.badri@qt.io>
This commit is contained in:
Miikka Heikkinen
2022-12-05 15:54:45 +02:00
parent 216f3dd243
commit a5fb9fc95f
6 changed files with 64 additions and 26 deletions

View File

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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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<ModelNode> &completedNodeList)
{
for (const ModelNode &node : completedNodeList) {