diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2024-04-29 16:15:43 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2024-04-29 13:33:13 +0000 |
commit | 7a9a30d68ccd6be88a006443acf363e4b596c922 (patch) | |
tree | c389eb6415fa0cd36b809759ed6c3d4e126b8102 | |
parent | c9c3303ad889b011460cb0d5a7a0cb5ccc290789 (diff) |
QmlDesigner: Add reflection probe icon gizmo
Fixes: QDS-11964
Change-Id: I35fce676c282988e7faa1376da90e4cd53f353ae
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
-rw-r--r-- | src/tools/qml2puppet/editor3d_qt6.qrc | 3 | ||||
-rw-r--r-- | src/tools/qml2puppet/mockfiles/images/reflectionprobe.png | bin | 0 -> 463 bytes | |||
-rw-r--r-- | src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png | bin | 0 -> 887 bytes | |||
-rw-r--r-- | src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml | 18 | ||||
-rw-r--r-- | src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml | 102 | ||||
-rw-r--r-- | src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml | 9 | ||||
-rw-r--r-- | src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp | 28 | ||||
-rw-r--r-- | src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h | 2 |
8 files changed, 148 insertions, 14 deletions
diff --git a/src/tools/qml2puppet/editor3d_qt6.qrc b/src/tools/qml2puppet/editor3d_qt6.qrc index d76b1941b9..c437bad9ad 100644 --- a/src/tools/qml2puppet/editor3d_qt6.qrc +++ b/src/tools/qml2puppet/editor3d_qt6.qrc @@ -19,6 +19,8 @@ <file>mockfiles/images/spot@2x.png</file> <file>mockfiles/images/preview_landscape.hdr</file> <file>mockfiles/images/preview_studio.hdr</file> + <file>mockfiles/images/reflectionprobe.png</file> + <file>mockfiles/images/reflectionprobe@2x.png</file> <file>mockfiles/qt6/AdjustableArrow.qml</file> <file>mockfiles/qt6/Arrow.qml</file> <file>mockfiles/qt6/AutoScaleHelper.qml</file> @@ -50,6 +52,7 @@ <file>mockfiles/qt6/PlanarMoveHandle.qml</file> <file>mockfiles/qt6/PlanarScaleHandle.qml</file> <file>mockfiles/qt6/ReflectionProbeBox.qml</file> + <file>mockfiles/qt6/ReflectionProbeGizmo.qml</file> <file>mockfiles/qt6/RotateGizmo.qml</file> <file>mockfiles/qt6/RotateRing.qml</file> <file>mockfiles/qt6/ScaleGizmo.qml</file> diff --git a/src/tools/qml2puppet/mockfiles/images/reflectionprobe.png b/src/tools/qml2puppet/mockfiles/images/reflectionprobe.png Binary files differnew file mode 100644 index 0000000000..4f31a98f65 --- /dev/null +++ b/src/tools/qml2puppet/mockfiles/images/reflectionprobe.png diff --git a/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png b/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png Binary files differnew file mode 100644 index 0000000000..2aa3124a41 --- /dev/null +++ b/src/tools/qml2puppet/mockfiles/images/reflectionprobe@2x.png diff --git a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml index e3448ff77c..381f3b11d1 100644 --- a/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml +++ b/src/tools/qml2puppet/mockfiles/qt6/EditView3D.qml @@ -523,6 +523,12 @@ Item { overlayViews[i].addParticleEmitterGizmo(scene, obj); } + function addReflectionProbeGizmo(scene, obj) + { + for (var i = 0; i < 4; ++i) + overlayViews[i].addReflectionProbeGizmo(scene, obj); + } + function releaseLightGizmo(obj) { for (var i = 0; i < 4; ++i) @@ -547,6 +553,12 @@ Item { overlayViews[i].releaseParticleEmitterGizmo(obj); } + function releaseReflectionProbeGizmo(obj) + { + for (var i = 0; i < 4; ++i) + overlayViews[i].releaseReflectionProbeGizmo(obj); + } + function updateLightGizmoScene(scene, obj) { for (var i = 0; i < 4; ++i) @@ -571,6 +583,12 @@ Item { overlayViews[i].updateParticleEmitterGizmoScene(scene, obj); } + function updateReflectionProbeGizmoScene(scene, obj) + { + for (var i = 0; i < 4; ++i) + overlayViews[i].updateReflectionProbeGizmoScene(scene, obj); + } + function resolveSplitPoint(x, y) { if (!splitView || activeSplit === 0) diff --git a/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml b/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml index 13a37f4f72..71f2250b7c 100644 --- a/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml +++ b/src/tools/qml2puppet/mockfiles/qt6/OverlayView3D.qml @@ -21,6 +21,7 @@ View3D { property var cameraGizmos: [] property var particleSystemIconGizmos: [] property var particleEmitterGizmos: [] + property var reflectionProbeGizmos: [] signal commitObjectProperty(var objects, var propNames) signal changeObjectProperty(var objects, var propNames) @@ -288,66 +289,141 @@ View3D { } } + function addReflectionProbeGizmo(scene, obj) + { + // Insert into first available gizmo if we don't already have gizmo for this object + var slotFound = -1; + for (var i = 0; i < reflectionProbeGizmos.length; ++i) { + if (!reflectionProbeGizmos[i].targetNode) { + slotFound = i; + } else if (reflectionProbeGizmos[i].targetNode === obj) { + reflectionProbeGizmos[i].scene = scene; + return; + } + } + + if (slotFound !== -1) { + reflectionProbeGizmos[slotFound].scene = scene; + reflectionProbeGizmos[slotFound].targetNode = obj; + reflectionProbeGizmos[slotFound].locked = _generalHelper.isLocked(obj); + reflectionProbeGizmos[slotFound].hidden = _generalHelper.isHidden(obj); + return; + } + + // No free gizmos available, create a new one + var gizmoComponent = Qt.createComponent("ReflectionProbeGizmo.qml"); + if (gizmoComponent.status === Component.Ready) { + var gizmo = gizmoComponent.createObject(overlayView, + {"view3D": overlayView, + "targetNode": obj, + "selectedNodes": viewRoot.selectedNodes, + "scene": scene, + "activeScene": viewRoot.activeScene, + "locked": _generalHelper.isLocked(obj), + "hidden": _generalHelper.isHidden(obj), + "globalShow": viewRoot.showIconGizmo}); + reflectionProbeGizmos[reflectionProbeGizmos.length] = gizmo; + gizmo.clicked.connect(viewRoot.handleObjectClicked); + gizmo.selectedNodes = Qt.binding(function() {return viewRoot.selectedNodes;}); + gizmo.activeScene = Qt.binding(function() {return viewRoot.activeScene;}); + gizmo.globalShow = Qt.binding(function() {return viewRoot.showIconGizmo;}); + } + } + + function releaseReflectionProbeGizmo(obj) + { + for (var i = 0; i < reflectionProbeGizmos.length; ++i) { + if (reflectionProbeGizmos[i].targetNode === obj) { + reflectionProbeGizmos[i].scene = null; + reflectionProbeGizmos[i].targetNode = null; + return; + } + } + } + + function updateReflectionProbeGizmoScene(scene, obj) + { + for (var i = 0; i < reflectionProbeGizmos.length; ++i) { + if (reflectionProbeGizmos[i].targetNode === obj) { + reflectionProbeGizmos[i].scene = scene; + return; + } + } + } + function gizmoAt(x, y) { - for (var i = 0; i < lightIconGizmos.length; ++i) { + let i = 0; + for (; i < lightIconGizmos.length; ++i) { if (lightIconGizmos[i].visible && lightIconGizmos[i].hasPoint(x, y)) return lightIconGizmos[i].targetNode; } - for (var i = 0; i < cameraGizmos.length; ++i) { + for (i = 0; i < cameraGizmos.length; ++i) { if (cameraGizmos[i].visible && cameraGizmos[i].hasPoint(x, y)) return cameraGizmos[i].targetNode; } - for (var i = 0; i < particleSystemIconGizmos.length; ++i) { + for (i = 0; i < particleSystemIconGizmos.length; ++i) { if (particleSystemIconGizmos[i].visible && particleSystemIconGizmos[i].hasPoint(x, y)) return particleSystemIconGizmos[i].targetNode; } + for (i = 0; i < reflectionProbeGizmos.length; ++i) { + if (reflectionProbeGizmos[i].visible && reflectionProbeGizmos[i].hasPoint(x, y)) + return reflectionProbeGizmos[i].targetNode; + } return null; } function handleLockedStateChange(node) { - for (var i = 0; i < lightIconGizmos.length; ++i) { + let i = 0; + for (; i < lightIconGizmos.length; ++i) { if (lightIconGizmos[i].targetNode === node) { lightIconGizmos[i].locked = _generalHelper.isLocked(node); return; } } - for (var i = 0; i < cameraGizmos.length; ++i) { + for (i = 0; i < cameraGizmos.length; ++i) { if (cameraGizmos[i].targetNode === node) { cameraGizmos[i].locked = _generalHelper.isLocked(node); return; } } - for (var i = 0; i < particleSystemIconGizmos.length; ++i) { + for (i = 0; i < particleSystemIconGizmos.length; ++i) { if (particleSystemIconGizmos[i].targetNode === node) { particleSystemIconGizmos[i].locked = _generalHelper.isLocked(node); return; } } + for (i = 0; i < reflectionProbeGizmos.length; ++i) { + if (reflectionProbeGizmos[i].targetNode === node) { + reflectionProbeGizmos[i].locked = _generalHelper.isLocked(node); + return; + } + } } function handleHiddenStateChange(node) { - for (var i = 0; i < lightIconGizmos.length; ++i) { + let i = 0; + for (; i < lightIconGizmos.length; ++i) { if (lightIconGizmos[i].targetNode === node) { lightIconGizmos[i].hidden = _generalHelper.isHidden(node); return; } } - for (var i = 0; i < cameraGizmos.length; ++i) { + for (i = 0; i < cameraGizmos.length; ++i) { if (cameraGizmos[i].targetNode === node) { cameraGizmos[i].hidden = _generalHelper.isHidden(node); return; } } - for (var i = 0; i < particleSystemIconGizmos.length; ++i) { + for (i = 0; i < particleSystemIconGizmos.length; ++i) { if (particleSystemIconGizmos[i].targetNode === node) { particleSystemIconGizmos[i].hidden = _generalHelper.isHidden(node); return; } } - for (var i = 0; i < particleEmitterGizmos.length; ++i) { + for (i = 0; i < particleEmitterGizmos.length; ++i) { if (particleEmitterGizmos[i].targetNode === node) { particleEmitterGizmos[i].hidden = _generalHelper.isHidden(node); return; @@ -356,6 +432,12 @@ View3D { return; } } + for (i = 0; i < reflectionProbeGizmos.length; ++i) { + if (reflectionProbeGizmos[i].targetNode === node) { + reflectionProbeGizmos[i].hidden = _generalHelper.isHidden(node); + return; + } + } } SceneEnvironment { diff --git a/src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml b/src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml new file mode 100644 index 0000000000..2183e68679 --- /dev/null +++ b/src/tools/qml2puppet/mockfiles/qt6/ReflectionProbeGizmo.qml @@ -0,0 +1,9 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +import QtQuick +import QtQuick3D + +IconGizmo { + iconSource: "qrc:///qtquickplugin/mockfiles/images/reflectionprobe.png" +} diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 6cd39a5a85..705efce2cf 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -74,6 +74,7 @@ #include <QtQuick3D/private/qquick3dscenerootnode_p.h> #include <QtQuick3D/private/qquick3drepeater_p.h> #include <QtQuick3D/private/qquick3dloader_p.h> +#include <QtQuick3D/private/qquick3dreflectionprobe_p.h> #include <QtQuick3D/private/qquick3dsceneenvironment_p.h> #if defined(QUICK3D_ASSET_UTILS_MODULE) #include <private/qquick3druntimeloader_p.h> @@ -979,6 +980,9 @@ void Qt5InformationNodeInstanceServer::handleNode3DDestroyed([[maybe_unused]] QO QMetaObject::invokeMethod(m_editView3DData.rootItem, "releaseParticleEmitterGizmo", Q_ARG(QVariant, objectToVariant(obj))); #endif + } else if (qobject_cast<QQuick3DReflectionProbe *>(obj)) { + QMetaObject::invokeMethod(m_editView3DData.rootItem, "releaseReflectionProbeGizmo", + Q_ARG(QVariant, objectToVariant(obj))); } removeNode3D(obj); #endif @@ -1112,6 +1116,10 @@ void Qt5InformationNodeInstanceServer::resolveSceneRoots() Q_ARG(QVariant, objectToVariant(newRoot)), Q_ARG(QVariant, objectToVariant(node))); #endif + } else if (qobject_cast<QQuick3DReflectionProbe *>(node)) { + QMetaObject::invokeMethod(m_editView3DData.rootItem, "updateReflectionProbeGizmoScene", + Q_ARG(QVariant, objectToVariant(newRoot)), + Q_ARG(QVariant, objectToVariant(node))); } } ++it; @@ -1599,7 +1607,7 @@ QList<ServerNodeInstance> Qt5InformationNodeInstanceServer::createInstances( if (m_editView3DSetupDone) { add3DViewPorts(createdInstances); add3DScenes(createdInstances); - createCameraAndLightGizmos(createdInstances); + createGizmos(createdInstances); } render3DEditView(); @@ -1652,13 +1660,14 @@ void Qt5InformationNodeInstanceServer::handleDynamicAddObjectTimeout() m_dynamicObjectConstructors.clear(); } -void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos( +void Qt5InformationNodeInstanceServer::createGizmos( const QList<ServerNodeInstance> &instanceList) const { QHash<QObject *, QObjectList> cameras; QHash<QObject *, QObjectList> lights; QHash<QObject *, QObjectList> particleSystems; QHash<QObject *, QObjectList> particleEmitters; + QHash<QObject *, QObjectList> reflectionProbes; for (const ServerNodeInstance &instance : instanceList) { if (instance.isSubclassOf("QQuick3DCamera")) { @@ -1671,6 +1680,8 @@ void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos( || instance.isSubclassOf("QQuick3DParticleAttractor")) && !instance.isSubclassOf("QQuick3DParticleTrailEmitter")) { particleEmitters[find3DSceneRoot(instance)] << instance.internalObject(); + } else if (instance.isSubclassOf("QQuick3DReflectionProbe")) { + reflectionProbes[find3DSceneRoot(instance)] << instance.internalObject(); } } @@ -1715,6 +1726,17 @@ void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos( } ++emitterIt; } + + auto refProbeIt = reflectionProbes.constBegin(); + while (refProbeIt != reflectionProbes.constEnd()) { + const auto refProbeObjs = refProbeIt.value(); + for (auto &obj : refProbeObjs) { + QMetaObject::invokeMethod(m_editView3DData.rootItem, "addReflectionProbeGizmo", + Q_ARG(QVariant, objectToVariant(refProbeIt.key())), + Q_ARG(QVariant, objectToVariant(obj))); + } + ++refProbeIt; + } } void Qt5InformationNodeInstanceServer::add3DViewPorts(const QList<ServerNodeInstance> &instanceList) @@ -1977,7 +1999,7 @@ void Qt5InformationNodeInstanceServer::setup3DEditView( updateActiveSceneToEditView3D(); - createCameraAndLightGizmos(instanceList); + createGizmos(instanceList); // Queue two renders to make sure icon gizmos update properly render3DEditView(2); diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index 4f7fcd7177..321751cf23 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -92,7 +92,7 @@ private: void create3DPreviewView(); void setup3DEditView(const QList<ServerNodeInstance> &instanceList, const CreateSceneCommand &command); - void createCameraAndLightGizmos(const QList<ServerNodeInstance> &instanceList) const; + void createGizmos(const QList<ServerNodeInstance> &instanceList) const; void add3DViewPorts(const QList<ServerNodeInstance> &instanceList); void add3DScenes(const QList<ServerNodeInstance> &instanceList); QObject *findView3DForInstance(const ServerNodeInstance &instance) const; |