diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp index 69973385b15..15fe79082a5 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include @@ -114,8 +116,42 @@ QSSGRenderGraphObject *CameraGeometry::updateSpatialNode(QSSGRenderGraphObject * return node; if (!m_camera->cameraNode()) { - // Force cameraNode creation by doing a dummy mapping call +#if QT_VERSION <= QT_VERSION_CHECK(5, 14, 1) + // 5.14.1 doesn't yet have function to force camera node creation, so we must do it + // the hard way + auto camera = new QSSGRenderCamera(); + bool changed = false; + if (auto perspCamera = qobject_cast(m_camera)) { + changed |= qUpdateIfNeeded(camera->clipNear, perspCamera->clipNear()); + changed |= qUpdateIfNeeded(camera->clipFar, perspCamera->clipFar()); + changed |= qUpdateIfNeeded(camera->fov, qDegreesToRadians(perspCamera->fieldOfView())); + changed |= qUpdateIfNeeded(camera->fovHorizontal, perspCamera->fieldOfViewOrientation() + == QQuick3DCamera::FieldOfViewOrientation::Horizontal); + changed |= qUpdateIfNeeded(camera->enableFrustumClipping, perspCamera->frustumCullingEnabled()); + if (auto frustCamera = qobject_cast(m_camera)) { + camera->flags.setFlag(QSSGRenderNode::Flag::CameraFrustumProjection, true); + changed |= qUpdateIfNeeded(camera->top, frustCamera->top()); + changed |= qUpdateIfNeeded(camera->bottom, frustCamera->bottom()); + changed |= qUpdateIfNeeded(camera->right, frustCamera->right()); + changed |= qUpdateIfNeeded(camera->left, frustCamera->left()); + } + } else if (auto orthoCamera = qobject_cast(m_camera)) { + camera->flags.setFlag(QSSGRenderNode::Flag::Orthographic, true); + changed |= qUpdateIfNeeded(camera->clipNear, orthoCamera->clipNear()); + changed |= qUpdateIfNeeded(camera->clipFar, orthoCamera->clipFar()); + changed |= qUpdateIfNeeded(camera->enableFrustumClipping, orthoCamera->frustumCullingEnabled()); + } else if (auto customCamera = qobject_cast(m_camera)) { + camera->flags.setFlag(QSSGRenderNode::Flag::CameraCustomProjection, true); + changed |= qUpdateIfNeeded(camera->projection, customCamera->projection()); + changed |= qUpdateIfNeeded(camera->enableFrustumClipping, customCamera->frustumCullingEnabled()); + } + if (changed) + camera->flags.setFlag(QSSGRenderNode::Flag::CameraDirty); + m_camera->setCameraNode(camera); +#else + // Doing explicit viewport mapping forces cameraNode creation m_camera->mapToViewport({}, m_viewPortRect.width(), m_viewPortRect.height()); +#endif } node = QQuick3DGeometry::updateSpatialNode(node);