summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-11-06 13:33:45 +0100
committerMike Krus <mike.krus@kdab.com>2016-01-21 10:57:01 +0000
commitc71faa27e6173255356df2e34050b8af15e4585b (patch)
tree424b9eea279f4403184998e49758651da134a532 /src
parent5d921dda57bff431487e6f1d64ef5111d464655d (diff)
Updated picking-qml example
handle device pixel ratio and none full-window Scene3D Change-Id: Iadc504a00816d9363847bf9ec1e09d4b7c631666 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/render/backend/abstractrenderer_p.h5
-rw-r--r--src/render/backend/renderer.cpp16
-rw-r--r--src/render/backend/renderer_p.h6
-rw-r--r--src/render/backend/renderview.cpp2
-rw-r--r--src/render/backend/renderview_p.h4
-rw-r--r--src/render/frontend/qrenderaspect.cpp37
-rw-r--r--src/render/frontend/qrenderaspect.h5
-rw-r--r--src/render/frontend/qrenderaspect_p.h2
-rw-r--r--src/render/graphicshelpers/graphicscontext.cpp4
-rw-r--r--src/render/graphicshelpers/graphicscontext_p.h2
-rw-r--r--src/render/jobs/pickboundingvolumejob.cpp16
-rw-r--r--src/render/jobs/renderviewjob.cpp1
-rw-r--r--src/render/jobs/renderviewjob_p.h3
13 files changed, 90 insertions, 13 deletions
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<GraphicsContext> 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<QWindow *>(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<Qt3DCore::QAspectJobPtr> 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<Qt3DCore::QAspectJobPtr> 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<Render::PlatformSurfaceFilter, QScopedPointerDeleteLater> 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<Qt3DCore::QNodeId> 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<Qt3DCore::QNodeId> 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;
};