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/abstractdeclarative.cpp | |
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/abstractdeclarative.cpp')
-rw-r--r-- | src/datavisualizationqml2/abstractdeclarative.cpp | 110 |
1 files changed, 84 insertions, 26 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); } |