diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2025-02-17 11:54:41 +0200 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2025-02-17 11:54:41 +0200 |
commit | 1363caf03949f5af3796000d8040bad24887addc (patch) | |
tree | 0522323ebda14fc31e9827afbc6b65c3dbdf7137 | |
parent | ad9acbc8fbf320ca89dba22c0ce6e64bd74d0dfa (diff) | |
parent | 239e8f05793ab5b06bbf99383b55347f018bf43a (diff) |
Merge tag 'v6.5.5-lts' into tqtc/lts-6.5-opensourcev6.5.5-lts-lgpl6.5
Qt 6.5.5-lts release
Conflicts solved:
dependencies.yaml
Change-Id: Id3106821304e211551df8a4ea5147aa4d0dc25c5
-rw-r--r-- | .cmake.conf | 2 | ||||
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | dependencies.yaml | 8 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderview.cpp | 12 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderview.cpp | 12 | ||||
-rw-r--r-- | src/render/backend/entity.cpp | 1 | ||||
-rw-r--r-- | src/render/backend/entity_p.h | 3 | ||||
-rw-r--r-- | src/render/backend/transform.cpp | 8 | ||||
-rw-r--r-- | src/render/backend/transform_p.h | 4 | ||||
-rw-r--r-- | src/render/jobs/updateworldtransformjob.cpp | 7 | ||||
-rw-r--r-- | tests/auto/render/raycasting/tst_raycasting.cpp | 4 |
11 files changed, 50 insertions, 13 deletions
diff --git a/.cmake.conf b/.cmake.conf index 771533a9f..91e0f7f1c 100644 --- a/.cmake.conf +++ b/.cmake.conf @@ -1,4 +1,4 @@ -set(QT_REPO_MODULE_VERSION "6.5.4") +set(QT_REPO_MODULE_VERSION "6.5.5") set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1") set(QT_REPO_PUBLIC_NAMESPACE_REGEX "^::Qt3D.*") diff --git a/.qmake.conf b/.qmake.conf index 4bc99f296..1c7530740 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -6,4 +6,4 @@ load(qt_build_config) DEFINES += QT_NO_FOREACH DEFINES += QT_NO_JAVA_STYLE_ITERATORS -MODULE_VERSION = 6.5.4 +MODULE_VERSION = 6.5.5 diff --git a/dependencies.yaml b/dependencies.yaml index 22856a68b..020fe2667 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -1,13 +1,13 @@ dependencies: ../tqtc-qtbase: - ref: 8ff0b254e4c3db81254782262d827f7831d15f6b + ref: fdf57f5df57e7d12cf871699d857a71acf272e0c required: true ../tqtc-qtdeclarative: - ref: 9edb471d3a35b3dc40def86c395789086edaa983 + ref: 7ac842cba18be081ac835bf40ac475ec4c47d30b required: false ../tqtc-qtmultimedia: - ref: 6ad1526df3790c666ceda70883e80910dbb70847 + ref: d74f9da2d47a17f7475d969fba6d69f0dd5934ee required: false ../tqtc-qtshadertools: - ref: 5bf9de4a39fe2385998307c3e5ae16df6c0a5bd7 + ref: 8191dce7e16f9bf42476c41a3b7aab9a62b26daa required: false diff --git a/src/plugins/renderers/opengl/renderer/renderview.cpp b/src/plugins/renderers/opengl/renderer/renderview.cpp index 324e63af9..8cd22eaa2 100644 --- a/src/plugins/renderers/opengl/renderer/renderview.cpp +++ b/src/plugins/renderers/opengl/renderer/renderview.cpp @@ -1077,8 +1077,16 @@ void RenderView::updateRenderCommand(const EntityRenderCommandDataSubView &subVi void RenderView::updateMatrices() { if (m_renderCameraNode && m_renderCameraLens && m_renderCameraLens->isEnabled()) { - const Matrix4x4 cameraWorld = *(m_renderCameraNode->worldTransform()); - setViewMatrix(m_renderCameraLens->viewMatrix(cameraWorld)); + auto transform = m_renderCameraNode->renderComponent<Transform>(); + if (m_renderCameraNode->isParentLessTransform() && transform && transform->hasViewMatrix()) { + // optimization: if the entity is a QCamera and it doesn't have a parent with a transform component, + // then we use the frontend version of the viewMatrix to avoid extra calculations that may introduce + // rounding errors + setViewMatrix(transform->viewMatrix()); + } else { + const Matrix4x4 cameraWorld = *(m_renderCameraNode->worldTransform()); + setViewMatrix(m_renderCameraLens->viewMatrix(cameraWorld)); + } setViewProjectionMatrix(m_renderCameraLens->projection() * viewMatrix()); //To get the eyePosition of the camera, we need to use the inverse of the diff --git a/src/plugins/renderers/rhi/renderer/renderview.cpp b/src/plugins/renderers/rhi/renderer/renderview.cpp index 60a447ae6..644654930 100644 --- a/src/plugins/renderers/rhi/renderer/renderview.cpp +++ b/src/plugins/renderers/rhi/renderer/renderview.cpp @@ -1172,8 +1172,16 @@ void RenderView::updateMatrices() { if (m_renderCameraNode && m_renderCameraLens && m_renderCameraLens->isEnabled()) { - const Matrix4x4 cameraWorld = *(m_renderCameraNode->worldTransform()); - setViewMatrix(m_renderCameraLens->viewMatrix(cameraWorld)); + auto transform = m_renderCameraNode->renderComponent<Transform>(); + if (m_renderCameraNode->isParentLessTransform() && transform && transform->hasViewMatrix()) { + // optimization: if the entity is a QCamera and it doesn't have a parent with a transform component, + // then we use the frontend version of the viewMatrix to avoid extra calculations that may introduce + // rounding errors + setViewMatrix(transform->viewMatrix()); + } else { + const Matrix4x4 cameraWorld = *(m_renderCameraNode->worldTransform()); + setViewMatrix(m_renderCameraLens->viewMatrix(cameraWorld)); + } setViewProjectionMatrix(m_renderCameraLens->projection() * viewMatrix()); // To get the eyePosition of the camera, we need to use the inverse of the diff --git a/src/render/backend/entity.cpp b/src/render/backend/entity.cpp index 2b90c4996..e83b98e29 100644 --- a/src/render/backend/entity.cpp +++ b/src/render/backend/entity.cpp @@ -67,6 +67,7 @@ void EntityPrivate::componentRemoved(Qt3DCore::QNode *frontend) Entity::Entity() : BackendNode(*new EntityPrivate) , m_nodeManagers(nullptr) + , m_parentLessTransform(true) , m_boundingDirty(false) , m_treeEnabled(true) { diff --git a/src/render/backend/entity_p.h b/src/render/backend/entity_p.h index 734bc15ae..e7e6278e2 100644 --- a/src/render/backend/entity_p.h +++ b/src/render/backend/entity_p.h @@ -73,6 +73,8 @@ public: Matrix4x4 *worldTransform(); const Matrix4x4 *worldTransform() const; + bool isParentLessTransform() const { return m_parentLessTransform; } + void setParentLessTransform(bool v) { m_parentLessTransform = v; } Sphere *localBoundingVolume() const { return m_localBoundingVolume.data(); } Sphere *worldBoundingVolume() const { return m_worldBoundingVolume.data(); } Sphere *worldBoundingVolumeWithChildren() const { return m_worldBoundingVolumeWithChildren.data(); } @@ -151,6 +153,7 @@ private: QList<HEntity> m_childrenHandles; HMatrix m_worldTransform; + bool m_parentLessTransform; QSharedPointer<Sphere> m_localBoundingVolume; QSharedPointer<Sphere> m_worldBoundingVolume; QSharedPointer<Sphere> m_worldBoundingVolumeWithChildren; diff --git a/src/render/backend/transform.cpp b/src/render/backend/transform.cpp index 8999acaed..bca31a8ef 100644 --- a/src/render/backend/transform.cpp +++ b/src/render/backend/transform.cpp @@ -6,6 +6,7 @@ #include <Qt3DCore/private/qchangearbiter_p.h> #include <Qt3DCore/qtransform.h> #include <Qt3DCore/private/qtransform_p.h> +#include <Qt3DRender/qcamera.h> QT_BEGIN_NAMESPACE @@ -65,6 +66,13 @@ void Transform::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) m_translation = transform->translation(); if (dirty || firstTime) { + auto camera = qobject_cast<const Qt3DRender::QCamera *>(transform->parentNode()); + if (camera) { + m_viewMatrix = Matrix4x4(camera->viewMatrix()); + m_hasViewMatrix = true; + } else { + m_hasViewMatrix = false; + } updateMatrix(); markDirty(AbstractRenderer::TransformDirty); } diff --git a/src/render/backend/transform_p.h b/src/render/backend/transform_p.h index 84a2f9962..d6ea68c0c 100644 --- a/src/render/backend/transform_p.h +++ b/src/render/backend/transform_p.h @@ -36,6 +36,8 @@ public: void cleanup(); Matrix4x4 transformMatrix() const; + bool hasViewMatrix() const { return m_hasViewMatrix; } + const Matrix4x4& viewMatrix() const { return m_viewMatrix; } QVector3D scale() const; QQuaternion rotation() const; QVector3D translation() const; @@ -44,6 +46,8 @@ public: private: void updateMatrix(); + bool m_hasViewMatrix; + Matrix4x4 m_viewMatrix; Matrix4x4 m_transformMatrix; QQuaternion m_rotation; QVector3D m_scale; diff --git a/src/render/jobs/updateworldtransformjob.cpp b/src/render/jobs/updateworldtransformjob.cpp index ea6950bfd..f7f1528eb 100644 --- a/src/render/jobs/updateworldtransformjob.cpp +++ b/src/render/jobs/updateworldtransformjob.cpp @@ -28,7 +28,7 @@ struct TransformUpdate QMatrix4x4 worldTransformMatrix; }; -void updateWorldTransformAndBounds(NodeManagers *manager, Entity *node, const Matrix4x4 &parentTransform, QList<TransformUpdate> &updatedTransforms) +void updateWorldTransformAndBounds(NodeManagers *manager, Entity *node, const Matrix4x4 &parentTransform, bool hasParentTransform, QList<TransformUpdate> &updatedTransforms) { if (!node->isEnabled()) return; @@ -45,12 +45,13 @@ void updateWorldTransformAndBounds(NodeManagers *manager, Entity *node, const Ma if (hasTransformComponent) updatedTransforms.push_back({nodeTransform->peerId(), convertToQMatrix4x4(worldTransform)}); } + node->setParentLessTransform(!hasParentTransform); const auto &childrenHandles = node->childrenHandles(); for (const HEntity &handle : childrenHandles) { Entity *child = manager->renderNodesManager()->data(handle); if (child) - updateWorldTransformAndBounds(manager, child, worldTransform, updatedTransforms); + updateWorldTransformAndBounds(manager, child, worldTransform, hasParentTransform || hasTransformComponent, updatedTransforms); } } @@ -101,7 +102,7 @@ void UpdateWorldTransformJob::run() Entity *parent = m_node->parent(); if (parent != nullptr) parentTransform = *(parent->worldTransform()); - updateWorldTransformAndBounds(m_manager, m_node, parentTransform, d->m_updatedTransforms); + updateWorldTransformAndBounds(m_manager, m_node, parentTransform, false, d->m_updatedTransforms); qCDebug(Jobs) << "Exiting" << Q_FUNC_INFO << QThread::currentThread(); } diff --git a/tests/auto/render/raycasting/tst_raycasting.cpp b/tests/auto/render/raycasting/tst_raycasting.cpp index 359404817..659b99f9a 100644 --- a/tests/auto/render/raycasting/tst_raycasting.cpp +++ b/tests/auto/render/raycasting/tst_raycasting.cpp @@ -124,6 +124,8 @@ void tst_RayCasting::shouldReturnValidHandle() void tst_RayCasting::shouldReturnResultForEachHandle() { + QSKIP("Fails on commercial-only CI configuration"); + // GIVEN QRay3D ray; QList<QBoundingVolume *> volumes; @@ -149,6 +151,8 @@ void tst_RayCasting::shouldReturnResultForEachHandle() void tst_RayCasting::shouldReturnAllResults() { + QSKIP("Fails on commercial-only CI configuration"); + // GIVEN QRay3D ray; QList<QBoundingVolume *> volumes; |