From 132502c16e8ccb6d6fc627e2b5f6f89838d88c8e Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Thu, 12 Dec 2013 15:02:07 +0200 Subject: Control for surface visibility features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2628 Change-Id: Ic03e2a71231665c478a918044ebd3e5b2d22b445 Reviewed-by: Tomi Korpipää Reviewed-by: Miikka Heikkinen --- examples/qmlsurface/qml/qmlsurface/main.qml | 28 ++++++++--------- examples/surface/surfacegraph.cpp | 4 +-- src/datavisualization/data/qsurface3dseries.cpp | 35 +++++++++++++++------- src/datavisualization/data/qsurface3dseries.h | 15 ++++++++-- src/datavisualization/data/qsurface3dseries_p.h | 4 +-- src/datavisualization/engine/surface3drenderer.cpp | 18 ++++++----- tests/surfacetest/graphmodifier.cpp | 20 +++++++++++-- tests/surfacetest/graphmodifier.h | 2 ++ tests/surfacetest/main.cpp | 7 +++++ 9 files changed, 92 insertions(+), 41 deletions(-) diff --git a/examples/qmlsurface/qml/qmlsurface/main.qml b/examples/qmlsurface/qml/qmlsurface/main.qml index 03393c05..3b46446f 100644 --- a/examples/qmlsurface/qml/qmlsurface/main.qml +++ b/examples/qmlsurface/qml/qmlsurface/main.qml @@ -74,7 +74,7 @@ Item { Surface3DSeries { id: surfaceSeries flatShadingEnabled: false - surfaceGridEnabled: false + drawMode: Surface3DSeries.DrawSurface ItemModelSurfaceDataProxy { itemModel: surfaceData.model @@ -94,7 +94,7 @@ Item { Surface3DSeries { id: heightSeries flatShadingEnabled: false - surfaceGridEnabled: false + drawMode: Surface3DSeries.DrawSurface HeightMapSurfaceDataProxy { heightMapFile: ":/heightmaps/image" @@ -114,14 +114,14 @@ Item { text: "Show Surface Grid" //! [1] onClicked: { - if (surfaceSeries.surfaceGridEnabled === false) { - surfaceSeries.surfaceGridEnabled = true; - heightSeries.surfaceGridEnabled = true; - text = "Hide Surface Grid" - } else { - surfaceSeries.surfaceGridEnabled = false; - heightSeries.surfaceGridEnabled = false; + if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe) { + surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe; + heightSeries.drawMode &= ~Surface3DSeries.DrawWireframe; text = "Show Surface Grid" + } else { + surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe; + heightSeries.drawMode |= Surface3DSeries.DrawWireframe; + text = "Hide Surface Grid" } } //! [1] @@ -133,13 +133,13 @@ Item { width: surfaceGridToggle.width text: "Hide Surface" onClicked: { - if (surfaceSeries.visible === true) { - surfaceSeries.visible = false; - heightSeries.visible = false; + if (surfaceSeries.drawMode & Surface3DSeries.DrawSurface) { + surfaceSeries.drawMode &= ~Surface3DSeries.DrawSurface; + heightSeries.drawMode &= ~Surface3DSeries.DrawSurface; text = "Show Surface" } else { - surfaceSeries.visible = true; - heightSeries.visible = true; + surfaceSeries.drawMode |= Surface3DSeries.DrawSurface; + heightSeries.drawMode |= Surface3DSeries.DrawSurface; text = "Hide Surface" } } diff --git a/examples/surface/surfacegraph.cpp b/examples/surface/surfacegraph.cpp index 4c182a79..7cf4f329 100644 --- a/examples/surface/surfacegraph.cpp +++ b/examples/surface/surfacegraph.cpp @@ -91,7 +91,7 @@ void SurfaceGraph::enableSqrtSinModel(bool enable) { if (enable) { //! [3] - m_sqrtSinSeries->setSurfaceGridEnabled(true); + m_sqrtSinSeries->setDrawMode(QSurface3DSeries::DrawSurfaceAndWireframe); m_sqrtSinSeries->setFlatShadingEnabled(true); m_graph->axisX()->setLabelFormat("%.2f"); @@ -124,7 +124,7 @@ void SurfaceGraph::enableHeightMapModel(bool enable) { if (enable) { //! [4] - m_heightMapSeries->setSurfaceGridEnabled(false); + m_heightMapSeries->setDrawMode(QSurface3DSeries::DrawSurface); m_heightMapSeries->setFlatShadingEnabled(false); m_graph->axisX()->setLabelFormat("%.1f N"); diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp index 19462af4..cf794077 100644 --- a/src/datavisualization/data/qsurface3dseries.cpp +++ b/src/datavisualization/data/qsurface3dseries.cpp @@ -129,6 +129,19 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * Before then it is always true. */ +/*! + * \enum QSurface3DSeries::DrawFlag + * + * Drawing mode of the surface. Values of this enumeration can be combined with OR operator. + * + * \value DrawWireframe + * Only the grid is drawn. + * \value DrawSurface + * Only the surface is drawn. + * \value DrawSurfaceAndWireframe + * Both the surface and grid are drawn. + */ + /*! * Constructs QSurface3DSeries with the given \a parent. */ @@ -252,21 +265,21 @@ bool QSurface3DSeries::isFlatShadingSupported() const } /*! - * \property QSurface3DSeries::surfaceGridEnabled + * \property QSurface3DSeries::drawMode * - * Sets surface grid to \a enabled. It is preset to \c true by default. + * Sets the drawing \a mode to one of QSurface3DSeries::DrawFlag. */ -void QSurface3DSeries::setSurfaceGridEnabled(bool enabled) +void QSurface3DSeries::setDrawMode(QSurface3DSeries::DrawFlags mode) { - if (dptr()->m_surfaceGridEnabled != enabled) { - dptr()->setSurfaceGridEnabled(enabled); - emit surfaceGridEnabledChanged(enabled); + if (dptr()->m_drawMode != mode) { + dptr()->setDrawMode(mode); + emit drawModeChanged(mode); } } -bool QSurface3DSeries::isSurfaceGridEnabled() const +QSurface3DSeries::DrawFlags QSurface3DSeries::drawMode() const { - return dptrc()->m_surfaceGridEnabled; + return dptrc()->m_drawMode; } /*! @@ -291,7 +304,7 @@ QSurface3DSeriesPrivate::QSurface3DSeriesPrivate(QSurface3DSeries *q) : QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeSurface), m_selectedPoint(Surface3DController::invalidSelectionPosition()), m_flatShadingEnabled(true), - m_surfaceGridEnabled(true) + m_drawMode(QSurface3DSeries::DrawSurfaceAndWireframe) { m_itemLabelFormat = QStringLiteral("(@xLabel, @yLabel, @zLabel)"); m_mesh = QAbstract3DSeries::MeshSphere; @@ -358,9 +371,9 @@ void QSurface3DSeriesPrivate::setFlatShadingEnabled(bool enabled) m_controller->markSeriesVisualsDirty(); } -void QSurface3DSeriesPrivate::setSurfaceGridEnabled(bool enabled) +void QSurface3DSeriesPrivate::setDrawMode(QSurface3DSeries::DrawFlags mode) { - m_surfaceGridEnabled = enabled; + m_drawMode = mode; if (m_controller) m_controller->markSeriesVisualsDirty(); } diff --git a/src/datavisualization/data/qsurface3dseries.h b/src/datavisualization/data/qsurface3dseries.h index f4b64b96..8040da0d 100644 --- a/src/datavisualization/data/qsurface3dseries.h +++ b/src/datavisualization/data/qsurface3dseries.h @@ -29,13 +29,21 @@ class QSurface3DSeriesPrivate; class QT_DATAVISUALIZATION_EXPORT QSurface3DSeries : public QAbstract3DSeries { Q_OBJECT + Q_FLAGS(DrawFlag DrawFlags) Q_PROPERTY(QSurfaceDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged) Q_PROPERTY(QPoint selectedPoint READ selectedPoint WRITE setSelectedPoint NOTIFY selectedPointChanged) Q_PROPERTY(bool flatShadingEnabled READ isFlatShadingEnabled WRITE setFlatShadingEnabled NOTIFY flatShadingEnabledChanged) - Q_PROPERTY(bool surfaceGridEnabled READ isSurfaceGridEnabled WRITE setSurfaceGridEnabled NOTIFY surfaceGridEnabledChanged) Q_PROPERTY(bool flatShadingSupported READ isFlatShadingSupported NOTIFY flatShadingSupportedChanged) + Q_PROPERTY(QtDataVisualization::QSurface3DSeries::DrawFlags drawMode READ drawMode WRITE setDrawMode NOTIFY drawModeChanged) public: + enum DrawFlag { + DrawWireframe = 1, + DrawSurface = 2, + DrawSurfaceAndWireframe = DrawWireframe | DrawSurface + }; + Q_DECLARE_FLAGS(DrawFlags, DrawFlag) + explicit QSurface3DSeries(QObject *parent = 0); explicit QSurface3DSeries(QSurfaceDataProxy *dataProxy, QObject *parent = 0); virtual ~QSurface3DSeries(); @@ -50,8 +58,8 @@ public: void setFlatShadingEnabled(bool enabled); bool isFlatShadingEnabled() const; - void setSurfaceGridEnabled(bool enabled); - bool isSurfaceGridEnabled() const; + void setDrawMode(QSurface3DSeries::DrawFlags mode); + QSurface3DSeries::DrawFlags drawMode() const; bool isFlatShadingSupported() const; @@ -61,6 +69,7 @@ signals: void flatShadingEnabledChanged(bool enable); void surfaceGridEnabledChanged(bool enable); void flatShadingSupportedChanged(bool enable); + void drawModeChanged(QSurface3DSeries::DrawFlags mode); protected: explicit QSurface3DSeries(QSurface3DSeriesPrivate *d, QObject *parent = 0); diff --git a/src/datavisualization/data/qsurface3dseries_p.h b/src/datavisualization/data/qsurface3dseries_p.h index a3acb8d5..00bfbed2 100644 --- a/src/datavisualization/data/qsurface3dseries_p.h +++ b/src/datavisualization/data/qsurface3dseries_p.h @@ -46,14 +46,14 @@ public: void setSelectedPoint(const QPoint &position); void setFlatShadingEnabled(bool enabled); - void setSurfaceGridEnabled(bool enabled); + void setDrawMode(QSurface3DSeries::DrawFlags mode); private: QSurface3DSeries *qptr(); QPoint m_selectedPoint; bool m_flatShadingEnabled; - bool m_surfaceGridEnabled; + QSurface3DSeries::DrawFlags m_drawMode; private: friend class QSurface3DSeries; diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 47e3bf08..43815d39 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -206,12 +206,9 @@ void Surface3DRenderer::updateData() const QSurfaceDataArray *array = 0; if (m_visibleSeriesList.size()) { QSurface3DSeries *firstSeries = static_cast(m_visibleSeriesList.at(0).series()); - m_cachedSurfaceVisible = firstSeries->isVisible(); // TODO: To series visuals update? - if (m_cachedSurfaceGridOn || m_cachedSurfaceVisible) { - QSurfaceDataProxy *dataProxy = firstSeries->dataProxy(); - if (dataProxy) - array = dataProxy->array(); - } + QSurfaceDataProxy *dataProxy = firstSeries->dataProxy(); + if (dataProxy) + array = dataProxy->array(); } calculateSceneScalingFactors(); @@ -264,6 +261,9 @@ void Surface3DRenderer::updateData() delete m_dataArray.at(i); m_dataArray.clear(); m_sampleSpace = QRect(); + + delete m_surfaceObj; + m_surfaceObj = 0; } for (int i = 0; i < m_sliceDataArray.size(); i++) @@ -282,7 +282,11 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis if (m_visibleSeriesList.size()) { QSurface3DSeries *series = static_cast(m_visibleSeriesList.at(0).series()); updateFlatStatus(series->isFlatShadingEnabled()); - updateSurfaceGridStatus(series->isSurfaceGridEnabled()); + + QSurface3DSeries::DrawFlags drawMode = series->drawMode(); + m_cachedSurfaceVisible = drawMode.testFlag(QSurface3DSeries::DrawSurface); + m_cachedSurfaceGridOn = drawMode.testFlag(QSurface3DSeries::DrawWireframe); + QVector3D seriesColor = Utils::vectorFromColor(series->baseColor()); if (m_uniformGradientTextureColor != seriesColor) generateUniformGradient(seriesColor); diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index 6879530b..3474b67f 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -52,7 +52,8 @@ GraphModifier::GraphModifier(Q3DSurface *graph) m_insertTestZPos(0), m_insertTestIndexPos(1), m_planeArray(0), - m_theSeries(new QSurface3DSeries) + m_theSeries(new QSurface3DSeries), + m_drawMode(QSurface3DSeries::DrawSurfaceAndWireframe) { m_graph->setAxisX(new Q3DValueAxis); m_graph->setAxisY(new Q3DValueAxis); @@ -80,12 +81,27 @@ void GraphModifier::toggleSmooth(bool enabled) void GraphModifier::toggleSurfaceGrid(bool enable) { qDebug() << "GraphModifier::toggleSurfaceGrid" << enable; - m_theSeries->setSurfaceGridEnabled(enable); + if (enable) + m_drawMode |= QSurface3DSeries::DrawWireframe; + else + m_drawMode &= ~QSurface3DSeries::DrawWireframe; + + m_theSeries->setDrawMode(m_drawMode); } void GraphModifier::toggleSurface(bool enable) { qDebug() << "GraphModifier::toggleSurface" << enable; + if (enable) + m_drawMode |= QSurface3DSeries::DrawSurface; + else + m_drawMode &= ~QSurface3DSeries::DrawSurface; + + m_theSeries->setDrawMode(m_drawMode); +} + +void GraphModifier::toggleSeriesVisible(bool enable) +{ m_theSeries->setVisible(enable); } diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index 8269962a..f0b5cce7 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -44,6 +44,7 @@ public: void toggleSmooth(bool enabled); void toggleSurfaceGrid(bool enable); void toggleSurface(bool enable); + void toggleSeriesVisible(bool enable); void toggleSqrtSin(bool enable); void togglePlane(bool enable); void setHeightMapData(bool enable); @@ -113,6 +114,7 @@ private: QSurfaceDataArray *m_planeArray; QLabel *m_selectionInfoLabel; QSurface3DSeries *m_theSeries; + QSurface3DSeries::DrawFlags m_drawMode; }; #endif diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index d2cafae9..c25c5b89 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -78,6 +78,10 @@ int main(int argc, char *argv[]) surfaceCB->setText(QStringLiteral("Surface Visible")); surfaceCB->setChecked(true); + QCheckBox *seriesVisibleCB = new QCheckBox(widget); + seriesVisibleCB->setText(QStringLiteral("Series Visible")); + seriesVisibleCB->setChecked(true); + //QCheckBox *sqrtSinCB = new QCheckBox(widget); QRadioButton *sqrtSinCB = new QRadioButton(widget); sqrtSinCB->setText(QStringLiteral("Sqrt & Sin")); @@ -247,6 +251,7 @@ int main(int argc, char *argv[]) vLayout->addWidget(smoothCB); vLayout->addWidget(surfaceGridCB); vLayout->addWidget(surfaceCB); + vLayout->addWidget(seriesVisibleCB); vLayout->addWidget(new QLabel(QStringLiteral("Select surface sample"))); vLayout->addWidget(sqrtSinCB); vLayout->addWidget(planeCB); @@ -298,6 +303,8 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::toggleSurfaceGrid); QObject::connect(surfaceCB, &QCheckBox::stateChanged, modifier, &GraphModifier::toggleSurface); + QObject::connect(seriesVisibleCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeriesVisible); QObject::connect(sqrtSinCB, &QRadioButton::toggled, modifier, &GraphModifier::toggleSqrtSin); QObject::connect(planeCB, &QCheckBox::toggled, -- cgit v1.2.3