summaryrefslogtreecommitdiffstats
diff options
authorTarja Sundqvist <tarja.sundqvist@qt.io>2025-02-17 11:54:41 +0200
committerTarja Sundqvist <tarja.sundqvist@qt.io>2025-02-17 11:54:41 +0200
commit1363caf03949f5af3796000d8040bad24887addc (patch)
tree0522323ebda14fc31e9827afbc6b65c3dbdf7137
parentad9acbc8fbf320ca89dba22c0ce6e64bd74d0dfa (diff)
parent239e8f05793ab5b06bbf99383b55347f018bf43a (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.conf2
-rw-r--r--.qmake.conf2
-rw-r--r--dependencies.yaml8
-rw-r--r--src/plugins/renderers/opengl/renderer/renderview.cpp12
-rw-r--r--src/plugins/renderers/rhi/renderer/renderview.cpp12
-rw-r--r--src/render/backend/entity.cpp1
-rw-r--r--src/render/backend/entity_p.h3
-rw-r--r--src/render/backend/transform.cpp8
-rw-r--r--src/render/backend/transform_p.h4
-rw-r--r--src/render/jobs/updateworldtransformjob.cpp7
-rw-r--r--tests/auto/render/raycasting/tst_raycasting.cpp4
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;