summaryrefslogtreecommitdiffstats
path: root/src/datavis3dqml2
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavis3dqml2')
-rw-r--r--src/datavis3dqml2/datavis3dqml2.pro8
-rw-r--r--src/datavis3dqml2/datavis3dqml2_plugin.cpp13
-rw-r--r--src/datavis3dqml2/datavis3dqml2_plugin.h13
-rw-r--r--src/datavis3dqml2/declarativesurface.cpp288
-rw-r--r--src/datavis3dqml2/declarativesurface_p.h156
-rw-r--r--src/datavis3dqml2/declarativesurfacerenderer.cpp87
-rw-r--r--src/datavis3dqml2/declarativesurfacerenderer_p.h65
7 files changed, 622 insertions, 8 deletions
diff --git a/src/datavis3dqml2/datavis3dqml2.pro b/src/datavis3dqml2/datavis3dqml2.pro
index b7157a26..aa4d7d71 100644
--- a/src/datavis3dqml2/datavis3dqml2.pro
+++ b/src/datavis3dqml2/datavis3dqml2.pro
@@ -21,14 +21,18 @@ SOURCES += \
declarativebars.cpp \
declarativebarsrenderer.cpp \
declarativescatter.cpp \
- declarativescatterrenderer.cpp
+ declarativescatterrenderer.cpp \
+ declarativesurface.cpp \
+ declarativesurfacerenderer.cpp
HEADERS += \
datavis3dqml2_plugin.h \
declarativebars_p.h \
declarativebarsrenderer_p.h \
declarativescatter_p.h \
- declarativescatterrenderer_p.h
+ declarativescatterrenderer_p.h \
+ declarativesurface_p.h \
+ declarativesurfacerenderer_p.h
OTHER_FILES = qmldir
diff --git a/src/datavis3dqml2/datavis3dqml2_plugin.cpp b/src/datavis3dqml2/datavis3dqml2_plugin.cpp
index 8c73e318..6caacfd1 100644
--- a/src/datavis3dqml2/datavis3dqml2_plugin.cpp
+++ b/src/datavis3dqml2/datavis3dqml2_plugin.cpp
@@ -26,29 +26,34 @@ void Datavis3Dqml2Plugin::registerTypes(const char *uri)
{
// @uri com.digia.QtDataVis3D
qmlRegisterUncreatableType<const QAbstractItemModel>(uri, 1, 0, "AbstractItemModel",
- QLatin1String("Trying to create uncreatable: AbstractItemModel."));
+ QLatin1String("Trying to create uncreatable: AbstractItemModel."));
qmlRegisterUncreatableType<QDataVis>(uri, 1, 0, "DataVis",
QLatin1String("Trying to create uncreatable: DataVis."));
qmlRegisterUncreatableType<Q3DAbstractAxis>(uri, 1, 0, "AbstractAxis3D",
- QLatin1String("Trying to create uncreatable: AbstractAxis."));
+ QLatin1String("Trying to create uncreatable: AbstractAxis."));
qmlRegisterUncreatableType<QAbstractDataProxy>(uri, 1, 0, "AbstractDataProxy",
- QLatin1String("Trying to create uncreatable: AbstractDataProxy."));
+ QLatin1String("Trying to create uncreatable: AbstractDataProxy."));
qmlRegisterUncreatableType<QBarDataProxy>(uri, 1, 0, "BarDataProxy",
QLatin1String("Trying to create uncreatable: BarDataProxy."));
qmlRegisterUncreatableType<QScatterDataProxy>(uri, 1, 0, "ScatterDataProxy",
- QLatin1String("Trying to create uncreatable: ScatterDataProxy."));
+ QLatin1String("Trying to create uncreatable: ScatterDataProxy."));
+ qmlRegisterUncreatableType<QSurfaceDataProxy>(uri, 1, 0, "SurfaceDataProxy",
+ QLatin1String("Trying to create uncreatable: SurfaceDataProxy."));
qmlRegisterType<QItemModelBarDataMapping>(uri, 1, 0, "BarDataMapping");
qmlRegisterType<QItemModelScatterDataMapping>(uri, 1, 0, "ScatterDataMapping");
+ qmlRegisterType<QItemModelSurfaceDataMapping>(uri, 1, 0, "SurfaceDataMapping");
qmlRegisterType<DeclarativeBars>(uri, 1, 0, "Bars3D");
qmlRegisterType<DeclarativeScatter>(uri, 1, 0, "Scatter3D");
+ qmlRegisterType<DeclarativeSurface>(uri, 1, 0, "Surface3D");
qmlRegisterType<Q3DValueAxis>(uri, 1, 0, "ValueAxis3D");
qmlRegisterType<Q3DCategoryAxis>(uri, 1, 0, "CategoryAxis3D");
qmlRegisterType<QItemModelBarDataProxy>(uri, 1, 0, "ItemModelBarDataProxy");
qmlRegisterType<QItemModelScatterDataProxy>(uri, 1, 0, "ItemModelScatterDataProxy");
+ qmlRegisterType<QItemModelSurfaceDataProxy>(uri, 1, 0, "ItemModelSurfaceDataProxy");
}
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3dqml2/datavis3dqml2_plugin.h b/src/datavis3dqml2/datavis3dqml2_plugin.h
index cc9894ba..35b98ca6 100644
--- a/src/datavis3dqml2/datavis3dqml2_plugin.h
+++ b/src/datavis3dqml2/datavis3dqml2_plugin.h
@@ -22,12 +22,15 @@
#include "datavis3dglobal_p.h"
#include "declarativebars_p.h"
#include "declarativescatter_p.h"
+#include "declarativesurface_p.h"
#include "qitemmodelbardatamapping.h"
#include "qitemmodelscatterdatamapping.h"
-#include "q3dvalueaxis.h"
-#include "q3dcategoryaxis.h"
+#include "qitemmodelsurfacedatamapping.h"
#include "qitemmodelbardataproxy.h"
#include "qitemmodelscatterdataproxy.h"
+#include "qitemmodelsurfacedataproxy.h"
+#include "q3dvalueaxis.h"
+#include "q3dcategoryaxis.h"
#include <QQmlExtensionPlugin>
@@ -35,10 +38,14 @@ QT_DATAVIS3D_USE_NAMESPACE
Q_DECLARE_METATYPE(DeclarativeBars *)
Q_DECLARE_METATYPE(DeclarativeScatter *)
+Q_DECLARE_METATYPE(DeclarativeSurface *)
Q_DECLARE_METATYPE(QItemModelBarDataMapping *)
Q_DECLARE_METATYPE(QItemModelScatterDataMapping *)
+Q_DECLARE_METATYPE(QItemModelSurfaceDataMapping *)
+
Q_DECLARE_METATYPE(const QAbstractItemModel *)
+
Q_DECLARE_METATYPE(QDataVis *)
Q_DECLARE_METATYPE(Q3DAbstractAxis *)
@@ -50,6 +57,8 @@ Q_DECLARE_METATYPE(QBarDataProxy *)
Q_DECLARE_METATYPE(QItemModelBarDataProxy *)
Q_DECLARE_METATYPE(QScatterDataProxy *)
Q_DECLARE_METATYPE(QItemModelScatterDataProxy *)
+Q_DECLARE_METATYPE(QSurfaceDataProxy *)
+Q_DECLARE_METATYPE(QItemModelSurfaceDataProxy *)
QT_DATAVIS3D_BEGIN_NAMESPACE
diff --git a/src/datavis3dqml2/declarativesurface.cpp b/src/datavis3dqml2/declarativesurface.cpp
new file mode 100644
index 00000000..a85b926e
--- /dev/null
+++ b/src/datavis3dqml2/declarativesurface.cpp
@@ -0,0 +1,288 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 "declarativesurface_p.h"
+#include "declarativesurfacerenderer_p.h"
+#include "q3dvalueaxis.h"
+#include "qitemmodelsurfacedataproxy.h"
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+DeclarativeSurface::DeclarativeSurface(QQuickItem *parent)
+ : QQuickItem(parent),
+ m_shared(0),
+ m_initialisedSize(0, 0),
+ m_cameraPreset(QDataVis::NoPreset),
+ m_theme(QDataVis::ThemeDefault)
+{
+ setFlags(QQuickItem::ItemHasContents);
+ setAcceptedMouseButtons(Qt::AllButtons);
+
+ // TODO: These seem to have no effect; find a way to activate anti-aliasing
+ setAntialiasing(true);
+ setSmooth(true);
+
+ // Create the shared component on the main GUI thread.
+ m_shared = new Surface3DController(boundingRect().toRect());
+ QObject::connect(m_shared, &Abstract3DController::shadowQualityChanged, this,
+ &DeclarativeSurface::handleShadowQualityUpdate);
+
+ QItemModelSurfaceDataProxy *proxy = new QItemModelSurfaceDataProxy;
+ m_shared->setActiveDataProxy(proxy);
+}
+
+DeclarativeSurface::~DeclarativeSurface()
+{
+ delete m_shared;
+}
+
+void DeclarativeSurface::handleShadowQualityUpdate(QDataVis::ShadowQuality quality)
+{
+ emit shadowQualityChanged(quality);
+}
+
+QSGNode *DeclarativeSurface::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
+{
+ // If old node exists and has right size, reuse it.
+ if (oldNode && m_initialisedSize == boundingRect().size().toSize()) {
+ // Update bounding rectangle (that has same size as before).
+ static_cast<DeclarativeSurfaceRenderer *>( oldNode )->setRect(boundingRect());
+ return oldNode;
+ }
+
+ // Create a new render node when size changes or if there is no node yet
+ m_initialisedSize = boundingRect().size().toSize();
+
+ // Delete old node
+ if (oldNode)
+ delete oldNode;
+
+ // Create a new one and set it's bounding rectangle
+ DeclarativeSurfaceRenderer *node = new DeclarativeSurfaceRenderer(window(), m_shared);
+ node->setRect(boundingRect());
+ m_shared->setBoundingRect(boundingRect().toRect());
+ return node;
+}
+
+void DeclarativeSurface::setGradientColorAt(qreal pos, const QColor &color)
+{
+ m_shared->setGradientColorAt(pos, color);
+}
+
+void DeclarativeSurface::setDataProxy(QSurfaceDataProxy *dataProxy)
+{
+ m_shared->setActiveDataProxy(dataProxy);
+}
+
+QSurfaceDataProxy *DeclarativeSurface::dataProxy() const
+{
+ return static_cast<QSurfaceDataProxy *>(m_shared->activeDataProxy());
+}
+
+void DeclarativeSurface::setCameraPreset(QDataVis::CameraPreset preset)
+{
+ // TODO: Implement correctly once "improved camera api" (QTRD-2122) is implemented
+ // We need to save this locally, as there are no getters for it in controller
+ m_cameraPreset = preset;
+ m_shared->setCameraPreset(preset);
+}
+
+Q3DValueAxis *DeclarativeSurface::axisX() const
+{
+ return static_cast<Q3DValueAxis *>(m_shared->axisX());
+}
+
+void DeclarativeSurface::setAxisX(Q3DValueAxis *axis)
+{
+ m_shared->setAxisX(axis);
+}
+
+Q3DValueAxis *DeclarativeSurface::axisY() const
+{
+ return static_cast<Q3DValueAxis *>(m_shared->axisY());
+}
+
+void DeclarativeSurface::setAxisY(Q3DValueAxis *axis)
+{
+ m_shared->setAxisY(axis);
+}
+
+Q3DValueAxis *DeclarativeSurface::axisZ() const
+{
+ return static_cast<Q3DValueAxis *>(m_shared->axisZ());
+}
+
+void DeclarativeSurface::setAxisZ(Q3DValueAxis *axis)
+{
+ m_shared->setAxisZ(axis);
+}
+
+QDataVis::CameraPreset DeclarativeSurface::cameraPreset()
+{
+ return m_cameraPreset;
+}
+
+void DeclarativeSurface::setTheme(QDataVis::ColorTheme theme)
+{
+ // TODO: Implement correctly once "user-modifiable themes" (QTRD-2120) is implemented
+ // We need to save this locally, as there are no getters for it in controller
+ m_theme = theme;
+ m_shared->setColorTheme(theme);
+}
+
+QDataVis::ColorTheme DeclarativeSurface::theme()
+{
+ return m_theme;
+}
+
+void DeclarativeSurface::setFont(const QFont &font)
+{
+ m_shared->setFont(font);
+}
+
+QFont DeclarativeSurface::font()
+{
+ return m_shared->font();
+}
+
+void DeclarativeSurface::setLabelTransparency(QDataVis::LabelTransparency transparency)
+{
+ m_shared->setLabelTransparency(transparency);
+}
+
+QDataVis::LabelTransparency DeclarativeSurface::labelTransparency()
+{
+ return m_shared->labelTransparency();
+}
+
+void DeclarativeSurface::setGridVisible(bool visible)
+{
+ m_shared->setGridEnabled(visible);
+}
+
+bool DeclarativeSurface::isGridVisible()
+{
+ return m_shared->gridEnabled();
+}
+
+void DeclarativeSurface::setBackgroundVisible(bool visible)
+{
+ m_shared->setBackgroundEnabled(visible);
+}
+
+bool DeclarativeSurface::isBackgroundVisible()
+{
+ return m_shared->backgroundEnabled();
+}
+
+void DeclarativeSurface::setSmoothSurface(bool enable)
+{
+ m_shared->setSmoothSurface(enable);
+}
+
+bool DeclarativeSurface::smoothSurface() const
+{
+ return m_shared->smoothSurface();
+}
+
+void DeclarativeSurface::setSurfaceGrid(bool enable)
+{
+ m_shared->setSurfaceGrid(enable);
+}
+
+bool DeclarativeSurface::surfaceGrid() const
+{
+ return m_shared->surfaceGrid();
+}
+
+void DeclarativeSurface::setSelectionMode(QDataVis::SelectionMode mode)
+{
+ m_shared->setSelectionMode(mode);
+}
+
+QDataVis::SelectionMode DeclarativeSurface::selectionMode()
+{
+ return m_shared->selectionMode();
+}
+
+void DeclarativeSurface::setShadowQuality(QDataVis::ShadowQuality quality)
+{
+ m_shared->setShadowQuality(quality);
+}
+
+QDataVis::ShadowQuality DeclarativeSurface::shadowQuality()
+{
+ return m_shared->shadowQuality();
+}
+
+void DeclarativeSurface::setItemLabelFormat(const QString &format)
+{
+ m_shared->activeDataProxy()->setItemLabelFormat(format);
+}
+
+QString DeclarativeSurface::itemLabelFormat()
+{
+ return m_shared->activeDataProxy()->itemLabelFormat();
+}
+
+void DeclarativeSurface::mouseDoubleClickEvent(QMouseEvent *event)
+{
+#if defined(Q_OS_ANDROID)
+ m_shared->mouseDoubleClickEvent(event);
+#else
+ Q_UNUSED(event)
+#endif
+}
+
+void DeclarativeSurface::touchEvent(QTouchEvent *event)
+{
+#if defined(Q_OS_ANDROID)
+ m_shared->touchEvent(event);
+ update();
+#else
+ Q_UNUSED(event)
+#endif
+}
+
+void DeclarativeSurface::mousePressEvent(QMouseEvent *event)
+{
+ QPoint mousePos = event->pos();
+ //mousePos.setY(height() - mousePos.y());
+ m_shared->mousePressEvent(event, mousePos);
+}
+
+void DeclarativeSurface::mouseReleaseEvent(QMouseEvent *event)
+{
+ QPoint mousePos = event->pos();
+ //mousePos.setY(height() - mousePos.y());
+ m_shared->mouseReleaseEvent(event, mousePos);
+}
+
+void DeclarativeSurface::mouseMoveEvent(QMouseEvent *event)
+{
+ QPoint mousePos = event->pos();
+ //mousePos.setY(height() - mousePos.y());
+ m_shared->mouseMoveEvent(event, mousePos);
+}
+
+void DeclarativeSurface::wheelEvent(QWheelEvent *event)
+{
+ m_shared->wheelEvent(event);
+}
+
+QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3dqml2/declarativesurface_p.h b/src/datavis3dqml2/declarativesurface_p.h
new file mode 100644
index 00000000..f115963c
--- /dev/null
+++ b/src/datavis3dqml2/declarativesurface_p.h
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 QtDataVis3D 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 DECLARATIVESURFACE_P_H
+#define DECLARATIVESURFACE_P_H
+
+#include "datavis3dglobal_p.h"
+#include "surface3dcontroller_p.h"
+#include "declarativesurface_p.h"
+#include "q3dvalueaxis.h"
+#include "qsurfacedataproxy.h"
+
+#include <QAbstractItemModel>
+#include <QQuickItem>
+#include <QObject>
+#include <QQuickWindow>
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class DeclarativeSurface : public QQuickItem
+{
+ Q_OBJECT
+ Q_PROPERTY(QSurfaceDataProxy *dataProxy READ dataProxy WRITE setDataProxy)
+ Q_PROPERTY(Q3DValueAxis *axisX READ axisX WRITE setAxisX)
+ Q_PROPERTY(Q3DValueAxis *axisY READ axisY WRITE setAxisY)
+ Q_PROPERTY(Q3DValueAxis *axisZ READ axisZ WRITE setAxisZ)
+ Q_PROPERTY(QtDataVis3D::QDataVis::SelectionMode selectionMode READ selectionMode WRITE setSelectionMode)
+ Q_PROPERTY(QtDataVis3D::QDataVis::LabelTransparency labelTransparency READ labelTransparency WRITE setLabelTransparency)
+ Q_PROPERTY(QtDataVis3D::QDataVis::ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality)
+ Q_PROPERTY(QtDataVis3D::QDataVis::CameraPreset cameraPreset READ cameraPreset WRITE setCameraPreset)
+ Q_PROPERTY(QtDataVis3D::QDataVis::ColorTheme theme READ theme WRITE setTheme)
+ Q_PROPERTY(QFont font READ font WRITE setFont)
+ Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible)
+ Q_PROPERTY(bool backgroundVisible READ isBackgroundVisible WRITE setBackgroundVisible)
+ Q_PROPERTY(bool smoothSurface READ smoothSurface WRITE setSmoothSurface)
+ Q_PROPERTY(bool surfaceGrid READ surfaceGrid WRITE setSurfaceGrid)
+ Q_PROPERTY(QString itemLabelFormat READ itemLabelFormat WRITE setItemLabelFormat)
+ Q_ENUMS(QtDataVis3D::QDataVis::SelectionMode)
+ Q_ENUMS(QtDataVis3D::QDataVis::ShadowQuality)
+ Q_ENUMS(QtDataVis3D::QDataVis::LabelTransparency)
+ Q_ENUMS(QtDataVis3D::QDataVis::CameraPreset)
+ Q_ENUMS(QtDataVis3D::QDataVis::ColorTheme)
+
+public:
+ explicit DeclarativeSurface(QQuickItem *parent = 0);
+ ~DeclarativeSurface();
+
+ Q_INVOKABLE void setGradientColorAt(qreal pos, const QColor &color);
+
+ QSurfaceDataProxy *dataProxy() const;
+ void setDataProxy(QSurfaceDataProxy *dataProxy);
+
+ Q3DValueAxis *axisX() const;
+ void setAxisX(Q3DValueAxis *axis);
+ Q3DValueAxis *axisY() const;
+ void setAxisY(Q3DValueAxis *axis);
+ Q3DValueAxis *axisZ() const;
+ void setAxisZ(Q3DValueAxis *axis);
+
+ // Select preset camera placement
+ void setCameraPreset(QDataVis::CameraPreset preset);
+ QDataVis::CameraPreset cameraPreset();
+
+ // Set theme (object colors, shaders, window color, background colors, light intensity and text
+ // colors are affected)
+ void setTheme(QDataVis::ColorTheme theme);
+ QDataVis::ColorTheme theme();
+
+ // Change selection mode
+ void setSelectionMode(QDataVis::SelectionMode mode);
+ QDataVis::SelectionMode selectionMode();
+
+ // Set font
+ void setFont(const QFont &font);
+ QFont font();
+
+ // Label transparency adjustment
+ void setLabelTransparency(QDataVis::LabelTransparency transparency);
+ QDataVis::LabelTransparency labelTransparency();
+
+ // Enable or disable background grid
+ void setGridVisible(bool visible);
+ bool isGridVisible();
+
+ // Enable or disable background mesh
+ void setBackgroundVisible(bool visible);
+ bool isBackgroundVisible();
+
+ // Enable or disable the smoothes of the surface
+ void setSmoothSurface(bool enable);
+ bool smoothSurface() const;
+
+ // Enable or disable the grid on the surface
+ void setSurfaceGrid(bool enable);
+ bool surfaceGrid() const;
+
+ // Adjust shadow quality
+ void setShadowQuality(QDataVis::ShadowQuality quality);
+ QDataVis::ShadowQuality shadowQuality();
+
+ void setItemLabelFormat(const QString &format);
+ QString itemLabelFormat();
+
+signals:
+ // Signals shadow quality changes.
+ void shadowQualityChanged(QDataVis::ShadowQuality quality);
+
+protected:
+ Surface3DController *m_shared;
+
+ // Used to detect when shadow quality changes autonomously due to e.g. resizing.
+ void handleShadowQualityUpdate(QDataVis::ShadowQuality quality);
+
+ QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *);
+
+ void mouseDoubleClickEvent(QMouseEvent *event);
+ void touchEvent(QTouchEvent *event);
+ void mousePressEvent(QMouseEvent *event);
+ void mouseReleaseEvent(QMouseEvent *event);
+ void mouseMoveEvent(QMouseEvent *event);
+ void wheelEvent(QWheelEvent *event);
+
+private:
+ QSize m_initialisedSize;
+ QDataVis::CameraPreset m_cameraPreset;
+ QDataVis::ColorTheme m_theme;
+};
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3dqml2/declarativesurfacerenderer.cpp b/src/datavis3dqml2/declarativesurfacerenderer.cpp
new file mode 100644
index 00000000..5e3dc367
--- /dev/null
+++ b/src/datavis3dqml2/declarativesurfacerenderer.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 "declarativesurfacerenderer_p.h"
+
+#include <QtQuick/QQuickWindow>
+#include <QtGui/QOpenGLFramebufferObject>
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+DeclarativeSurfaceRenderer::DeclarativeSurfaceRenderer(QQuickWindow *window,
+ Surface3DController *renderer)
+ : m_fbo(0),
+ m_texture(0),
+ m_window(window),
+ m_surfaceRenderer(renderer)
+{
+ connect(m_window, &QQuickWindow::beforeSynchronizing, this,
+ &DeclarativeSurfaceRenderer::synchDataToRenderer, Qt::DirectConnection);
+ connect(m_window, &QQuickWindow::beforeRendering, this,
+ &DeclarativeSurfaceRenderer::renderFBO, Qt::DirectConnection);
+ connect(m_surfaceRenderer, &Abstract3DController::needRender, m_window,
+ &QQuickWindow::update);
+}
+
+DeclarativeSurfaceRenderer::~DeclarativeSurfaceRenderer()
+{
+ delete m_texture;
+ delete m_fbo;
+}
+
+void DeclarativeSurfaceRenderer::synchDataToRenderer()
+{
+ m_surfaceRenderer->initializeOpenGL();
+ m_surfaceRenderer->synchDataToRenderer();
+}
+
+void DeclarativeSurfaceRenderer::renderFBO()
+{
+ QSize size = rect().size().toSize();
+
+ // 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 shared rendering function
+ m_fbo->bind();
+
+ m_surfaceRenderer->render(m_fbo->handle());
+
+ m_fbo->release();
+}
+
+QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3dqml2/declarativesurfacerenderer_p.h b/src/datavis3dqml2/declarativesurfacerenderer_p.h
new file mode 100644
index 00000000..4aae91b1
--- /dev/null
+++ b/src/datavis3dqml2/declarativesurfacerenderer_p.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 QtDataVis3D 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 DECLARATIVESURFACERENDERER_H
+#define DECLARATIVESURFACERENDERER_H
+
+#include "datavis3dglobal_p.h"
+#include "surface3dcontroller_p.h"
+#include <qsgsimpletexturenode.h>
+
+class QOpenGLFramebufferObject;
+class QSGTexture;
+class QQuickWindow;
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class DeclarativeSurfaceRenderer : public QObject, public QSGSimpleTextureNode
+{
+ Q_OBJECT
+
+public:
+ DeclarativeSurfaceRenderer(QQuickWindow *window, Surface3DController *shared);
+ ~DeclarativeSurfaceRenderer();
+
+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();
+
+private:
+ QOpenGLFramebufferObject *m_fbo;
+ QSGTexture *m_texture;
+ QQuickWindow *m_window;
+ Surface3DController *m_surfaceRenderer;
+};
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif