summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/backend/renderer.cpp5
-rw-r--r--src/render/backend/renderer_p.h1
-rw-r--r--src/render/backend/renderview.cpp37
-rw-r--r--src/render/backend/renderview_p.h2
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);
};