File 0001-QmlDesigner-Compile-fixes-for-Qt-6.10-private-API-ch.patch of Package qt-creator

From 5a4c700ccefc76c7c531c834734e6fefa14b5364 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@qt.io>
Date: Tue, 29 Jul 2025 17:20:41 +0300
Subject: [PATCH] QmlDesigner: Compile fixes for Qt 6.10 private API changes

Fixes: QDS-15681
Change-Id: Ie2f56a31e7323a6c4eb9a306c63e0b87b4480c41
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
(cherry picked from commit c901f9e3e9f28aa651448e05d3cac531193de3fc)
---
 .../qmlpuppet/editor3d/camerageometry.cpp     |  2 +-
 .../qmlpuppet/editor3d/generalhelper.cpp      | 12 +++++++-
 .../qmlpuppet/editor3d/mousearea3d.cpp        | 15 +++++++---
 .../qmlpuppet/editor3d/mousearea3d.h          |  1 +
 .../editor3d/selectionboxgeometry.cpp         |  7 ++---
 .../qt5bakelightsnodeinstanceserver.cpp       | 28 +++++++++++++++++++
 6 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/src/tools/qmlpuppet/qmlpuppet/editor3d/camerageometry.cpp b/src/tools/qmlpuppet/qmlpuppet/editor3d/camerageometry.cpp
index 2c5987e0445..d8361f93066 100644
--- a/src/tools/qmlpuppet/qmlpuppet/editor3d/camerageometry.cpp
+++ b/src/tools/qmlpuppet/qmlpuppet/editor3d/camerageometry.cpp
@@ -154,7 +154,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
-        camera->calculateGlobalVariables(rect);
+        camera->calculateProjection(rect);
         m = camera->projection.inverted();
     }
 
diff --git a/src/tools/qmlpuppet/qmlpuppet/editor3d/generalhelper.cpp b/src/tools/qmlpuppet/qmlpuppet/editor3d/generalhelper.cpp
index 647d170383b..eb246b6b704 100644
--- a/src/tools/qmlpuppet/qmlpuppet/editor3d/generalhelper.cpp
+++ b/src/tools/qmlpuppet/qmlpuppet/editor3d/generalhelper.cpp
@@ -357,12 +357,22 @@ QVector4D GeneralHelper::focusNodesToCamera(QQuick3DCamera *camera, float defaul
                         auto geometry = qobject_cast<SelectionBoxGeometry *>(model->geometry());
                         if (geometry) {
                             bounds = geometry->bounds();
+
+                            // Selection boxes manipulate render node parent's transform directly,
+                            // so we can't just use sceneTransform() of the model.
+                            // However, they are always at top level, so we can use local transform
+                            // from the render node's parent.
+                            QMatrix4x4 m;
+                            if (renderModel->parent)
+                                m = renderModel->parent->localTransform;
+                            m *= renderModel->localTransform;
+                            center = m.map(bounds.center());
                         } else {
                             const auto &bufferManager(context->bufferManager());
                             bounds = bufferManager->getModelBounds(renderModel);
+                            center = model->sceneTransform().map(bounds.center());
                         }
 
-                        center = renderModel->globalTransform.map(bounds.center());
                         const QVector3D e = bounds.extents();
                         const QVector3D s = model->sceneScale();
                         qreal maxScale = qSqrt(qreal(s.x() * s.x() + s.y() * s.y() + s.z() * s.z()));
diff --git a/src/tools/qmlpuppet/qmlpuppet/editor3d/mousearea3d.cpp b/src/tools/qmlpuppet/qmlpuppet/editor3d/mousearea3d.cpp
index de6737c39db..8506fb1a454 100644
--- a/src/tools/qmlpuppet/qmlpuppet/editor3d/mousearea3d.cpp
+++ b/src/tools/qmlpuppet/qmlpuppet/editor3d/mousearea3d.cpp
@@ -808,8 +808,7 @@ QVector3D MouseArea3D::getMousePosInPlane(const MouseArea3D *helper,
     const DoubleVec3D rayPos0 = m_view3D->mapTo3DScene(mousePos1.toVec3());
     DoubleVec3D rayPos1;
     if (qobject_cast<QQuick3DOrthographicCamera *>(m_view3D->camera())) {
-        if (auto cameraNode = static_cast<QSSGRenderCamera *>(QQuick3DObjectPrivate::get(m_view3D->camera())->spatialNode))
-            rayPos1 = rayPos0 - rayPos0.length() * DoubleVec3D(cameraNode->getDirection());
+        rayPos1 = rayPos0 - rayPos0.length() * DoubleVec3D(getDirection(m_view3D->camera()));
     } else {
         DoubleVec3D dir;
         DoubleVec3D camPos = m_view3D->camera()->scenePosition();
@@ -1030,6 +1029,15 @@ QVector3D MouseArea3D::getNormal() const
     return QVector3D(dataPtr[8], dataPtr[9], dataPtr[10]).normalized();
 }
 
+QVector3D MouseArea3D::getDirection(const QQuick3DNode *node) const
+{
+    const QMatrix4x4 m = node->sceneTransform();
+    const float *dataPtr(m.data());
+    QVector3D retval(dataPtr[8], dataPtr[9], dataPtr[10]);
+    retval.normalize();
+    return retval;
+}
+
 QVector3D MouseArea3D::getCameraToNodeDir(QQuick3DNode *node) const
 {
     QVector3D dir;
@@ -1037,8 +1045,7 @@ QVector3D MouseArea3D::getCameraToNodeDir(QQuick3DNode *node) const
         // We need to do a cast here to be compatible with Qt 5.x.
         // From Qt 6.2 the type can be read from the node directly.
         if (qobject_cast<QQuick3DOrthographicCamera *>(m_view3D->camera())) {
-            if (auto renderCamera = QQuick3DObjectPrivate::get(m_view3D->camera())->spatialNode)
-                dir -= static_cast<QSSGRenderCamera *>(renderCamera)->getDirection();
+            dir -= getDirection(m_view3D->camera());
         } else {
             QVector3D camPos = m_view3D->camera()->scenePosition();
             QVector3D nodePos = pivotScenePosition(node);
diff --git a/src/tools/qmlpuppet/qmlpuppet/editor3d/mousearea3d.h b/src/tools/qmlpuppet/qmlpuppet/editor3d/mousearea3d.h
index 8d705c6eb0b..49a61bdfa09 100644
--- a/src/tools/qmlpuppet/qmlpuppet/editor3d/mousearea3d.h
+++ b/src/tools/qmlpuppet/qmlpuppet/editor3d/mousearea3d.h
@@ -135,6 +135,7 @@ private:
     void setDragging(bool enable);
     void setHovering(bool enable);
     QVector3D getNormal() const;
+    QVector3D getDirection(const QQuick3DNode *node) const;
     QVector3D getCameraToNodeDir(QQuick3DNode *node) const;
 
     Q_DISABLE_COPY(MouseArea3D)
diff --git a/src/tools/qmlpuppet/qmlpuppet/editor3d/selectionboxgeometry.cpp b/src/tools/qmlpuppet/qmlpuppet/editor3d/selectionboxgeometry.cpp
index 48e0f9f23df..ea453d73819 100644
--- a/src/tools/qmlpuppet/qmlpuppet/editor3d/selectionboxgeometry.cpp
+++ b/src/tools/qmlpuppet/qmlpuppet/editor3d/selectionboxgeometry.cpp
@@ -195,13 +195,10 @@ void SelectionBoxGeometry::doUpdateGeometry()
             // to avoid having to reparent the selection box. This has to be done directly on render
             // nodes.
             QMatrix4x4 m;
-            if (targetRN->parent) {
-                targetRN->parent->calculateGlobalVariables();
-                m = targetRN->parent->globalTransform;
-            }
+            if (m_targetNode->parentNode())
+                m = m_targetNode->parentNode()->sceneTransform();
             rootRN->localTransform = m;
             rootRN->markDirty(QSSGRenderNode::DirtyFlag::TransformDirty);
-            rootRN->calculateGlobalVariables();
         } else if (!m_spatialNodeUpdatePending) {
             // Necessary spatial nodes do not yet exist. Defer selection box creation one frame.
             m_spatialNodeUpdatePending = true;
diff --git a/src/tools/qmlpuppet/qmlpuppet/instances/qt5bakelightsnodeinstanceserver.cpp b/src/tools/qmlpuppet/qmlpuppet/instances/qt5bakelightsnodeinstanceserver.cpp
index 770eabdaa8d..f0a108a274e 100644
--- a/src/tools/qmlpuppet/qmlpuppet/instances/qt5bakelightsnodeinstanceserver.cpp
+++ b/src/tools/qmlpuppet/qmlpuppet/instances/qt5bakelightsnodeinstanceserver.cpp
@@ -96,6 +96,7 @@ void Qt5BakeLightsNodeInstanceServer::bakeLights()
         return;
     }
 
+#if QT_VERSION < QT_VERSION_CHECK(6, 10, 0)
     QQuick3DLightmapBaker::Callback callback = [this](QQuick3DLightmapBaker::BakingStatus status,
             std::optional<QString> msg, QQuick3DLightmapBaker::BakingControl *) {
         m_callbackReceived = true;
@@ -119,6 +120,33 @@ void Qt5BakeLightsNodeInstanceServer::bakeLights()
             break;
         }
     };
+#else
+    QQuick3DLightmapBaker::Callback callback = [this](const QVariantMap &data,
+                                                      QQuick3DLightmapBaker::BakingControl *) {
+        m_callbackReceived = true;
+        const QQuick3DLightmapBaker::BakingStatus status
+            = static_cast<QQuick3DLightmapBaker::BakingStatus>(data[QStringLiteral("status")].toInt());
+        QString msg = data.value("message").toString();
+        switch (status) {
+        case QQuick3DLightmapBaker::BakingStatus::Warning:
+        case QQuick3DLightmapBaker::BakingStatus::Error: {
+            nodeInstanceClient()->handlePuppetToCreatorCommand(
+                {PuppetToCreatorCommand::BakeLightsProgress, msg});
+            nodeInstanceClient()->flush();
+        } break;
+        case QQuick3DLightmapBaker::BakingStatus::Cancelled:
+            abort(tr("Baking cancelled."));
+            break;
+        case QQuick3DLightmapBaker::BakingStatus::Complete:
+            runDenoiser();
+            break;
+        default:
+            qWarning() << __FUNCTION__ << "Unexpected light baking status received:"
+                       << int(status) << msg;
+            break;
+        }
+    };
+#endif
 
     QQuick3DLightmapBaker *baker = m_view3D->lightmapBaker();
     baker->bake(callback);
-- 
2.51.0

openSUSE Build Service is sponsored by