From bb25a4d1969a344e0c13a1b58178531dc6b0f7ee Mon Sep 17 00:00:00 2001 From: Ali Kianian Date: Tue, 10 Sep 2024 15:56:19 +0300 Subject: [PATCH] QmlDesigner: Camera should be a scene object SceneManager should exist for the camera node. Otherwise, we shouldn't show the camera display. Fixes: QDS-13582 Fixes: QDS-13583 Pick-to: 4.6 Change-Id: I03984172c6ac2faffa5381f7fb227396076e7527 Reviewed-by: Miikka Heikkinen --- .../qml2puppet/mockfiles/qt6/CameraView.qml | 6 +++--- .../qml2puppet/editor3d/generalhelper.cpp | 19 ++++++++++--------- .../qml2puppet/editor3d/generalhelper.h | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/tools/qml2puppet/mockfiles/qt6/CameraView.qml b/src/tools/qml2puppet/mockfiles/qt6/CameraView.qml index fe886a71d68..53040ec318f 100644 --- a/src/tools/qml2puppet/mockfiles/qt6/CameraView.qml +++ b/src/tools/qml2puppet/mockfiles/qt6/CameraView.qml @@ -46,10 +46,10 @@ Rectangle { property Camera camera property Camera oldCamera - property bool view3dRootNodeExists + property bool cameraIsSceneObject property bool forceDeactive: false readonly property bool cameraViewIsOn: !forceDeactive && (cameraView.alwaysOn || cameraView.showCameraView) && priv.camera - readonly property bool cameraHasValidScene: priv.cameraViewIsOn && priv.view3dRootNodeExists + readonly property bool cameraHasValidScene: priv.cameraViewIsOn && priv.cameraIsSceneObject property Loader activeLoader readonly property size loaderSize: activeLoader && activeLoader.active ? Qt.size(activeLoader.width, activeLoader.height) @@ -58,7 +58,7 @@ Rectangle { function updateCamera() { let activeCam = activeCamera() priv.camera = activeCam - priv.view3dRootNodeExists = _generalHelper.view3dRootNode(activeCam) + priv.cameraIsSceneObject = _generalHelper.isSceneObject(activeCam) } function activeCamera() { diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp index 9392787e4c6..4d57c0d1646 100644 --- a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp +++ b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp @@ -692,18 +692,19 @@ bool GeneralHelper::isOrthographicCamera(QQuick3DNode *node) const return node && qobject_cast(node); } -QQuick3DNode *GeneralHelper::view3dRootNode(QQuick3DNode *node) const +bool GeneralHelper::isSceneObject(QQuick3DNode *node) const { if (!node) - return nullptr; + return false; - QQuick3DNode *parentNode = node->parentNode(); - while (parentNode) { - if (parentNode->inherits("QQuick3DSceneRootNode")) - return parentNode; - parentNode = parentNode->parentNode(); - } - return nullptr; + const auto objectPrivate = QQuick3DObjectPrivate::get(node); + const QQuick3DSceneManager *importSceneManager = objectPrivate->sceneManager; + if (!importSceneManager) + return false; + + const QQuick3DObject *sceneObject + = importSceneManager->m_nodeMap.value(objectPrivate->spatialNode, nullptr); + return sceneObject != nullptr; } // Emitter gizmo model creation is done in C++ as creating dynamic properties and diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h index aec9c4970e6..3a2082f8179 100644 --- a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h +++ b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h @@ -97,7 +97,7 @@ public: Q_INVOKABLE bool isPickable(QQuick3DNode *node) const; Q_INVOKABLE bool isCamera(QQuick3DNode *node) const; Q_INVOKABLE bool isOrthographicCamera(QQuick3DNode *node) const; - Q_INVOKABLE QQuick3DNode *view3dRootNode(QQuick3DNode *node) const; + Q_INVOKABLE bool isSceneObject(QQuick3DNode *node) const; Q_INVOKABLE QQuick3DNode *createParticleEmitterGizmoModel(QQuick3DNode *emitter, QQuick3DMaterial *material) const;