summaryrefslogtreecommitdiffstats
path: root/src/datavisualizationqml2
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualizationqml2')
-rw-r--r--src/datavisualizationqml2/abstractdeclarative.cpp110
-rw-r--r--src/datavisualizationqml2/abstractdeclarative_p.h13
-rw-r--r--src/datavisualizationqml2/datavisualizationqml2.pro2
-rw-r--r--src/datavisualizationqml2/declarativebars.cpp2
-rw-r--r--src/datavisualizationqml2/declarativerenderer.cpp97
-rw-r--r--src/datavisualizationqml2/declarativerenderer_p.h67
-rw-r--r--src/datavisualizationqml2/declarativescatter.cpp2
-rw-r--r--src/datavisualizationqml2/declarativesurface.cpp2
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