forked from qt-creator/qt-creator
Use global picking API
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ää <tomi.korpipaa@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
@@ -31,6 +31,7 @@ DirectionalDraggable {
|
|||||||
id: arrowRoot
|
id: arrowRoot
|
||||||
|
|
||||||
Model {
|
Model {
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
geometry: LineGeometry {
|
geometry: LineGeometry {
|
||||||
id: lineGeometry
|
id: lineGeometry
|
||||||
name: "Edit 3D ScalableArrow"
|
name: "Edit 3D ScalableArrow"
|
||||||
@@ -43,6 +44,7 @@ DirectionalDraggable {
|
|||||||
|
|
||||||
Model {
|
Model {
|
||||||
id: arrowHead
|
id: arrowHead
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Cone"
|
source: "#Cone"
|
||||||
materials: [ arrowRoot.material ]
|
materials: [ arrowRoot.material ]
|
||||||
y: arrowRoot.length - 3
|
y: arrowRoot.length - 3
|
||||||
|
@@ -42,6 +42,7 @@ DirectionalDraggable {
|
|||||||
|
|
||||||
Model {
|
Model {
|
||||||
id: handle
|
id: handle
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Sphere"
|
source: "#Sphere"
|
||||||
materials: [ handleRoot.material ]
|
materials: [ handleRoot.material ]
|
||||||
scale: Qt.vector3d(0.02, 0.02, 0.02)
|
scale: Qt.vector3d(0.02, 0.02, 0.02)
|
||||||
|
@@ -35,6 +35,7 @@ Model {
|
|||||||
property Node targetNode: null
|
property Node targetNode: null
|
||||||
property Node scene: null
|
property Node scene: null
|
||||||
property bool selected: false
|
property bool selected: false
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
|
|
||||||
function updateGeometry()
|
function updateGeometry()
|
||||||
{
|
{
|
||||||
|
@@ -41,6 +41,7 @@ Model {
|
|||||||
property real offset: 0
|
property real offset: 0
|
||||||
|
|
||||||
readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering
|
readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
|
|
||||||
property vector3d _scenePosPressed
|
property vector3d _scenePosPressed
|
||||||
property real _posPressed
|
property real _posPressed
|
||||||
|
@@ -721,6 +721,7 @@ Item {
|
|||||||
|
|
||||||
Model {
|
Model {
|
||||||
id: pivotCap
|
id: pivotCap
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Sphere"
|
source: "#Sphere"
|
||||||
scale: pivotAutoScale.getScale(Qt.vector3d(0.03, 0.03, 0.03))
|
scale: pivotAutoScale.getScale(Qt.vector3d(0.03, 0.03, 0.03))
|
||||||
position: pivotLine.startPos
|
position: pivotLine.startPos
|
||||||
@@ -760,7 +761,7 @@ Item {
|
|||||||
|
|
||||||
onPressed: (mouse)=> {
|
onPressed: (mouse)=> {
|
||||||
if (viewRoot.editView) {
|
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),
|
handleObjectClicked(_generalHelper.resolvePick(pickResult.objectHit),
|
||||||
mouse.modifiers & Qt.ControlModifier);
|
mouse.modifiers & Qt.ControlModifier);
|
||||||
|
|
||||||
|
@@ -41,6 +41,7 @@ DirectionalDraggable {
|
|||||||
|
|
||||||
Model {
|
Model {
|
||||||
id: handle
|
id: handle
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Sphere"
|
source: "#Sphere"
|
||||||
materials: [ handleRoot.material ]
|
materials: [ handleRoot.material ]
|
||||||
scale: Qt.vector3d(0.02, 0.02, 0.02)
|
scale: Qt.vector3d(0.02, 0.02, 0.02)
|
||||||
|
@@ -39,6 +39,7 @@ Node {
|
|||||||
// Note: Only one instance of HelperGrid is supported, as the geometry names are fixed
|
// Note: Only one instance of HelperGrid is supported, as the geometry names are fixed
|
||||||
|
|
||||||
Model { // Main grid lines
|
Model { // Main grid lines
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
geometry: GridGeometry {
|
geometry: GridGeometry {
|
||||||
id: gridGeometry
|
id: gridGeometry
|
||||||
name: "3D Edit View Helper Grid"
|
name: "3D Edit View Helper Grid"
|
||||||
@@ -55,6 +56,7 @@ Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Model { // Subdivision lines
|
Model { // Subdivision lines
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
geometry: GridGeometry {
|
geometry: GridGeometry {
|
||||||
lines: gridGeometry.lines
|
lines: gridGeometry.lines
|
||||||
step: gridGeometry.step
|
step: gridGeometry.step
|
||||||
@@ -73,6 +75,7 @@ Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Model { // Z Axis
|
Model { // Z Axis
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
geometry: GridGeometry {
|
geometry: GridGeometry {
|
||||||
lines: gridGeometry.lines
|
lines: gridGeometry.lines
|
||||||
step: gridGeometry.step
|
step: gridGeometry.step
|
||||||
@@ -89,6 +92,7 @@ Node {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
Model { // X Axis
|
Model { // X Axis
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
eulerRotation.z: 90
|
eulerRotation.z: 90
|
||||||
geometry: GridGeometry {
|
geometry: GridGeometry {
|
||||||
lines: gridGeometry.lines
|
lines: gridGeometry.lines
|
||||||
|
@@ -33,6 +33,7 @@ Model {
|
|||||||
property alias geometryName: lightGeometry.name // Name must be unique for each geometry
|
property alias geometryName: lightGeometry.name // Name must be unique for each geometry
|
||||||
property alias geometryType: lightGeometry.lightType
|
property alias geometryType: lightGeometry.lightType
|
||||||
property Material material
|
property Material material
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
|
|
||||||
function updateGeometry()
|
function updateGeometry()
|
||||||
{
|
{
|
||||||
|
@@ -36,6 +36,7 @@ Node {
|
|||||||
property alias color: lineMat.diffuseColor
|
property alias color: lineMat.diffuseColor
|
||||||
|
|
||||||
Model {
|
Model {
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
geometry: LineGeometry {
|
geometry: LineGeometry {
|
||||||
id: lineGeometry
|
id: lineGeometry
|
||||||
}
|
}
|
||||||
|
@@ -52,6 +52,7 @@ View3D {
|
|||||||
|
|
||||||
Model {
|
Model {
|
||||||
id: model
|
id: model
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Sphere"
|
source: "#Sphere"
|
||||||
materials: previewMaterial
|
materials: previewMaterial
|
||||||
}
|
}
|
||||||
|
@@ -82,6 +82,7 @@ View3D {
|
|||||||
|
|
||||||
Model {
|
Model {
|
||||||
id: model
|
id: model
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
eulerRotation.y: 45
|
eulerRotation.y: 45
|
||||||
|
|
||||||
source: sourceModel.source
|
source: sourceModel.source
|
||||||
|
@@ -40,6 +40,7 @@ Model {
|
|||||||
property alias mouseArea: mouseArea
|
property alias mouseArea: mouseArea
|
||||||
|
|
||||||
readonly property bool hovering: mouseArea.hovering
|
readonly property bool hovering: mouseArea.hovering
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
|
|
||||||
property vector3d _scenePosPressed
|
property vector3d _scenePosPressed
|
||||||
property vector2d _planePosPressed
|
property vector2d _planePosPressed
|
||||||
|
@@ -189,6 +189,7 @@ Node {
|
|||||||
Model {
|
Model {
|
||||||
id: freeRotator
|
id: freeRotator
|
||||||
|
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Sphere"
|
source: "#Sphere"
|
||||||
materials: DefaultMaterial {
|
materials: DefaultMaterial {
|
||||||
id: material
|
id: material
|
||||||
|
@@ -45,6 +45,7 @@ Model {
|
|||||||
property vector3d _targetPosOnScreen
|
property vector3d _targetPosOnScreen
|
||||||
property vector3d _startRotation
|
property vector3d _startRotation
|
||||||
property bool _trackBall
|
property bool _trackBall
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
|
|
||||||
signal rotateCommit()
|
signal rotateCommit()
|
||||||
signal rotateChange()
|
signal rotateChange()
|
||||||
|
@@ -166,6 +166,7 @@ Node {
|
|||||||
Model {
|
Model {
|
||||||
id: centerCube
|
id: centerCube
|
||||||
|
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Cube"
|
source: "#Cube"
|
||||||
scale: Qt.vector3d(0.024, 0.024, 0.024)
|
scale: Qt.vector3d(0.024, 0.024, 0.024)
|
||||||
materials: DefaultMaterial {
|
materials: DefaultMaterial {
|
||||||
|
@@ -39,6 +39,7 @@ DirectionalDraggable {
|
|||||||
property vector3d _startScale
|
property vector3d _startScale
|
||||||
|
|
||||||
Model {
|
Model {
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Cube"
|
source: "#Cube"
|
||||||
y: 10
|
y: 10
|
||||||
scale: Qt.vector3d(0.020, 0.020, 0.020)
|
scale: Qt.vector3d(0.020, 0.020, 0.020)
|
||||||
|
@@ -45,6 +45,7 @@ Node {
|
|||||||
|
|
||||||
Model {
|
Model {
|
||||||
id: selectionBoxModel
|
id: selectionBoxModel
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
geometry: selectionBoxGeometry
|
geometry: selectionBoxGeometry
|
||||||
|
|
||||||
scale: selectionBox.targetNode ? selectionBox.targetNode.scale : Qt.vector3d(1, 1, 1)
|
scale: selectionBox.targetNode ? selectionBox.targetNode.scale : Qt.vector3d(1, 1, 1)
|
||||||
|
@@ -41,6 +41,7 @@ DirectionalDraggable {
|
|||||||
|
|
||||||
Model {
|
Model {
|
||||||
id: handle
|
id: handle
|
||||||
|
readonly property bool _edit3dLocked: true // Make this non-pickable
|
||||||
source: "#Sphere"
|
source: "#Sphere"
|
||||||
materials: [ handleRoot.material ]
|
materials: [ handleRoot.material ]
|
||||||
scale: Qt.vector3d(0.02, 0.02, 0.02)
|
scale: Qt.vector3d(0.02, 0.02, 0.02)
|
||||||
|
@@ -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)
|
QQuick3DNode *GeneralHelper::resolvePick(QQuick3DNode *pickNode)
|
||||||
{
|
{
|
||||||
if (pickNode) {
|
if (pickNode) {
|
||||||
@@ -315,6 +340,10 @@ bool GeneralHelper::isHidden(QQuick3DNode *node)
|
|||||||
return false;
|
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,
|
void GeneralHelper::storeToolState(const QString &sceneId, const QString &tool, const QVariant &state,
|
||||||
int delay)
|
int delay)
|
||||||
{
|
{
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
#include <QVector3D>
|
#include <QVector3D>
|
||||||
|
#include <QtQuick3D/private/qquick3dpickresult_p.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QQuick3DCamera;
|
class QQuick3DCamera;
|
||||||
@@ -74,12 +75,14 @@ public:
|
|||||||
Q_INVOKABLE bool fuzzyCompare(double a, double b);
|
Q_INVOKABLE bool fuzzyCompare(double a, double b);
|
||||||
Q_INVOKABLE void delayedPropertySet(QObject *obj, int delay, const QString &property,
|
Q_INVOKABLE void delayedPropertySet(QObject *obj, int delay, const QString &property,
|
||||||
const QVariant& value);
|
const QVariant& value);
|
||||||
|
Q_INVOKABLE QQuick3DPickResult pickViewAt(QQuick3DViewport *view, float posX, float posY);
|
||||||
Q_INVOKABLE QQuick3DNode *resolvePick(QQuick3DNode *pickNode);
|
Q_INVOKABLE QQuick3DNode *resolvePick(QQuick3DNode *pickNode);
|
||||||
|
|
||||||
Q_INVOKABLE void registerGizmoTarget(QQuick3DNode *node);
|
Q_INVOKABLE void registerGizmoTarget(QQuick3DNode *node);
|
||||||
Q_INVOKABLE void unregisterGizmoTarget(QQuick3DNode *node);
|
Q_INVOKABLE void unregisterGizmoTarget(QQuick3DNode *node);
|
||||||
Q_INVOKABLE bool isLocked(QQuick3DNode *node);
|
Q_INVOKABLE bool isLocked(QQuick3DNode *node);
|
||||||
Q_INVOKABLE bool isHidden(QQuick3DNode *node);
|
Q_INVOKABLE bool isHidden(QQuick3DNode *node);
|
||||||
|
Q_INVOKABLE bool isPickable(QQuick3DNode *node);
|
||||||
|
|
||||||
Q_INVOKABLE void storeToolState(const QString &sceneId, const QString &tool,
|
Q_INVOKABLE void storeToolState(const QString &sceneId, const QString &tool,
|
||||||
const QVariant &state, int delayEmit = 0);
|
const QVariant &state, int delayEmit = 0);
|
||||||
|
@@ -2047,8 +2047,10 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst
|
|||||||
// as changes in the node tree (reparenting, adding new nodes) can make the previously set
|
// as changes in the node tree (reparenting, adding new nodes) can make the previously set
|
||||||
// hide status based on ancestor unreliable.
|
// hide status based on ancestor unreliable.
|
||||||
node->setProperty("_edit3dHidden", edit3dHidden);
|
node->setProperty("_edit3dHidden", edit3dHidden);
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(6, 2, 1)
|
||||||
if (auto model = qobject_cast<QQuick3DModel *>(node))
|
if (auto model = qobject_cast<QQuick3DModel *>(node))
|
||||||
model->setPickable(!edit3dHidden); // allow 3D objects to receive mouse clicks
|
model->setPickable(!edit3dHidden); // allow 3D objects to receive mouse clicks
|
||||||
|
#endif
|
||||||
const auto childItems = node->childItems();
|
const auto childItems = node->childItems();
|
||||||
for (auto childItem : childItems) {
|
for (auto childItem : childItems) {
|
||||||
const ServerNodeInstance quick3dInstance = getQuick3DInstanceAndHidden(childItem);
|
const ServerNodeInstance quick3dInstance = getQuick3DInstanceAndHidden(childItem);
|
||||||
@@ -2070,7 +2072,9 @@ void Qt5InformationNodeInstanceServer::handleInstanceHidden(const ServerNodeInst
|
|||||||
value = QVariant::fromValue(node);
|
value = QVariant::fromValue(node);
|
||||||
// Specify the actual pick target with dynamic property
|
// Specify the actual pick target with dynamic property
|
||||||
checkModel->setProperty("_pickTarget", value);
|
checkModel->setProperty("_pickTarget", value);
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(6, 2, 1)
|
||||||
checkModel->setPickable(!edit3dHidden);
|
checkModel->setPickable(!edit3dHidden);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (auto childNode = qobject_cast<QQuick3DNode *>(childItem))
|
if (auto childNode = qobject_cast<QQuick3DNode *>(childItem))
|
||||||
|
Reference in New Issue
Block a user