aboutsummaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2021-11-15 17:24:23 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2021-11-22 10:14:42 +0000
commitcb00a8d30f093616994025e6b4c04d856e6bd715 (patch)
treede32be21bec1715706bdda5acbab7c6e8d892f3d /share
parente018a8649ce04fc51a560a18532248495d207ae4 (diff)
QmlDesigner: Fix orthographic camera hdpi issues in edit 3D view
There is no need to double the viewport anymore when calculating orthographic camera frustum visualization, Qt6 correctly accounts for device pixel ratio in ortho projection. Even in Qt5, the old hack only made frustum visualization correct for hdpi screens while breaking it for regular screens. Also fixed zoom factor handling for orthographic edit camera mode. Task-number: QDS-5469 Change-Id: Ie53b5dfa2fbcc00f098ea64e5a6673e4b7af0963 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'share')
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditCameraController.qml10
-rw-r--r--share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditCameraController.qml10
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp9
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp19
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h2
5 files changed, 27 insertions, 23 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditCameraController.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditCameraController.qml
index 55e310f053..f5a21dacb9 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditCameraController.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt5/EditCameraController.qml
@@ -57,7 +57,7 @@ Item {
_zoomFactor = cameraState[1];
camera.position = cameraState[2];
camera.rotation = cameraState[3];
- _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
+ _generalHelper.zoomCamera(view3d, camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
_zoomFactor, false);
}
@@ -70,7 +70,7 @@ Item {
_zoomFactor = 1;
camera.position = _defaultCameraPosition;
camera.eulerRotation = _defaultCameraRotation;
- _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
+ _generalHelper.zoomCamera(view3d, camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
_zoomFactor, false);
}
@@ -114,21 +114,21 @@ Item {
if (!camera)
return;
- _zoomFactor = _generalHelper.zoomCamera(camera, distance, _defaultCameraLookAtDistance,
+ _zoomFactor = _generalHelper.zoomCamera(view3d, camera, distance, _defaultCameraLookAtDistance,
_lookAtPoint, _zoomFactor, true);
}
onCameraChanged: {
if (camera && _prevCamera) {
// Reset zoom on previous camera to ensure it's properties are good to copy to new cam
- _generalHelper.zoomCamera(_prevCamera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
+ _generalHelper.zoomCamera(view3d, _prevCamera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
1, false);
camera.position = _prevCamera.position;
camera.rotation = _prevCamera.rotation;
// Apply correct zoom to new camera
- _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
+ _generalHelper.zoomCamera(view3d, camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
_zoomFactor, false);
}
_prevCamera = camera;
diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditCameraController.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditCameraController.qml
index 1374309421..bba0574231 100644
--- a/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditCameraController.qml
+++ b/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/EditCameraController.qml
@@ -57,7 +57,7 @@ Item {
_zoomFactor = cameraState[1];
camera.position = cameraState[2];
camera.rotation = cameraState[3];
- _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
+ _generalHelper.zoomCamera(view3d, camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
_zoomFactor, false);
}
@@ -70,7 +70,7 @@ Item {
_zoomFactor = 1;
camera.position = _defaultCameraPosition;
camera.eulerRotation = _defaultCameraRotation;
- _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
+ _generalHelper.zoomCamera(view3d, camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
_zoomFactor, false);
}
@@ -114,21 +114,21 @@ Item {
if (!camera)
return;
- _zoomFactor = _generalHelper.zoomCamera(camera, distance, _defaultCameraLookAtDistance,
+ _zoomFactor = _generalHelper.zoomCamera(view3d, camera, distance, _defaultCameraLookAtDistance,
_lookAtPoint, _zoomFactor, true);
}
onCameraChanged: {
if (camera && _prevCamera) {
// Reset zoom on previous camera to ensure it's properties are good to copy to new cam
- _generalHelper.zoomCamera(_prevCamera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
+ _generalHelper.zoomCamera(view3d, _prevCamera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
1, false);
camera.position = _prevCamera.position;
camera.rotation = _prevCamera.rotation;
// Apply correct zoom to new camera
- _generalHelper.zoomCamera(camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
+ _generalHelper.zoomCamera(view3d, camera, 0, _defaultCameraLookAtDistance, _lookAtPoint,
_zoomFactor, false);
}
_prevCamera = camera;
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp
index 365b03a8f7..4260921a37 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp
@@ -176,14 +176,7 @@ void CameraGeometry::fillVertexData(QByteArray &vertexData, QByteArray &indexDat
QRectF rect = m_viewPortRect;
if (rect.isNull())
rect = QRectF(0, 0, 1000, 1000); // Let's have some visualization for null viewports
- if (qobject_cast<QQuick3DOrthographicCamera *>(m_camera)) {
- // For some reason ortho cameras show double what projection suggests,
- // so give them doubled viewport to match visualization to actual camera view
- camera->calculateGlobalVariables(QRectF(0, 0, rect.width() * 2.0,
- rect.height() * 2.0));
- } else {
- camera->calculateGlobalVariables(rect);
- }
+ camera->calculateGlobalVariables(rect);
m = camera->projection.inverted();
}
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
index d3a8b4e8f5..67d134f6b3 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.cpp
@@ -130,8 +130,9 @@ QVector3D GeneralHelper::panCamera(QQuick3DCamera *camera, const QMatrix4x4 star
return startLookAt + delta;
}
-float GeneralHelper::zoomCamera(QQuick3DCamera *camera, float distance, float defaultLookAtDistance,
- const QVector3D &lookAt, float zoomFactor, bool relative)
+float GeneralHelper::zoomCamera(QQuick3DViewport *viewPort, QQuick3DCamera *camera, float distance,
+ float defaultLookAtDistance, const QVector3D &lookAt,
+ float zoomFactor, bool relative)
{
// Emprically determined divisor for nice zoom
float multiplier = 1.f + (distance / 40.f);
@@ -140,7 +141,16 @@ float GeneralHelper::zoomCamera(QQuick3DCamera *camera, float distance, float de
if (qobject_cast<QQuick3DOrthographicCamera *>(camera)) {
// Ortho camera we can simply scale
- camera->setScale(QVector3D(newZoomFactor, newZoomFactor, newZoomFactor));
+ float orthoFactor = newZoomFactor;
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ if (viewPort) {
+ if (const QQuickWindow *w = viewPort->window())
+ orthoFactor *= w->devicePixelRatio();
+ }
+#else
+ Q_UNUSED(viewPort)
+#endif
+ camera->setScale(QVector3D(orthoFactor, orthoFactor, orthoFactor));
} else if (qobject_cast<QQuick3DPerspectiveCamera *>(camera)) {
// Perspective camera is zoomed by moving camera forward or backward while keeping the
// look-at point the same
@@ -249,7 +259,8 @@ QVector4D GeneralHelper::focusNodesToCamera(QQuick3DCamera *camera, float defaul
float divisor = closeUp ? 900.f : 725.f;
float newZoomFactor = updateZoom ? qBound(.01f, maxExtent / divisor, 100.f) : oldZoom;
- float cameraZoomFactor = zoomCamera(camera, 0, defaultLookAtDistance, lookAt, newZoomFactor, false);
+ float cameraZoomFactor = zoomCamera(viewPort, camera, 0, defaultLookAtDistance, lookAt,
+ newZoomFactor, false);
return QVector4D(lookAt, cameraZoomFactor);
}
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
index c22f310edd..381082415b 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/generalhelper.h
@@ -65,7 +65,7 @@ public:
const QVector3D &startPosition, const QVector3D &startLookAt,
const QVector3D &pressPos, const QVector3D &currentPos,
float zoomFactor);
- Q_INVOKABLE float zoomCamera(QQuick3DCamera *camera, float distance,
+ Q_INVOKABLE float zoomCamera(QQuick3DViewport *viewPort, QQuick3DCamera *camera, float distance,
float defaultLookAtDistance, const QVector3D &lookAt,
float zoomFactor, bool relative);
Q_INVOKABLE QVector4D focusNodesToCamera(QQuick3DCamera *camera, float defaultLookAtDistance,