diff options
author | Keränen Pasi <pasi.keranen@digia.com> | 2013-12-16 16:17:07 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-12-17 12:52:03 +0200 |
commit | fba185e6c2fa5158aa60ba4468c1f1a70177f77a (patch) | |
tree | 4532ce4cc96fc52a32410f552e8557ea68d98267 /src/datavisualizationqml2 | |
parent | 018379d522deca3a6f7b184fbc12f122a87aaadc (diff) |
Antialiasing and direct rendering with QML.
Task-id: QTRD-2565
Change-Id: I4099c869f157361ee6a900dfc1c29301b373ac30
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavisualizationqml2')
-rw-r--r-- | src/datavisualizationqml2/abstractdeclarative.cpp | 110 | ||||
-rw-r--r-- | src/datavisualizationqml2/abstractdeclarative_p.h | 13 | ||||
-rw-r--r-- | src/datavisualizationqml2/datavisualizationqml2.pro | 2 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativebars.cpp | 2 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativerenderer.cpp | 97 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativerenderer_p.h | 67 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativescatter.cpp | 2 | ||||
-rw-r--r-- | src/datavisualizationqml2/declarativesurface.cpp | 2 |
8 files changed, 94 insertions, 201 deletions
diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 1bfa2911..0d6d7526 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -17,17 +17,19 @@ ****************************************************************************/ #include "abstractdeclarative_p.h" -#include "declarativerenderer_p.h" #include "q3dvalueaxis.h" +#include <QThread> +#include <QGuiApplication> QT_DATAVISUALIZATION_BEGIN_NAMESPACE AbstractDeclarative::AbstractDeclarative(QQuickItem *parent) : QQuickItem(parent), m_controller(0), - m_initialisedSize(0, 0), - m_devicePixelRatio(1.0) + m_isFirstRender(true) { + connect(this, &QQuickItem::windowChanged, this, &AbstractDeclarative::handleWindowChanged); + setAntialiasing(true); } AbstractDeclarative::~AbstractDeclarative() @@ -83,32 +85,91 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller) &AbstractDeclarative::selectionModeChanged); } -QSGNode *AbstractDeclarative::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) +void AbstractDeclarative::synchDataToRenderer() { - qreal devicePixelRatio = window()->devicePixelRatio(); + m_controller->initializeOpenGL(); + m_controller->synchDataToRenderer(); +} + +void AbstractDeclarative::handleWindowChanged(QQuickWindow *window) +{ + if (!window) + return; + + // Disable clearing of the window as we render underneath + window->setClearBeforeRendering(false); + + connect(window, &QQuickWindow::beforeSynchronizing, this, + &AbstractDeclarative::synchDataToRenderer, Qt::DirectConnection); + connect(window, &QQuickWindow::beforeRendering, this, + &AbstractDeclarative::render, Qt::DirectConnection); + connect(m_controller, &Abstract3DController::needRender, window, + &QQuickWindow::update); + + updateWindowParameters(); +} - // If old node exists and has right size and right device pixel ratio, reuse it. - if (oldNode && m_initialisedSize == boundingRect().size().toSize() && devicePixelRatio == m_devicePixelRatio) { - // Update bounding rectangle (that has same size as before). - static_cast<DeclarativeRenderer *>(oldNode)->setRect(boundingRect()); - return oldNode; +void AbstractDeclarative::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + QQuickItem::geometryChanged(newGeometry, oldGeometry); + + m_cachedGeometry = newGeometry; + + updateWindowParameters(); +} + +void AbstractDeclarative::itemChange(ItemChange change, const ItemChangeData & value) +{ + QQuickItem::itemChange(change, value); + + updateWindowParameters(); +} + +void AbstractDeclarative::updateWindowParameters() +{ + // Update the device pixel ratio, window size and bounding box + QQuickWindow *win = window(); + Q3DScene *scene = m_controller->scene(); + if (win) { + if (win->devicePixelRatio() != scene->devicePixelRatio()) + scene->setDevicePixelRatio(win->devicePixelRatio()); + + if (win->size() != scene->windowSize()) + scene->setWindowSize(QSize(win->width(), win->height())); + + QPointF point = QQuickItem::mapToScene(QPointF(m_cachedGeometry.x(), m_cachedGeometry.y())); + if (m_controller) { + scene->setViewport(QRect(point.x(), point.y(), m_cachedGeometry.width(), m_cachedGeometry.height())); + } + + } +} + +void AbstractDeclarative::render() +{ + // Needed to catch the window size change upon first render call + if (m_isFirstRender) { + m_isFirstRender = false; + updateWindowParameters(); } - // Create a new render node when size changes or if there is no node yet - m_initialisedSize = boundingRect().size().toSize(); - m_devicePixelRatio = devicePixelRatio; + // Clear the background as that is not done by default + glViewport(0, 0, window()->width(), window()->height()); + QColor clearColor = window()->color(); + glClearColor(clearColor.redF(), clearColor.greenF(), clearColor.blueF(), 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // TODO: Store the state of these and restore before returning + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glDisable(GL_BLEND); - // Delete old node - if (oldNode) - delete oldNode; + m_controller->render(); - // Create a new one and set it's bounding rectangle - DeclarativeRenderer *node = new DeclarativeRenderer(window(), m_controller); - node->setDevicePixelRatio(float(m_devicePixelRatio)); - node->setRect(boundingRect()); - m_controller->scene()->setDevicePixelRatio(m_devicePixelRatio); - m_controller->setBoundingRect(boundingRect().toRect()); - return node; + glEnable(GL_BLEND); } QAbstract3DInputHandler* AbstractDeclarative::inputHandler() const @@ -135,21 +196,18 @@ void AbstractDeclarative::touchEvent(QTouchEvent *event) void AbstractDeclarative::mousePressEvent(QMouseEvent *event) { QPoint mousePos = event->pos(); - //mousePos.setY(height() - mousePos.y()); m_controller->mousePressEvent(event, mousePos); } void AbstractDeclarative::mouseReleaseEvent(QMouseEvent *event) { QPoint mousePos = event->pos(); - //mousePos.setY(height() - mousePos.y()); m_controller->mouseReleaseEvent(event, mousePos); } void AbstractDeclarative::mouseMoveEvent(QMouseEvent *event) { QPoint mousePos = event->pos(); - //mousePos.setY(height() - mousePos.y()); m_controller->mouseMoveEvent(event, mousePos); } diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index aa3cf498..65017b05 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -64,10 +64,15 @@ public: virtual void setSelectionMode(QDataVis::SelectionFlags mode); virtual QDataVis::SelectionFlags selectionMode() const; + virtual void geometryChanged(const QRectF & newGeometry, const QRectF & oldGeometry); + virtual void setShadowQuality(QDataVis::ShadowQuality quality); virtual QDataVis::ShadowQuality shadowQuality() const; void setSharedController(Abstract3DController *controller); + // Used to synch up data model from controller to renderer while main thread is locked + void synchDataToRenderer(); + void render(); protected: virtual void mouseDoubleClickEvent(QMouseEvent *event); @@ -76,7 +81,9 @@ protected: virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event); virtual void wheelEvent(QWheelEvent *event); - virtual QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *); + virtual void handleWindowChanged(QQuickWindow *win); + virtual void itemChange(ItemChange change, const ItemChangeData &value); + virtual void updateWindowParameters(); signals: // Signals shadow quality changes. @@ -89,8 +96,8 @@ signals: private: Abstract3DController *m_controller; - QSize m_initialisedSize; - qreal m_devicePixelRatio; + QRectF m_cachedGeometry; + bool m_isFirstRender; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualizationqml2/datavisualizationqml2.pro b/src/datavisualizationqml2/datavisualizationqml2.pro index 938a8a5c..989b52b9 100644 --- a/src/datavisualizationqml2/datavisualizationqml2.pro +++ b/src/datavisualizationqml2/datavisualizationqml2.pro @@ -26,7 +26,6 @@ SOURCES += \ abstractdeclarative.cpp \ colorgradient.cpp \ declarativeseries.cpp \ - declarativerenderer.cpp \ declarativetheme.cpp \ declarativecolor.cpp @@ -38,7 +37,6 @@ HEADERS += \ abstractdeclarative_p.h \ colorgradient_p.h \ declarativeseries_p.h \ - declarativerenderer_p.h \ declarativetheme_p.h \ declarativecolor_p.h diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp index 5c64e173..7eab8886 100644 --- a/src/datavisualizationqml2/declarativebars.cpp +++ b/src/datavisualizationqml2/declarativebars.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "declarativebars_p.h" -#include "declarativerenderer_p.h" #include "q3dvalueaxis.h" #include "qitemmodelbardataproxy.h" @@ -27,7 +26,6 @@ DeclarativeBars::DeclarativeBars(QQuickItem *parent) : AbstractDeclarative(parent), m_barsController(0) { - setFlags(QQuickItem::ItemHasContents); setAcceptedMouseButtons(Qt::AllButtons); // TODO: These seem to have no effect; find a way to activate anti-aliasing diff --git a/src/datavisualizationqml2/declarativerenderer.cpp b/src/datavisualizationqml2/declarativerenderer.cpp deleted file mode 100644 index b9c80b1a..00000000 --- a/src/datavisualizationqml2/declarativerenderer.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#include "declarativerenderer_p.h" - -#include <QtQuick/QQuickWindow> -#include <QtGui/QOpenGLFramebufferObject> - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -DeclarativeRenderer::DeclarativeRenderer(QQuickWindow *window, Abstract3DController *controller) : - m_fbo(0), - m_texture(0), - m_window(window), - m_controller(controller) -{ - connect(m_window, &QQuickWindow::beforeSynchronizing, this, - &DeclarativeRenderer::synchDataToRenderer, Qt::DirectConnection); - connect(m_window, &QQuickWindow::beforeRendering, this, - &DeclarativeRenderer::renderFBO, Qt::DirectConnection); - connect(m_controller.data(), &Abstract3DController::needRender, m_window, - &QQuickWindow::update); -} - -DeclarativeRenderer::~DeclarativeRenderer() -{ - delete m_texture; - delete m_fbo; -} - -void DeclarativeRenderer::synchDataToRenderer() -{ - if (m_controller) { - m_controller->initializeOpenGL(); - m_controller->synchDataToRenderer(); - } -} - -void DeclarativeRenderer::setDevicePixelRatio(float devicePixelRatio ) -{ - m_devicePixelRatio = devicePixelRatio; -} - -void DeclarativeRenderer::renderFBO() -{ - if (m_controller) { - QSize size = rect().size().toSize(); - size.setWidth(size.width() * m_devicePixelRatio); - size.setHeight(size.height() * m_devicePixelRatio); - - // Create FBO - if (!m_fbo) { - QOpenGLFramebufferObjectFormat format; - format.setAttachment(QOpenGLFramebufferObject::Depth); - m_fbo = new QOpenGLFramebufferObject(size, format); - m_texture = m_window->createTextureFromId(m_fbo->texture(), size); - - setTexture(m_texture); - - // Flip texture - // TODO: Can be gotten rid of once support for texture flipping becomes available (in Qt5.2) - QSize ts = m_texture->textureSize(); - QRectF sourceRect(0, 0, ts.width(), ts.height()); - float tmp = sourceRect.top(); - sourceRect.setTop(sourceRect.bottom()); - sourceRect.setBottom(tmp); - QSGGeometry *geometry = this->geometry(); - QSGGeometry::updateTexturedRectGeometry(geometry, rect(), - m_texture->convertToNormalizedSourceRect(sourceRect)); - markDirty(DirtyMaterial); - } - - // Call the graph rendering function - m_fbo->bind(); - - m_controller->render(m_fbo->handle()); - - m_fbo->release(); - } -} - -QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualizationqml2/declarativerenderer_p.h b/src/datavisualizationqml2/declarativerenderer_p.h deleted file mode 100644 index 75f4f290..00000000 --- a/src/datavisualizationqml2/declarativerenderer_p.h +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the QtDataVisualization API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. - -#ifndef ABSTRACTDECLARATIVERENDERER_P_H -#define ABSTRACTDECLARATIVERENDERER_P_H - -#include "datavisualizationglobal_p.h" -#include <abstract3dcontroller_p.h> -#include <QSGSimpleTextureNode> -#include <QPointer> - -class QOpenGLFramebufferObject; -class QSGTexture; -class QQuickWindow; - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class DeclarativeRenderer : public QObject, public QSGSimpleTextureNode -{ - Q_OBJECT -public: - explicit DeclarativeRenderer(QQuickWindow *window, Abstract3DController *shared); - virtual ~DeclarativeRenderer(); - -public slots: - // Used to synch up data model from controller to renderer while main thread is locked - void synchDataToRenderer(); - // Renders view to FBO before render cycle starts. - void renderFBO(); - void setDevicePixelRatio(float devicePixelRatio); - -private: - QOpenGLFramebufferObject *m_fbo; - QSGTexture *m_texture; - QQuickWindow *m_window; - QPointer<Abstract3DController> m_controller; - float m_devicePixelRatio; -}; - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif // ABSTRACTDECLARATIVERENDERER_P_H diff --git a/src/datavisualizationqml2/declarativescatter.cpp b/src/datavisualizationqml2/declarativescatter.cpp index 483bb467..5aaa19b6 100644 --- a/src/datavisualizationqml2/declarativescatter.cpp +++ b/src/datavisualizationqml2/declarativescatter.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "declarativescatter_p.h" -#include "declarativerenderer_p.h" #include "qitemmodelscatterdataproxy.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -26,7 +25,6 @@ DeclarativeScatter::DeclarativeScatter(QQuickItem *parent) : AbstractDeclarative(parent), m_scatterController(0) { - setFlags(QQuickItem::ItemHasContents); setAcceptedMouseButtons(Qt::AllButtons); // TODO: These seem to have no effect; find a way to activate anti-aliasing diff --git a/src/datavisualizationqml2/declarativesurface.cpp b/src/datavisualizationqml2/declarativesurface.cpp index 7c73d379..3ba5f923 100644 --- a/src/datavisualizationqml2/declarativesurface.cpp +++ b/src/datavisualizationqml2/declarativesurface.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "declarativesurface_p.h" -#include "declarativerenderer_p.h" #include "q3dvalueaxis.h" #include "qitemmodelsurfacedataproxy.h" @@ -27,7 +26,6 @@ DeclarativeSurface::DeclarativeSurface(QQuickItem *parent) : AbstractDeclarative(parent), m_surfaceController(0) { - setFlags(QQuickItem::ItemHasContents); setAcceptedMouseButtons(Qt::AllButtons); // TODO: These seem to have no effect; find a way to activate anti-aliasing |