From a95ee86ad27e65bc7568cdb3b7146b1e6d605140 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 18 Apr 2024 16:07:08 +0300 Subject: [PATCH] QmlDesigner: Reset zoom when aligning view to camera Resetting the zoom after aligning edit camera to scene camera avoids confusing behavior in some cases, primarily when the alignment is triggered from outside 3D view. Fixes: QDS-12348 Fixes: QDS-12350 Change-Id: Ic0c076ea3dff3f1be5f57e20c0dbbe6069867b51 Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Patch Build Bot --- .../mockfiles/qt6/EditCameraController.qml | 5 ++++- .../qml2puppet/editor3d/generalhelper.cpp | 21 ++++++++++++------- .../qml2puppet/editor3d/generalhelper.h | 4 ++-- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml b/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml index a76a1cdf08c..2d77aaf9877 100644 --- a/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml +++ b/src/tools/qml2puppet/mockfiles/qt6/EditCameraController.qml @@ -138,7 +138,10 @@ Item { else nodes = targetNodes - _lookAtPoint = _generalHelper.alignView(camera, nodes, _lookAtPoint); + var newLookAtAndZoom = _generalHelper.alignView(camera, nodes, _lookAtPoint, + _defaultCameraLookAtDistance); + _lookAtPoint = newLookAtAndZoom.toVector3d(); + _zoomFactor = newLookAtAndZoom.w; storeCameraState(0); } diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp index 4b47179915e..b33a480a450 100644 --- a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp +++ b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.cpp @@ -494,12 +494,10 @@ void GeneralHelper::alignCameras(QQuick3DCamera *camera, const QVariant &nodes) // Aligns the camera to the first camera in nodes list. // Aligning means taking the position and XY rotation from the source camera. Rest of the properties // remain the same, as this is used to align edit cameras, which have fixed Z-rot, fov, and clips. -// The new lookAt is set at same distance away as it was previously and scale isn't adjusted, so -// the zoom factor of the edit camera stays the same. -QVector3D GeneralHelper::alignView(QQuick3DCamera *camera, const QVariant &nodes, - const QVector3D &lookAtPoint) +// The camera zoom is reset to default. +QVector4D GeneralHelper::alignView(QQuick3DCamera *camera, const QVariant &nodes, + const QVector3D &lookAtPoint, float defaultLookAtDistance) { - float lastDistance = (lookAtPoint - camera->position()).length(); const QVariantList varNodes = nodes.value(); QQuick3DCamera *cameraNode = nullptr; for (const auto &varNode : varNodes) { @@ -509,15 +507,24 @@ QVector3D GeneralHelper::alignView(QQuick3DCamera *camera, const QVariant &nodes } if (cameraNode) { + if (auto orthoCamera = qobject_cast(camera)) { + orthoCamera->setHorizontalMagnification(1.f); + orthoCamera->setVerticalMagnification(1.f); + // Force update on transform just in case position and rotation didn't change + float x = orthoCamera->x(); + orthoCamera->setX(x + 1.f); + orthoCamera->setX(x); + } camera->setPosition(cameraNode->scenePosition()); QVector3D newRotation = cameraNode->sceneRotation().toEulerAngles(); newRotation.setZ(0.f); camera->setEulerRotation(newRotation); + } - QVector3D lookAt = camera->position() + camera->forward() * lastDistance; + QVector3D lookAt = camera->position() + camera->forward() * defaultLookAtDistance; - return lookAt; + return QVector4D(lookAt, 1.f); } bool GeneralHelper::fuzzyCompare(double a, double b) diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h index 781a19dbff5..5622918a64b 100644 --- a/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h +++ b/src/tools/qml2puppet/qml2puppet/editor3d/generalhelper.h @@ -74,8 +74,8 @@ public: QQuick3DViewport *viewPort, float defaultLookAtDistance, bool closeUp); Q_INVOKABLE void alignCameras(QQuick3DCamera *camera, const QVariant &nodes); - Q_INVOKABLE QVector3D alignView(QQuick3DCamera *camera, const QVariant &nodes, - const QVector3D &lookAtPoint); + Q_INVOKABLE QVector4D alignView(QQuick3DCamera *camera, const QVariant &nodes, + const QVector3D &lookAtPoint, float defaultLookAtDistance); Q_INVOKABLE bool fuzzyCompare(double a, double b); Q_INVOKABLE void delayedPropertySet(QObject *obj, int delay, const QString &property, const QVariant& value);