diff --git a/src/quick3d/qquick3dscenerenderer.cpp b/src/quick3d/qquick3dscenerenderer.cpp index 8995ffd7fa742535881fd55292bc7d1be8d1bb02..e1706d21ca7588ff6a1c8e3e2b833b8d3770b01c 100644 --- a/src/quick3d/qquick3dscenerenderer.cpp +++ b/src/quick3d/qquick3dscenerenderer.cpp @@ -396,7 +396,10 @@ QSSGRenderPickResult QQuick3DSceneRenderer::pick(const QPointF &pos) QSSGRenderPickResult QQuick3DSceneRenderer::syncPick(const QPointF &pos) { - return m_sgContext->renderer()->syncPick(*m_layer, QVector2D(m_surfaceSize.width(), m_surfaceSize.height()), QVector2D(float(pos.x()), float(pos.y()))); + return m_sgContext->renderer()->syncPick(*m_layer, + m_sgContext->bufferManager(), + QVector2D(m_surfaceSize.width(), m_surfaceSize.height()), + QVector2D(float(pos.x()), float(pos.y()))); } QQuick3DRenderStats *QQuick3DSceneRenderer::renderStats() diff --git a/src/runtimerender/qssgrenderer_p.h b/src/runtimerender/qssgrenderer_p.h index 07d34598b25a85cfd7372573d637298bd249e512..291f2d5f504291bb0dee8b8538cc44d6d131b332 100644 --- a/src/runtimerender/qssgrenderer_p.h +++ b/src/runtimerender/qssgrenderer_p.h @@ -137,6 +137,7 @@ public: bool inPickSiblings = true, bool inPickEverything = false) = 0; virtual QSSGRenderPickResult syncPick(const QSSGRenderLayer &inLayer, + const QSSGRef<QSSGBufferManager> &bufferManager, const QVector2D &inViewportDimensions, const QVector2D &inMouseCoords) = 0; diff --git a/src/runtimerender/rendererimpl/qssgrendererimpl.cpp b/src/runtimerender/rendererimpl/qssgrendererimpl.cpp index 24c3ec447eed11c2978e684e873ef383371fdc2d..a7bf8f56fda5beb5f473a0c3f35eab7d622f9455 100644 --- a/src/runtimerender/rendererimpl/qssgrendererimpl.cpp +++ b/src/runtimerender/rendererimpl/qssgrendererimpl.cpp @@ -464,7 +464,10 @@ QSSGRenderPickResult QSSGRendererImpl::pick(QSSGRenderLayer &inLayer, return QSSGRenderPickResult(); } -QSSGRenderPickResult QSSGRendererImpl::syncPick(const QSSGRenderLayer &layer, const QVector2D &inViewportDimensions, const QVector2D &inMouseCoords) +QSSGRenderPickResult QSSGRendererImpl::syncPick(const QSSGRenderLayer &layer, + const QSSGRef<QSSGBufferManager> &bufferManager, + const QVector2D &inViewportDimensions, + const QVector2D &inMouseCoords) { using PickResultList = QVarLengthArray<QSSGRenderPickResult, 20>; // Lets assume most items are filtered out already static const auto processResults = [](PickResultList &pickResults) { @@ -479,7 +482,7 @@ QSSGRenderPickResult QSSGRendererImpl::syncPick(const QSSGRenderLayer &layer, co PickResultList pickResults; if (layer.flags.testFlag(QSSGRenderLayer::Flag::Active)) { - getLayerHitObjectList(layer, inViewportDimensions, inMouseCoords, false, pickResults); + getLayerHitObjectList(layer, bufferManager, inViewportDimensions, inMouseCoords, false, pickResults); QSSGPickResultProcessResult retval = processResults(pickResults); if (retval.m_wasPickConsumed) return retval; @@ -833,6 +836,7 @@ static void dfs(const QSSGRenderNode &node, RenderableList &renderables) } void QSSGRendererImpl::getLayerHitObjectList(const QSSGRenderLayer &layer, + const QSSGRef<QSSGBufferManager> &bufferManager, const QVector2D &inViewportDimensions, const QVector2D &inPresCoords, bool inPickEverything, @@ -853,7 +857,6 @@ void QSSGRendererImpl::getLayerHitObjectList(const QSSGRenderLayer &layer, for (QSSGRenderNode *childNode = layer.firstChild; childNode; childNode = childNode->nextSibling) dfs(*childNode, renderables); - const auto &bufferManager = contextInterface()->bufferManager(); for (int idx = renderables.size(), end = 0; idx > end; --idx) { const auto &pickableObject = renderables.at(idx - 1); if (inPickEverything || pickableObject->flags.testFlag(QSSGRenderNode::Flag::LocallyPickable)) diff --git a/src/runtimerender/rendererimpl/qssgrendererimpl_p.h b/src/runtimerender/rendererimpl/qssgrendererimpl_p.h index 61d72cc84abafc4932f79d592282d85a001feafd..57637a94d0996f912b995b13ff554827695950b3 100644 --- a/src/runtimerender/rendererimpl/qssgrendererimpl_p.h +++ b/src/runtimerender/rendererimpl/qssgrendererimpl_p.h @@ -203,6 +203,7 @@ public: bool inPickSiblings, bool inPickEverything) override; QSSGRenderPickResult syncPick(const QSSGRenderLayer &layer, + const QSSGRef<QSSGBufferManager> &bufferManager, const QVector2D &inViewportDimensions, const QVector2D &inMouseCoords) override; @@ -332,11 +333,12 @@ protected: const QVector2D &inMouseCoords, bool inPickEverything, TPickResultArray &outIntersectionResult); - void getLayerHitObjectList(const QSSGRenderLayer &layer, - const QVector2D &inViewportDimensions, - const QVector2D &inMouseCoords, - bool inPickEverything, - PickResultList &outIntersectionResult); + static void getLayerHitObjectList(const QSSGRenderLayer &layer, + const QSSGRef<QSSGBufferManager> &bufferManager, + const QVector2D &inViewportDimensions, + const QVector2D &inMouseCoords, + bool inPickEverything, + PickResultList &outIntersectionResult); static void intersectRayWithSubsetRenderable(const QSSGRef<QSSGBufferManager> &bufferManager, const QSSGRenderRay &inRay, const QSSGRenderNode &node,