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