From fa69a7088a945d8535316cba1642645f1dcc069a Mon Sep 17 00:00:00 2001 From: Andy Nichols <andy.nichols@qt.io> Date: Tue, 11 Jun 2019 15:39:00 +0200 Subject: [PATCH] RenderModes: Get the RenderNode path working, though still buggy --- src/quick3d/qdemonscenerenderer.cpp | 33 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/quick3d/qdemonscenerenderer.cpp b/src/quick3d/qdemonscenerenderer.cpp index 68ec4213..7010582b 100644 --- a/src/quick3d/qdemonscenerenderer.cpp +++ b/src/quick3d/qdemonscenerenderer.cpp @@ -326,14 +326,32 @@ QSGRenderNode::StateFlags QDemonSGRenderNode::changedStates() const return BlendState | StencilState | DepthState | ScissorState | ColorState | CullState | ViewportState | RenderTargetState; } +namespace { +QRect convertQtRectToGLViewport(const QRectF &rect, const QSize surfaceSize) { + // + const int x = int(rect.x()); + const int y = surfaceSize.height() - (int(rect.y()) + int(rect.height())); + const int width = int(rect.width()); + const int height = int(rect.height()); + return QRect(x, y, width, height); +} +} + void QDemonSGRenderNode::render(const QSGRenderNode::RenderState *state) { // calculate viewport - QRect viewport = matrix()->mapRect(QRect(QPoint(0, 0), renderer->surfaceSize())); + const double dpr = renderer->m_window->devicePixelRatio(); + const QSizeF itemSize = renderer->surfaceSize() / dpr; + + QRectF viewport = matrix()->mapRect(QRectF(QPoint(0, 0), itemSize)); + viewport = QRectF(viewport.topLeft() * dpr, viewport.size() * dpr); // render - renderer->render(viewport); + renderer->render(convertQtRectToGLViewport(viewport, window->size() * dpr)); markDirty(QSGNode::DirtyMaterial); + + // reset some state + window->resetOpenGLState(); } void QDemonSGRenderNode::releaseResources() @@ -371,17 +389,6 @@ void QDemonSGDirectRenderer::requestRender() m_window->update(); } -namespace { -QRect convertQtRectToGLViewport(const QRectF &rect, const QSize surfaceSize) { - // - const int x = int(rect.x()); - const int y = surfaceSize.height() - (int(rect.y()) + int(rect.height())); - const int width = int(rect.width()); - const int height = int(rect.height()); - return QRect(x, y, width, height); -} -} - void QDemonSGDirectRenderer::render() { const QRect glViewport = convertQtRectToGLViewport(m_viewport, m_window->size() * m_window->devicePixelRatio()); -- GitLab