diff options
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/backend/renderer.cpp | 5 | ||||
-rw-r--r-- | src/render/backend/renderer_p.h | 1 | ||||
-rw-r--r-- | src/render/backend/renderview.cpp | 37 | ||||
-rw-r--r-- | src/render/backend/renderview_p.h | 2 |
4 files changed, 45 insertions, 0 deletions
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index 3e3d92f7a..4f5db8d3a 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -372,6 +372,11 @@ void Renderer::setSurface(QSurface* s) m_waitForWindowToBeSetCondition.wakeOne(); } +QSurface *Renderer::surface() const +{ + return m_surface; +} + void Renderer::render() { // Traversing the framegraph tree from root to lead node diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h index 67738950b..8d17772ac 100644 --- a/src/render/backend/renderer_p.h +++ b/src/render/backend/renderer_p.h @@ -184,6 +184,7 @@ public: inline int cachedFramesCount() const { return m_cachedFramesCount; } void setSurface(QSurface *s); + QSurface *surface() const; void enqueueRenderView(RenderView *renderView, int submitOrder); void submitRenderViews(); diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp index 53bdc2c8d..7c924384e 100644 --- a/src/render/backend/renderview.cpp +++ b/src/render/backend/renderview.cpp @@ -100,6 +100,8 @@ #include <Qt3DCore/qabstracttechnique.h> #include <Qt3DCore/qframeallocator.h> +#include <QtGui/qsurface.h> + #include <algorithm> #include <QDebug> @@ -129,6 +131,8 @@ RenderView::standardUniformsPFuncsHash RenderView::initializeStandardUniformSett setters[QStringLiteral("inverseModelViewProjection")] = &RenderView::inverseModelViewProjectionMatrix; setters[QStringLiteral("modelNormalMatrix")] = &RenderView::modelNormalMatrix; setters[QStringLiteral("modelViewNormal")] = &RenderView::modelViewNormalMatrix; + setters[QStringLiteral("viewportMatrix")] = &RenderView::viewportMatrix; + setters[QStringLiteral("inverseViewportMatrix")] = &RenderView::inverseViewportMatrix; return setters; } @@ -239,6 +243,39 @@ QUniformValue *RenderView::modelViewNormalMatrix(const QMatrix4x4 &model) const return t; } +// TODO: Move this somewhere global where QGraphicsContext::setViewport() can use it too +static QRectF resolveViewport(const QRectF &fractionalViewport, const QSize &surfaceSize) +{ + return QRectF(fractionalViewport.x() * surfaceSize.width(), + (1.0 - fractionalViewport.y() - fractionalViewport.height()) * surfaceSize.height(), + fractionalViewport.width() * surfaceSize.width(), + fractionalViewport.height() * surfaceSize.height()); +} + +QUniformValue *RenderView::viewportMatrix(const QMatrix4x4 &model) const +{ + // TODO: Can we avoid having to pass the model matrix in to these functions? + Q_UNUSED(model); + SpecifiedUniform<QMatrix4x4> *t = m_allocator->allocate<SpecifiedUniform<QMatrix4x4> >(); + QMatrix4x4 viewportMatrix; + QSize surfaceSize = m_renderer->surface()->size(); + viewportMatrix.viewport(resolveViewport(*m_viewport, surfaceSize)); + t->setValue(viewportMatrix); + return t; +} + +QUniformValue *RenderView::inverseViewportMatrix(const QMatrix4x4 &model) const +{ + Q_UNUSED(model); + SpecifiedUniform<QMatrix4x4> *t = m_allocator->allocate<SpecifiedUniform<QMatrix4x4> >(); + QMatrix4x4 viewportMatrix; + QSize surfaceSize = m_renderer->surface()->size(); + viewportMatrix.viewport(resolveViewport(*m_viewport, surfaceSize)); + QMatrix4x4 inverseViewportMatrix = viewportMatrix.inverted(); + t->setValue(inverseViewportMatrix); + return t; +} + RenderView::RenderView() : m_renderer(Q_NULLPTR) , m_allocator(Q_NULLPTR) diff --git a/src/render/backend/renderview_p.h b/src/render/backend/renderview_p.h index 35272faa4..b428bcf7a 100644 --- a/src/render/backend/renderview_p.h +++ b/src/render/backend/renderview_p.h @@ -173,6 +173,8 @@ private: QUniformValue *inverseModelViewProjectionMatrix(const QMatrix4x4 &model) const; QUniformValue *modelNormalMatrix(const QMatrix4x4 &model) const; QUniformValue *modelViewNormalMatrix(const QMatrix4x4 &model) const; + QUniformValue *viewportMatrix(const QMatrix4x4 &model) const; + QUniformValue *inverseViewportMatrix(const QMatrix4x4 &model) const; void setUniformValue(QUniformPack &uniformPack, const QString &name, const QVariant &value); }; |