From d8a7c97fcb644a90991904dc7be1f612e2d35ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaj=20Gr=C3=B6nholm?= Date: Mon, 6 Sep 2021 14:24:23 +0300 Subject: [PATCH] Use global picking API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When gobal picking is available (Qt 6.2+), use that instead of toggling models pickable properties. Task-number: QDS-4978 Change-Id: Id2a501ae97955128874447fa8a3b8afab3d1f2c7 Reviewed-by: Tomi Korpipää Reviewed-by: Thomas Hartmann Reviewed-by: Qt CI Bot --- .../mockfiles/qt6/AdjustableArrow.qml | 2 ++ .../mockfiles/qt6/AreaLightHandle.qml | 1 + .../qmlpuppet/mockfiles/qt6/CameraFrustum.qml | 1 + .../mockfiles/qt6/DirectionalDraggable.qml | 1 + .../qmlpuppet/mockfiles/qt6/EditView3D.qml | 3 +- .../qmlpuppet/mockfiles/qt6/FadeHandle.qml | 1 + .../qmlpuppet/mockfiles/qt6/HelperGrid.qml | 4 +++ .../qmlpuppet/mockfiles/qt6/LightModel.qml | 1 + .../qml/qmlpuppet/mockfiles/qt6/Line3D.qml | 1 + .../mockfiles/qt6/MaterialNodeView.qml | 1 + .../qmlpuppet/mockfiles/qt6/ModelNodeView.qml | 1 + .../mockfiles/qt6/PlanarDraggable.qml | 1 + .../qmlpuppet/mockfiles/qt6/RotateGizmo.qml | 1 + .../qmlpuppet/mockfiles/qt6/RotateRing.qml | 1 + .../qmlpuppet/mockfiles/qt6/ScaleGizmo.qml | 1 + .../qml/qmlpuppet/mockfiles/qt6/ScaleRod.qml | 1 + .../qmlpuppet/mockfiles/qt6/SelectionBox.qml | 1 + .../mockfiles/qt6/SpotLightHandle.qml | 1 + .../qml2puppet/editor3d/generalhelper.cpp | 29 +++++++++++++++++++ .../qml2puppet/editor3d/generalhelper.h | 3 ++ .../qt5informationnodeinstanceserver.cpp | 4 +++ 21 files changed, 59 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AdjustableArrow.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AdjustableArrow.qml index d71b245d334..fe5d3bd5edb 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AdjustableArrow.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AdjustableArrow.qml @@ -31,6 +31,7 @@ DirectionalDraggable { id: arrowRoot Model { + readonly property bool _edit3dLocked: true // Make this non-pickable geometry: LineGeometry { id: lineGeometry name: "Edit 3D ScalableArrow" @@ -43,6 +44,7 @@ DirectionalDraggable { Model { id: arrowHead + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Cone" materials: [ arrowRoot.material ] y: arrowRoot.length - 3 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AreaLightHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AreaLightHandle.qml index 78e97e81d42..c2f55bdd432 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AreaLightHandle.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/AreaLightHandle.qml @@ -42,6 +42,7 @@ DirectionalDraggable { Model { id: handle + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Sphere" materials: [ handleRoot.material ] scale: Qt.vector3d(0.02, 0.02, 0.02) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraFrustum.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraFrustum.qml index adf3d53ab9b..2e53ff5d40c 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraFrustum.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/CameraFrustum.qml @@ -35,6 +35,7 @@ Model { property Node targetNode: null property Node scene: null property bool selected: false + readonly property bool _edit3dLocked: true // Make this non-pickable function updateGeometry() { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/DirectionalDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/DirectionalDraggable.qml index 5a2f0911dd8..2be5344521f 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/DirectionalDraggable.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/DirectionalDraggable.qml @@ -41,6 +41,7 @@ Model { property real offset: 0 readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering + readonly property bool _edit3dLocked: true // Make this non-pickable property vector3d _scenePosPressed property real _posPressed diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml index ebc406c5ad7..cd3ec158a4c 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditView3D.qml @@ -721,6 +721,7 @@ Item { Model { id: pivotCap + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Sphere" scale: pivotAutoScale.getScale(Qt.vector3d(0.03, 0.03, 0.03)) position: pivotLine.startPos @@ -760,7 +761,7 @@ Item { onPressed: (mouse)=> { if (viewRoot.editView) { - var pickResult = viewRoot.editView.pick(mouse.x, mouse.y); + var pickResult = _generalHelper.pickViewAt(viewRoot.editView, mouse.x, mouse.y); handleObjectClicked(_generalHelper.resolvePick(pickResult.objectHit), mouse.modifiers & Qt.ControlModifier); diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/FadeHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/FadeHandle.qml index c50406c147f..9ad2cd18bbe 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/FadeHandle.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/FadeHandle.qml @@ -41,6 +41,7 @@ DirectionalDraggable { Model { id: handle + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Sphere" materials: [ handleRoot.material ] scale: Qt.vector3d(0.02, 0.02, 0.02) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/HelperGrid.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/HelperGrid.qml index b7807d8192f..10c7afd65b8 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/HelperGrid.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/HelperGrid.qml @@ -39,6 +39,7 @@ Node { // Note: Only one instance of HelperGrid is supported, as the geometry names are fixed Model { // Main grid lines + readonly property bool _edit3dLocked: true // Make this non-pickable geometry: GridGeometry { id: gridGeometry name: "3D Edit View Helper Grid" @@ -55,6 +56,7 @@ Node { } Model { // Subdivision lines + readonly property bool _edit3dLocked: true // Make this non-pickable geometry: GridGeometry { lines: gridGeometry.lines step: gridGeometry.step @@ -73,6 +75,7 @@ Node { } Model { // Z Axis + readonly property bool _edit3dLocked: true // Make this non-pickable geometry: GridGeometry { lines: gridGeometry.lines step: gridGeometry.step @@ -89,6 +92,7 @@ Node { ] } Model { // X Axis + readonly property bool _edit3dLocked: true // Make this non-pickable eulerRotation.z: 90 geometry: GridGeometry { lines: gridGeometry.lines diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightModel.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightModel.qml index c500f6fbb0e..f517f318d20 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightModel.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/LightModel.qml @@ -33,6 +33,7 @@ Model { property alias geometryName: lightGeometry.name // Name must be unique for each geometry property alias geometryType: lightGeometry.lightType property Material material + readonly property bool _edit3dLocked: true // Make this non-pickable function updateGeometry() { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Line3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Line3D.qml index 7e034ff75f7..f3325bfb343 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Line3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/Line3D.qml @@ -36,6 +36,7 @@ Node { property alias color: lineMat.diffuseColor Model { + readonly property bool _edit3dLocked: true // Make this non-pickable geometry: LineGeometry { id: lineGeometry } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml index 7b5e2a15b21..6103df98c2b 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/MaterialNodeView.qml @@ -52,6 +52,7 @@ View3D { Model { id: model + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Sphere" materials: previewMaterial } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml index 657b0f4c944..7fe6a114163 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ModelNodeView.qml @@ -82,6 +82,7 @@ View3D { Model { id: model + readonly property bool _edit3dLocked: true // Make this non-pickable eulerRotation.y: 45 source: sourceModel.source diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarDraggable.qml index 1a1fea9f9ce..e66d1962a3c 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarDraggable.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/PlanarDraggable.qml @@ -40,6 +40,7 @@ Model { property alias mouseArea: mouseArea readonly property bool hovering: mouseArea.hovering + readonly property bool _edit3dLocked: true // Make this non-pickable property vector3d _scenePosPressed property vector2d _planePosPressed diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateGizmo.qml index 4998974dabf..d77ebc17fb2 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateGizmo.qml @@ -189,6 +189,7 @@ Node { Model { id: freeRotator + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Sphere" materials: DefaultMaterial { id: material diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateRing.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateRing.qml index 385806008ee..8003839a894 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateRing.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/RotateRing.qml @@ -45,6 +45,7 @@ Model { property vector3d _targetPosOnScreen property vector3d _startRotation property bool _trackBall + readonly property bool _edit3dLocked: true // Make this non-pickable signal rotateCommit() signal rotateChange() diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleGizmo.qml index e76809f32fd..a71001689db 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleGizmo.qml @@ -166,6 +166,7 @@ Node { Model { id: centerCube + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Cube" scale: Qt.vector3d(0.024, 0.024, 0.024) materials: DefaultMaterial { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleRod.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleRod.qml index 1857bfddda6..9cc5ec0e065 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleRod.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ScaleRod.qml @@ -39,6 +39,7 @@ DirectionalDraggable { property vector3d _startScale Model { + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Cube" y: 10 scale: Qt.vector3d(0.020, 0.020, 0.020) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SelectionBox.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SelectionBox.qml index 1e7cc7b11ac..dd3300fd941 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SelectionBox.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SelectionBox.qml @@ -45,6 +45,7 @@ Node { Model { id: selectionBoxModel + readonly property bool _edit3dLocked: true // Make this non-pickable geometry: selectionBoxGeometry scale: selectionBox.targetNode ? selectionBox.targetNode.scale : Qt.vector3d(1, 1, 1) diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SpotLightHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SpotLightHandle.qml index 1c7322f4e28..314b4166ebe 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SpotLightHandle.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/SpotLightHandle.qml @@ -41,6 +41,7 @@ DirectionalDraggable { Model { id: handle + readonly property bool _edit3dLocked: true // Make this non-pickable source: "#Sphere" materials: [ handleRoot.material ] scale: Qt.vector3d(0.02, 0.02, 0.02) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp index 02e6f2df594..d3a8b4e8f54 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp @@ -267,6 +267,31 @@ void GeneralHelper::delayedPropertySet(QObject *obj, int delay, const QString &p }); } +// Returns the first valid QQuick3DPickResult from view at (posX, PosY). +QQuick3DPickResult GeneralHelper::pickViewAt(QQuick3DViewport *view, float posX, float posY) +{ + if (!view) + return QQuick3DPickResult(); + +#if QT_VERSION >= QT_VERSION_CHECK(6, 2, 1) + // Make sure global picking is on + view->setGlobalPickingEnabled(true); + + // With Qt 6.2+, select first suitable result from all picked objects + auto pickResults = view->pickAll(posX, posY); + for (auto pickResult : pickResults) { + if (isPickable(pickResult.objectHit())) + return pickResult; + } +#else + // With older Qt version we'll just pick the single object + auto pickResult = view->pick(posX, posY); + if (isPickable(pickResult.objectHit())) + return pickResult; +#endif + return QQuick3DPickResult(); +} + QQuick3DNode *GeneralHelper::resolvePick(QQuick3DNode *pickNode) { if (pickNode) { @@ -315,6 +340,10 @@ bool GeneralHelper::isHidden(QQuick3DNode *node) return false; } +bool GeneralHelper::isPickable(QQuick3DNode *node) { + return (node && !isLocked(node) && !isHidden(node) && node->visible()); +} + void GeneralHelper::storeToolState(const QString &sceneId, const QString &tool, const QVariant &state, int delay) { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h index 6e888980f81..c22f310eddd 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h @@ -35,6 +35,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE class QQuick3DCamera; @@ -74,12 +75,14 @@ public: Q_INVOKABLE bool fuzzyCompare(double a, double b); Q_INVOKABLE void delayedPropertySet(QObject *obj, int delay, const QString &property, const QVariant& value); + Q_INVOKABLE QQuick3DPickResult pickViewAt(QQuick3DViewport *view, float posX, float posY); Q_INVOKABLE QQuick3DNode *resolvePick(QQuick3DNode *pickNode); Q_INVOKABLE void registerGizmoTarget(QQuick3DNode *node); Q_INVOKABLE void unregisterGizmoTarget(QQuick3DNode *node); Q_INVOKABLE bool isLocked(QQuick3DNode *node); Q_INVOKABLE bool isHidden(QQuick3DNode *node); + Q_INVOKABLE bool isPickable(QQuick3DNode *node); Q_INVOKABLE void storeToolState(const QString &sceneId, const QString &tool, const QVariant &state, int delayEmit = 0); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 19e864e6381..ee20e5636c4 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -2047,8 +2047,10 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst // as changes in the node tree (reparenting, adding new nodes) can make the previously set // hide status based on ancestor unreliable. node->setProperty("_edit3dHidden", edit3dHidden); +#if QT_VERSION < QT_VERSION_CHECK(6, 2, 1) if (auto model = qobject_cast(node)) model->setPickable(!edit3dHidden); // allow 3D objects to receive mouse clicks +#endif const auto childItems = node->childItems(); for (auto childItem : childItems) { const ServerNodeInstance quick3dInstance = getQuick3DInstanceAndHidden(childItem); @@ -2070,7 +2072,9 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst value = QVariant::fromValue(node); // Specify the actual pick target with dynamic property checkModel->setProperty("_pickTarget", value); +#if QT_VERSION < QT_VERSION_CHECK(6, 2, 1) checkModel->setPickable(!edit3dHidden); +#endif } }; if (auto childNode = qobject_cast(childItem))