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