From c220599e2f29fda525beae1ffbcf28650a7bc9d2 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 14 Jun 2024 17:28:23 +0300 Subject: [PATCH] QmlDesigner: Remember each import preview camera position/rotation When importing multiple 3D assets at the same time, the import preview camera rotation and position are now stored and restored when previewed asset changes. Fixes: QDS-12999 Change-Id: Ib65578e246ba4344188e97540546521b0cb39e5f Reviewed-by: Mahmoud Badri --- .../qt5import3dnodeinstanceserver.cpp | 20 +++++++++++++++++-- .../instances/qt5import3dnodeinstanceserver.h | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.cpp index 755bb91ef96..a3010819248 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.cpp @@ -94,12 +94,14 @@ void Qt5Import3dNodeInstanceServer::view3DAction([[maybe_unused]] const View3DAc QQmlProperty sceneNodeProp(obj, "sceneNode", context()); auto sceneNode = sceneNodeProp.read().value(); if (sceneNode && m_previewData.contains(m_currentNode)) { - const PreviewData &data = m_previewData[m_currentNode]; + PreviewData &data = m_previewData[m_currentNode]; QPointF delta = command.value().toPointF(); m_generalHelper->orbitCamera(m_view3D->camera(), m_view3D->camera()->eulerRotation(), data.lookAt, {}, {float(delta.x()), float(delta.y()), 0.f}); // Add 2 renders to keep render timer alive for smooth rotation addCurrentNodeToRenderQueue(2); + data.cameraRotation = m_view3D->camera()->rotation(); + data.cameraPosition = m_view3D->camera()->position(); } break; } @@ -108,7 +110,8 @@ void Qt5Import3dNodeInstanceServer::view3DAction([[maybe_unused]] const View3DAc const QString name = cmd["name"].toString(); const QString folder = cmd["folder"].toString(); - if (m_previewData.contains(name)) { + bool isUpdate = m_previewData.contains(name); + if (isUpdate) { QQuick3DNode *node = m_previewData[name].node; if (node) { node->setParentItem({}); @@ -120,6 +123,10 @@ void Qt5Import3dNodeInstanceServer::view3DAction([[maybe_unused]] const View3DAc PreviewData &data = m_previewData[name]; data.name = name; data.lookAt = {}; + if (!isUpdate) { + data.cameraRotation = m_defaultCameraRotation; + data.cameraPosition = m_defaultCameraPosition; + } QFileInfo fi(fileUrl().toLocalFile()); QString compPath = fi.absolutePath() + '/' + folder + '/' + name + ".qml"; @@ -143,7 +150,16 @@ void Qt5Import3dNodeInstanceServer::view3DAction([[maybe_unused]] const View3DAc case View3DActionType::Import3dSetCurrentPreviewModel: { QString newName = command.value().toString(); if (m_previewData.contains(newName) && m_currentNode != newName) { + QQuick3DCamera *camera = m_view3D->camera(); + if (m_previewData.contains(m_currentNode)) { + PreviewData &oldData = m_previewData[m_currentNode]; + oldData.cameraPosition = camera->position(); + oldData.cameraRotation = camera->rotation(); + } m_currentNode = newName; + const PreviewData &newData = m_previewData[m_currentNode]; + camera->setPosition(newData.cameraPosition); + camera->setRotation(newData.cameraRotation); addInitToRenderQueue(); addCurrentNodeToRenderQueue(); } diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.h index 1b790eb717d..539d33f27e9 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.h +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5import3dnodeinstanceserver.h @@ -50,6 +50,8 @@ private: QVector3D lookAt; QVector3D extents; QQuick3DNode *node = {}; + QQuaternion cameraRotation; + QVector3D cameraPosition; }; QHash m_previewData;