From c71faa27e6173255356df2e34050b8af15e4585b Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Fri, 6 Nov 2015 13:33:45 +0100 Subject: Updated picking-qml example handle device pixel ratio and none full-window Scene3D Change-Id: Iadc504a00816d9363847bf9ec1e09d4b7c631666 Reviewed-by: Paul Lemire --- src/render/backend/abstractrenderer_p.h | 5 ++++ src/render/backend/renderer.cpp | 16 +++++++++-- src/render/backend/renderer_p.h | 6 +++++ src/render/backend/renderview.cpp | 2 ++ src/render/backend/renderview_p.h | 4 +++ src/render/frontend/qrenderaspect.cpp | 37 +++++++++++++++++++++++++- src/render/frontend/qrenderaspect.h | 5 ++++ src/render/frontend/qrenderaspect_p.h | 2 ++ src/render/graphicshelpers/graphicscontext.cpp | 4 ++- src/render/graphicshelpers/graphicscontext_p.h | 2 +- src/render/jobs/pickboundingvolumejob.cpp | 16 +++++------ src/render/jobs/renderviewjob.cpp | 1 + src/render/jobs/renderviewjob_p.h | 3 +++ 13 files changed, 90 insertions(+), 13 deletions(-) (limited to 'src/render') diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h index 39dadbbf8..109fa5c16 100644 --- a/src/render/backend/abstractrenderer_p.h +++ b/src/render/backend/abstractrenderer_p.h @@ -54,6 +54,7 @@ QT_BEGIN_NAMESPACE class QSurface; +class QSize; namespace Qt3DCore { class QAbstractFrameAdvanceService; @@ -89,11 +90,15 @@ public: virtual void setTime(qint64 time) = 0; virtual void setSurface(QSurface *surface) = 0; + virtual void setSurfaceSize(const QSize& s) = 0; + virtual void setDevicePixelRatio(qreal r) = 0; virtual void setNodeManagers(NodeManagers *managers) = 0; virtual void setServices(Qt3DCore::QServiceLocator *services) = 0; virtual void setSurfaceExposed(bool exposed) = 0; virtual QSurface *surface() const = 0; + virtual const QSize &surfaceSize() const = 0; + virtual qreal devicePixelRatio() const = 0; virtual NodeManagers *nodeManagers() const = 0; virtual Qt3DCore::QServiceLocator *services() const = 0; diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index c9a5b5b0f..94760bda5 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -136,6 +136,7 @@ Renderer::Renderer(QRenderAspect::RenderType type) , m_nodesManager(Q_NULLPTR) , m_graphicsContext(Q_NULLPTR) , m_surface(Q_NULLPTR) + , m_devicePixelRatio(1.) , m_renderQueue(new RenderQueue()) , m_renderThread(type == QRenderAspect::Threaded ? new RenderThread(this) : Q_NULLPTR) , m_vsyncFrameAdvanceService(new VSyncFrameAdvanceService()) @@ -508,6 +509,16 @@ void Renderer::setSurface(QSurface* surface) } } +void Renderer::setSurfaceSize(const QSize &s) +{ + m_surfaceSize = s; +} + +void Renderer::setDevicePixelRatio(qreal s) +{ + m_devicePixelRatio = s; +} + void Renderer::registerEventFilter(QEventFilterService *service) { qCDebug(Backend) << Q_FUNC_INFO << QThread::currentThread(); @@ -742,7 +753,7 @@ bool Renderer::submitRenderViews() m_graphicsContext->clearBackBuffer(renderView->clearBuffer()); // Set the Viewport - m_graphicsContext->setViewport(renderView->viewport()); + m_graphicsContext->setViewport(renderView->viewport(), renderView->surfaceSize() * renderView->devicePixelRatio()); // Execute the render commands executeCommands(renderView); @@ -810,7 +821,8 @@ Qt3DCore::QAspectJobPtr Renderer::createRenderViewJob(FrameGraphNode *node, int RenderViewJobPtr job(new RenderViewJob); job->setRenderer(this); if (m_surface) - job->setSurfaceSize(m_surface->size()); + job->setSurfaceSize(m_surfaceSize.isValid() ? m_surfaceSize : m_surface->size()); + job->setDevicePixelRatio(m_devicePixelRatio); job->setFrameGraphLeafNode(node); job->setSubmitOrderIndex(submitOrderIndex); return job; diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h index c3d2587ed..7d7eb944a 100644 --- a/src/render/backend/renderer_p.h +++ b/src/render/backend/renderer_p.h @@ -128,11 +128,15 @@ public: void setTime(qint64 time) Q_DECL_OVERRIDE; void setSurface(QSurface *s) Q_DECL_OVERRIDE; + void setSurfaceSize(const QSize& s) Q_DECL_OVERRIDE; + void setDevicePixelRatio(qreal s) Q_DECL_OVERRIDE; void setNodeManagers(NodeManagers *managers) Q_DECL_OVERRIDE { m_nodesManager = managers; } void setServices(Qt3DCore::QServiceLocator *services) Q_DECL_OVERRIDE { m_services = services; } void setSurfaceExposed(bool exposed) Q_DECL_OVERRIDE; QSurface *surface() const Q_DECL_OVERRIDE { return m_surface; } + const QSize &surfaceSize() const Q_DECL_OVERRIDE { return m_surfaceSize; } + qreal devicePixelRatio() const Q_DECL_OVERRIDE { return m_devicePixelRatio; } NodeManagers *nodeManagers() const Q_DECL_OVERRIDE; Qt3DCore::QServiceLocator *services() const Q_DECL_OVERRIDE { return m_services; } @@ -227,6 +231,8 @@ private: QScopedPointer m_graphicsContext; QSurface *m_surface; + QSize m_surfaceSize; + qreal m_devicePixelRatio; RenderQueue *m_renderQueue; diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp index 24e9d9c10..de7d0e5e8 100644 --- a/src/render/backend/renderview.cpp +++ b/src/render/backend/renderview.cpp @@ -270,6 +270,7 @@ QUniformValue *RenderView::eyePosition(const QMatrix4x4 &model) const RenderView::RenderView() : m_renderer(Q_NULLPTR) + , m_devicePixelRatio(1.) , m_allocator(Q_NULLPTR) , m_data(Q_NULLPTR) , m_clearColor(Q_NULLPTR) @@ -393,6 +394,7 @@ void RenderView::setRenderer(Renderer *renderer) { m_renderer = renderer; m_manager = renderer->nodeManagers(); + m_surface = renderer->surface(); m_data->m_uniformBlockBuilder.shaderDataManager = m_manager->shaderDataManager(); } diff --git a/src/render/backend/renderview_p.h b/src/render/backend/renderview_p.h index ccb0554f3..057a5ebed 100644 --- a/src/render/backend/renderview_p.h +++ b/src/render/backend/renderview_p.h @@ -118,6 +118,9 @@ public: inline void setSurfaceSize(const QSize &size) Q_DECL_NOEXCEPT { m_surfaceSize = size; } inline Renderer *renderer() const Q_DECL_NOEXCEPT { return m_renderer; } inline NodeManagers *nodeManagers() const Q_DECL_NOEXCEPT { return m_manager; } + inline const QSize &surfaceSize() const { return m_surfaceSize; } + inline void setDevicePixelRatio(qreal r) { m_devicePixelRatio = r; } + inline qreal devicePixelRatio() const { return m_devicePixelRatio; } inline void setAllocator(Qt3DCore::QFrameAllocator *allocator) { @@ -270,6 +273,7 @@ private: Renderer *m_renderer; NodeManagers *m_manager; QSize m_surfaceSize; + qreal m_devicePixelRatio; Qt3DCore::QFrameAllocator *m_allocator; InnerData *m_data; diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 35c194ccf..860445e48 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -200,6 +200,7 @@ void QRenderAspectPrivate::setSurface(QSurface *surface) QWindow *window = static_cast(m_surface); m_surfaceEventFilter->setWindow(window); hasPlatformSurface = (window->handle() != Q_NULLPTR); + m_devicePixelRatio = window->devicePixelRatio(); break; } @@ -211,9 +212,15 @@ void QRenderAspectPrivate::setSurface(QSurface *surface) } } + if (!m_surfaceSize.isValid()) + m_surfaceSize = surface->size(); + // If the window/offscreen surface has a native surface, tell the renderer - if (hasPlatformSurface) + if (hasPlatformSurface) { m_renderer->setSurface(surface); + m_renderer->setSurfaceSize(m_surfaceSize); + m_renderer->setDevicePixelRatio(m_devicePixelRatio); + } } } @@ -409,6 +416,34 @@ QVector QRenderAspect::jobsToExecute(qint64 time) return jobs; } +const QSize &QRenderAspect::surfaceSize() const +{ + Q_D(const QRenderAspect); + return d->m_surfaceSize; +} + +void QRenderAspect::setSurfaceSize(const QSize &s) +{ + Q_D(QRenderAspect); + d->m_surfaceSize = s; + if (d->m_renderer) + d->m_renderer->setSurfaceSize(s); +} + +qreal QRenderAspect::devicePixelRatio() const +{ + Q_D(const QRenderAspect); + return d->m_devicePixelRatio; +} + +void QRenderAspect::setDevicePixelRatio(qreal r) +{ + Q_D(QRenderAspect); + d->m_devicePixelRatio = r; + if (d->m_renderer) + d->m_renderer->setDevicePixelRatio(r); +} + void QRenderAspect::onRootEntityChanged(Qt3DCore::QEntity *rootEntity) { Q_D(QRenderAspect); diff --git a/src/render/frontend/qrenderaspect.h b/src/render/frontend/qrenderaspect.h index d7398dab7..2a9cd0eed 100644 --- a/src/render/frontend/qrenderaspect.h +++ b/src/render/frontend/qrenderaspect.h @@ -70,6 +70,11 @@ public: QVector jobsToExecute(qint64 time) Q_DECL_OVERRIDE; + const QSize &surfaceSize() const; + void setSurfaceSize(const QSize &s); + qreal devicePixelRatio() const; + void setDevicePixelRatio(qreal r); + protected: void registerBackendTypes(); QRenderAspect(QRenderAspectPrivate &dd, QObject *parent); diff --git a/src/render/frontend/qrenderaspect_p.h b/src/render/frontend/qrenderaspect_p.h index 4690e98ac..61fd096db 100644 --- a/src/render/frontend/qrenderaspect_p.h +++ b/src/render/frontend/qrenderaspect_p.h @@ -87,6 +87,8 @@ public: // via QScopedPointerDeleteLater QScopedPointer m_surfaceEventFilter; QSurface *m_surface; + QSize m_surfaceSize; + qreal m_devicePixelRatio; bool m_initialized; Render::FramePreparationJobPtr m_framePreparationJob; diff --git a/src/render/graphicshelpers/graphicscontext.cpp b/src/render/graphicshelpers/graphicscontext.cpp index b5b2898db..67d61deff 100644 --- a/src/render/graphicshelpers/graphicscontext.cpp +++ b/src/render/graphicshelpers/graphicscontext.cpp @@ -230,7 +230,7 @@ void GraphicsContext::endDrawing(bool swapBuffers) decayTextureScores(); } -void GraphicsContext::setViewport(const QRectF &viewport) +void GraphicsContext::setViewport(const QRectF &viewport, const QSize &surfaceSize) { m_viewport = viewport; QSize renderTargetSize; @@ -238,6 +238,8 @@ void GraphicsContext::setViewport(const QRectF &viewport) // For external FBOs we may not have a m_renderTargets entry. if (m_renderTargetsSize.contains(m_activeFBO)) { renderTargetSize = m_renderTargetsSize[m_activeFBO]; + } else if (surfaceSize.isValid()) { + renderTargetSize = surfaceSize; } else { // External FBO (when used with QtQuick2 Scene3D) diff --git a/src/render/graphicshelpers/graphicscontext_p.h b/src/render/graphicshelpers/graphicscontext_p.h index 51e6c8bc4..090f05937 100644 --- a/src/render/graphicshelpers/graphicscontext_p.h +++ b/src/render/graphicshelpers/graphicscontext_p.h @@ -106,7 +106,7 @@ public: void clearBackBuffer(QClearBuffer::BufferType buffers); void endDrawing(bool swapBuffers); - void setViewport(const QRectF &viewport); + void setViewport(const QRectF &viewport, const QSize &surfaceSize); QRectF viewport() const { return m_viewport; } /** diff --git a/src/render/jobs/pickboundingvolumejob.cpp b/src/render/jobs/pickboundingvolumejob.cpp index 23c320b83..344d83bff 100644 --- a/src/render/jobs/pickboundingvolumejob.cpp +++ b/src/render/jobs/pickboundingvolumejob.cpp @@ -395,10 +395,10 @@ void PickBoundingVolumeJob::viewMatrixForCamera(const Qt3DCore::QNodeId &cameraI QRect PickBoundingVolumeJob::windowViewport(const QRectF &relativeViewport) const { // TO DO: find another way to retrieve the size since this won't work with Scene3D - const QSurface *s = m_renderer->surface(); - if (s) { - const int surfaceWidth = s->size().width(); - const int surfaceHeight = s->size().height(); + const QSize s = m_renderer->surfaceSize(); + if (s.isValid()) { + const int surfaceWidth = s.width(); + const int surfaceHeight = s.height(); return QRect(relativeViewport.x() * surfaceWidth, (1.0 - relativeViewport.y() - relativeViewport.height()) * surfaceHeight, relativeViewport.width() * surfaceWidth, @@ -419,10 +419,10 @@ QVector PickBoundingVolumeJob::sphereHitsForViewportAndCamera viewMatrixForCamera(cameraId, viewMatrix, projectionMatrix); const QRect viewport = windowViewport(relativeViewport); - const QSurface *s = m_renderer->surface(); + const QSize s = m_renderer->surfaceSize(); // TO DO: find another way to retrieve the size since this won't work with Scene3D // In GL the y is inverted compared to Qt - const QPoint glCorrectPos = s ? QPoint(pos.x(), s->size().height() - pos.y()) : pos; + const QPoint glCorrectPos = s.isValid() ? QPoint(pos.x(), s.height() - pos.y()) : pos; const Qt3DCore::QRay3D ray = intersectionRay(glCorrectPos, viewMatrix, projectionMatrix, viewport); const QQueryHandle rayCastingHandle = rayCasting->query(ray, QAbstractCollisionQueryService::AllHits, volumeProvider); const QCollisionQueryResult queryResult = rayCasting->fetchResult(rayCastingHandle); @@ -440,10 +440,10 @@ QVector PickBoundingVolumeJob::triangleHitsForViewportAndCame viewMatrixForCamera(cameraId, viewMatrix, projectionMatrix); const QRect viewport = windowViewport(relativeViewport); - const QSurface *s = m_renderer->surface(); + const QSize s = m_renderer->surfaceSize(); // TO DO: find another way to retrieve the size since this won't work with Scene3D // In GL the y is inverted compared to Qt - const QPoint glCorrectPos = s ? QPoint(pos.x(), s->size().height() - pos.y()) : pos; + const QPoint glCorrectPos = s.isValid() ? QPoint(pos.x(), s.height() - pos.y()) : pos; const Qt3DCore::QRay3D ray = intersectionRay(glCorrectPos, viewMatrix, projectionMatrix, viewport); // Note: improve this further to only compute this once and not every time diff --git a/src/render/jobs/renderviewjob.cpp b/src/render/jobs/renderviewjob.cpp index 8482c672b..5c65d1d5f 100644 --- a/src/render/jobs/renderviewjob.cpp +++ b/src/render/jobs/renderviewjob.cpp @@ -60,6 +60,7 @@ void RenderViewJob::run() renderView->setAllocator(currentFrameAllocator); renderView->setRenderer(m_renderer); renderView->setSurfaceSize(m_surfaceSize); + renderView->setDevicePixelRatio(m_devicePixelRatio); // Populate the renderview's configuration from the framegraph setRenderViewConfigFromFrameGraphLeafNode(renderView, m_fgLeaf); diff --git a/src/render/jobs/renderviewjob_p.h b/src/render/jobs/renderviewjob_p.h index e26cce700..49be80697 100644 --- a/src/render/jobs/renderviewjob_p.h +++ b/src/render/jobs/renderviewjob_p.h @@ -67,12 +67,14 @@ class Q_AUTOTEST_EXPORT RenderViewJob : public Qt3DCore::QAspectJob public: RenderViewJob() : m_renderer(0) + , m_devicePixelRatio(1.) , m_fgLeaf(0) , m_index(0) {} inline void setRenderer(Renderer *renderer) { m_renderer = renderer; } inline void setSurfaceSize(const QSize &size) { m_surfaceSize = size; } + inline void setDevicePixelRatio(qreal r) { m_devicePixelRatio = r; } inline void setFrameGraphLeafNode(FrameGraphNode *fgLeaf) { @@ -92,6 +94,7 @@ protected: private: Renderer *m_renderer; QSize m_surfaceSize; + qreal m_devicePixelRatio; FrameGraphNode *m_fgLeaf; int m_index; }; -- cgit v1.2.3