QmlDesigner: Add shader overrides for materials and models in 3D view

It is now possible to override all materials and models used in the
scene with options available in QtQuick3D.DebugSettings. The overrides
are assigned per-split.

Fixes: QDS-11068
Change-Id: I3a3bc372e860d7f61942eb40166464c9c86efd8e
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Mats Honkamaa <mats.honkamaa@qt.io>
This commit is contained in:
Miikka Heikkinen
2023-10-31 15:15:11 +02:00
parent 6a4850b1d8
commit 23f12f7b42
10 changed files with 291 additions and 5 deletions

View File

@@ -1,9 +1,9 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
import QtQuick 6.0
import QtQuick3D 6.0
import MouseArea3D 1.0
import QtQuick
import QtQuick3D
import MouseArea3D
Item {
id: viewRoot
@@ -17,6 +17,8 @@ Item {
property var overlayViews: [overlayView0, overlayView1, overlayView2, overlayView3]
property var cameraControls: [cameraControl0, cameraControl1, cameraControl2, cameraControl3]
property var viewRects: [viewRect0, viewRect1, viewRect2, viewRect3]
property var materialOverrides: [DebugSettings.None, DebugSettings.None, DebugSettings.None, DebugSettings.None]
property var showWireframes: [false, false, false, false]
property var activeEditView: editViews[activeSplit]
property var activeOverlayView: overlayViews[activeSplit]
property string sceneId
@@ -56,6 +58,7 @@ Item {
signal commitObjectProperty(var objects, var propNames)
signal changeObjectProperty(var objects, var propNames)
signal notifyActiveSceneChange()
signal notifyActiveSplitChange(int index)
onUsePerspectiveChanged: _generalHelper.storeToolState(sceneId, "usePerspective", usePerspective)
onShowEditLightChanged: _generalHelper.storeToolState(sceneId, "showEditLight", showEditLight)
@@ -68,6 +71,8 @@ Item {
onShowParticleEmitterChanged: _generalHelper.storeToolState(sceneId, "showParticleEmitter", showParticleEmitter);
onSelectionModeChanged: _generalHelper.storeToolState(sceneId, "selectionMode", selectionMode);
onTransformModeChanged: _generalHelper.storeToolState(sceneId, "transformMode", transformMode);
onMaterialOverridesChanged: _generalHelper.storeToolState(sceneId, "matOverride", materialOverrides);
onShowWireframesChanged: _generalHelper.storeToolState(sceneId, "showWireframe", showWireframes);
onSplitViewChanged: {
_generalHelper.storeToolState(sceneId, "splitView", splitView);
_generalHelper.requestOverlayUpdate();
@@ -75,6 +80,7 @@ Item {
onActiveSplitChanged: {
_generalHelper.storeToolState(sceneId, "activeSplit", activeSplit);
cameraControls[activeSplit].forceActiveFocus();
notifyActiveSplitChange(activeSplit);
}
onActiveSceneChanged: updateActiveScene()
@@ -96,7 +102,9 @@ Item {
"gridColor": gridColor,
"importScene": activeScene,
"cameraLookAt": cameraControls[i]._lookAtPoint,
"z": 1});
"z": 1,
"sceneEnv.debugSettings.materialOverride": materialOverrides[i],
"sceneEnv.debugSettings.wireframeEnabled": showWireframes[i]});
editViews[i].usePerspective = Qt.binding(function() {return usePerspective;});
editViews[i].showSceneLight = Qt.binding(function() {return showEditLight;});
editViews[i].showGrid = Qt.binding(function() {return showGrid;});
@@ -107,6 +115,16 @@ Item {
editViews[2].cameraLookAt = Qt.binding(function() {return cameraControl2._lookAtPoint;});
editViews[3].cameraLookAt = Qt.binding(function() {return cameraControl3._lookAtPoint;});
editViews[0].sceneEnv.debugSettings.materialOverride = Qt.binding(function() {return materialOverrides[0];});
editViews[1].sceneEnv.debugSettings.materialOverride = Qt.binding(function() {return materialOverrides[1];});
editViews[2].sceneEnv.debugSettings.materialOverride = Qt.binding(function() {return materialOverrides[2];});
editViews[3].sceneEnv.debugSettings.materialOverride = Qt.binding(function() {return materialOverrides[3];});
editViews[0].sceneEnv.debugSettings.wireframeEnabled = Qt.binding(function() {return showWireframes[0];});
editViews[1].sceneEnv.debugSettings.wireframeEnabled = Qt.binding(function() {return showWireframes[1];});
editViews[2].sceneEnv.debugSettings.wireframeEnabled = Qt.binding(function() {return showWireframes[2];});
editViews[3].sceneEnv.debugSettings.wireframeEnabled = Qt.binding(function() {return showWireframes[3];});
selectionBoxCount = 0;
editViewsChanged();
return true;
@@ -340,6 +358,16 @@ Item {
activeSplit = toolStates.activeSplit;
else if (resetToDefault)
activeSplit = 0;
if ("showWireframe" in toolStates)
showWireframes = toolStates.showWireframe;
else if (resetToDefault)
showWireframes = [false, false, false, false];
if ("matOverride" in toolStates)
materialOverrides = toolStates.matOverride;
else if (resetToDefault)
materialOverrides = [DebugSettings.None, DebugSettings.None, DebugSettings.None, DebugSettings.None];
}
function storeCurrentToolStates()
@@ -357,6 +385,8 @@ Item {
_generalHelper.storeToolState(sceneId, "transformMode", transformMode);
_generalHelper.storeToolState(sceneId, "splitView", splitView)
_generalHelper.storeToolState(sceneId, "activeSplit", activeSplit)
_generalHelper.storeToolState(sceneId, "showWireframe", showWireframes)
_generalHelper.storeToolState(sceneId, "matOverride", materialOverrides)
for (var i = 0; i < 4; ++i)
cameraControls[i].storeCameraState(0);

View File

@@ -881,6 +881,12 @@ void Qt5InformationNodeInstanceServer::handleActiveSceneChange()
#endif
}
void Qt5InformationNodeInstanceServer::handleActiveSplitChange(int index)
{
nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::ActiveSplitChanged,
index});
}
void Qt5InformationNodeInstanceServer::handleToolStateChanged(const QString &sceneId,
const QString &tool,
const QVariant &toolState)
@@ -1860,6 +1866,8 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(
this, SLOT(handleObjectPropertyChange(QVariant, QVariant)));
QObject::connect(m_editView3DData.rootItem, SIGNAL(notifyActiveSceneChange()),
this, SLOT(handleActiveSceneChange()));
QObject::connect(m_editView3DData.rootItem, SIGNAL(notifyActiveSplitChange(int)),
this, SLOT(handleActiveSplitChange(int)));
QObject::connect(&m_propertyChangeTimer, &QTimer::timeout,
this, &Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout);
QObject::connect(&m_selectionChangeTimer, &QTimer::timeout,
@@ -2503,6 +2511,12 @@ void Qt5InformationNodeInstanceServer::view3DAction(const View3DActionCommand &c
case View3DActionType::SplitViewToggle:
updatedToolState.insert("splitView", command.isEnabled());
break;
case View3DActionType::ShowWireframe:
updatedToolState.insert("showWireframe", command.value().toList());
break;
case View3DActionType::MaterialOverride:
updatedToolState.insert("matOverride", command.value().toList());
break;
default:
break;

View File

@@ -68,6 +68,7 @@ private slots:
void handleObjectPropertyCommit(const QVariant &objects, const QVariant &propNames);
void handleObjectPropertyChange(const QVariant &objects, const QVariant &propNames);
void handleActiveSceneChange();
void handleActiveSplitChange(int index);
void handleToolStateChanged(const QString &sceneId, const QString &tool,
const QVariant &toolState);
void handleView3DSizeChange();