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 ++++ 5 files changed, 31 insertions(+), 2 deletions(-) (limited to 'src/render/backend') 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; -- cgit v1.2.3