diff options
Diffstat (limited to 'src/datavis3dqml2')
-rw-r--r-- | src/datavis3dqml2/datavis3dqml2.pro | 8 | ||||
-rw-r--r-- | src/datavis3dqml2/datavis3dqml2_plugin.cpp | 13 | ||||
-rw-r--r-- | src/datavis3dqml2/datavis3dqml2_plugin.h | 13 | ||||
-rw-r--r-- | src/datavis3dqml2/declarativesurface.cpp | 288 | ||||
-rw-r--r-- | src/datavis3dqml2/declarativesurface_p.h | 156 | ||||
-rw-r--r-- | src/datavis3dqml2/declarativesurfacerenderer.cpp | 87 | ||||
-rw-r--r-- | src/datavis3dqml2/declarativesurfacerenderer_p.h | 65 |
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 |