From 527113321ff103835b89543c5d6f670f55b5b0d5 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 28 Nov 2013 08:19:37 +0200 Subject: Move series specific visual elements to series, part 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Meshes moved to series. Task-number: QTRD-2557 Change-Id: I80050e413faf3bc942eb5a5627a66747de5805d8 Reviewed-by: Tomi Korpipää --- examples/audiolevels/audiolevels.cpp | 5 +- examples/bars/graphmodifier.cpp | 21 ++- examples/bars/graphmodifier.h | 4 +- examples/bars/main.cpp | 11 +- examples/custominput/scatterdatamodifier.cpp | 4 +- examples/customproxy/rainfallgraph.cpp | 2 +- examples/itemmodel/main.cpp | 5 +- .../qmlcustominput/qml/qmlcustominput/main.qml | 2 +- examples/qmlscatter/qml/qmlscatter/main.qml | 6 +- examples/scatter/main.cpp | 15 +- examples/scatter/scatterdatamodifier.cpp | 17 ++- examples/scatter/scatterdatamodifier.h | 3 +- src/datavisualization/data/barrenderitem.cpp | 4 +- src/datavisualization/data/barrenderitem_p.h | 6 + src/datavisualization/data/qabstract3dseries.cpp | 156 ++++++++++++++++++-- src/datavisualization/data/qabstract3dseries.h | 31 ++++ src/datavisualization/data/qabstract3dseries_p.h | 38 +++-- src/datavisualization/data/qbar3dseries.cpp | 3 +- src/datavisualization/data/qscatter3dseries.cpp | 4 +- src/datavisualization/data/qsurface3dseries.cpp | 7 +- .../doc/src/qtdatavisualization-qml-bars3d.qdoc | 17 --- .../doc/src/qtdatavisualization-qml-scatter3d.qdoc | 30 ---- .../doc/src/qtdatavisualization-qml-surface3d.qdoc | 6 - .../engine/abstract3dcontroller.cpp | 42 +++--- .../engine/abstract3dcontroller_p.h | 16 +-- .../engine/abstract3drenderer.cpp | 39 ++--- .../engine/abstract3drenderer_p.h | 7 +- src/datavisualization/engine/bars3dcontroller.cpp | 32 ++--- src/datavisualization/engine/bars3dcontroller_p.h | 1 - src/datavisualization/engine/bars3drenderer.cpp | 81 ++++++----- src/datavisualization/engine/bars3drenderer_p.h | 4 +- src/datavisualization/engine/engine.qrc | 4 +- .../engine/meshes/minimalFlat.obj | 27 ++++ .../engine/meshes/minimalSmooth.obj | 27 ++++ src/datavisualization/engine/meshes/scatterdot.obj | 27 ---- .../engine/meshes/scatterdotFlat.obj | 27 ---- src/datavisualization/engine/q3dbars.cpp | 33 ----- src/datavisualization/engine/q3dbars.h | 9 -- src/datavisualization/engine/q3dscatter.cpp | 33 ----- src/datavisualization/engine/q3dscatter.h | 7 - .../engine/scatter3dcontroller.cpp | 30 ---- .../engine/scatter3dcontroller_p.h | 3 - src/datavisualization/engine/scatter3drenderer.cpp | 158 ++++++++++++--------- src/datavisualization/engine/scatter3drenderer_p.h | 4 +- src/datavisualization/engine/seriesrendercache.cpp | 91 +++++++++++- src/datavisualization/engine/seriesrendercache_p.h | 16 ++- src/datavisualization/engine/surface3drenderer.cpp | 6 - src/datavisualization/engine/surface3drenderer_p.h | 1 - .../global/qdatavisualizationenums.h | 14 -- .../global/qtdatavisualizationenums.qdoc | 24 ---- src/datavisualization/theme/q3dtheme.h | 1 + src/datavisualization/utils/objecthelper.cpp | 3 - src/datavisualizationqml2/declarativebars.cpp | 53 ------- src/datavisualizationqml2/declarativebars_p.h | 12 -- src/datavisualizationqml2/declarativescatter.cpp | 59 -------- src/datavisualizationqml2/declarativescatter_p.h | 14 -- tests/barstest/chart.cpp | 30 ++-- tests/kinectsurface/surfacedata.cpp | 8 +- tests/kinectsurface/surfacedata.h | 2 +- tests/multigraphs/data.cpp | 4 +- tests/scattertest/scatterchart.cpp | 58 +++++--- tests/spectrum/spectrumapp/main.cpp | 4 +- 62 files changed, 687 insertions(+), 721 deletions(-) create mode 100644 src/datavisualization/engine/meshes/minimalFlat.obj create mode 100644 src/datavisualization/engine/meshes/minimalSmooth.obj delete mode 100644 src/datavisualization/engine/meshes/scatterdot.obj delete mode 100644 src/datavisualization/engine/meshes/scatterdotFlat.obj diff --git a/examples/audiolevels/audiolevels.cpp b/examples/audiolevels/audiolevels.cpp index 9f6658b9..5b2c16ba 100644 --- a/examples/audiolevels/audiolevels.cpp +++ b/examples/audiolevels/audiolevels.cpp @@ -46,11 +46,12 @@ AudioLevels::AudioLevels(Q3DBars *graph, QObject *parent) m_graph->setShadowQuality(QDataVis::ShadowQualityNone); m_graph->setSelectionMode(QDataVis::SelectionNone); m_graph->scene()->activeCamera()->setCameraPosition(-25.0f, 10.0f, 190.0f); - m_graph->setBarType(QDataVis::MeshStyleBars); m_graph->setTheme(new Q3DTheme(QDataVis::ThemeIsabelle)); m_graph->theme()->setGridEnabled(true); m_graph->theme()->setBackgroundEnabled(false); - m_graph->addSeries(new QBar3DSeries); + QBar3DSeries *series = new QBar3DSeries; + series->setMesh(QAbstract3DSeries::MeshBar); + m_graph->addSeries(series); //! [0] QAudioFormat formatAudio; diff --git a/examples/bars/graphmodifier.cpp b/examples/bars/graphmodifier.cpp index 6a35b1b1..23cefeb4 100644 --- a/examples/bars/graphmodifier.cpp +++ b/examples/bars/graphmodifier.cpp @@ -48,7 +48,8 @@ GraphModifier::GraphModifier(Q3DBars *bargraph) m_primaryData(new QBarDataProxy), m_secondaryData(new QBarDataProxy), //! [1] - m_style(QDataVis::MeshStyleBevelBars), + m_primaryStyle(QAbstract3DSeries::MeshBevelBar), + m_secondaryStyle(QAbstract3DSeries::MeshSphere), m_smooth(false) { //! [2] @@ -78,8 +79,13 @@ GraphModifier::GraphModifier(Q3DBars *bargraph) QBar3DSeries *series = new QBar3DSeries(m_primaryData); series->setItemLabelFormat(QStringLiteral("Oulu - @colLabel @rowLabel: @valueLabel")); + series->setMesh(m_primaryStyle); + series->setMeshSmooth(m_smooth); + QBar3DSeries *series2 = new QBar3DSeries(m_secondaryData); series2->setItemLabelFormat(QStringLiteral("Helsinki - @colLabel @rowLabel: @valueLabel")); + series2->setMesh(m_secondaryStyle); + series2->setMeshSmooth(m_smooth); series2->setVisible(false); //! [4] @@ -159,8 +165,12 @@ void GraphModifier::resetTemperatureData() void GraphModifier::changeStyle(int style) { - m_style = QDataVis::MeshStyle(style); - m_graph->setBarType(m_style, m_smooth); + QComboBox *comboBox = qobject_cast(sender()); + if (comboBox) { + m_primaryStyle = QAbstract3DSeries::Mesh(comboBox->itemData(style).toInt()); + if (m_graph->seriesList().size()) + m_graph->seriesList().at(0)->setMesh(m_primaryStyle); + } } void GraphModifier::changePresetCamera() @@ -251,7 +261,10 @@ void GraphModifier::setGridEnabled(int enabled) void GraphModifier::setSmoothBars(int smooth) { m_smooth = bool(smooth); - m_graph->setBarType(m_style, m_smooth); + if (m_graph->seriesList().size()) { + m_graph->seriesList().at(0)->setMeshSmooth(m_smooth); + m_graph->seriesList().at(1)->setMeshSmooth(m_smooth); + } } void GraphModifier::setSeriesVisibility(int enabled) diff --git a/examples/bars/graphmodifier.h b/examples/bars/graphmodifier.h index 6887a54b..e361bb87 100644 --- a/examples/bars/graphmodifier.h +++ b/examples/bars/graphmodifier.h @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -79,7 +80,8 @@ private: Q3DCategoryAxis *m_monthAxis; QBarDataProxy *m_primaryData; QBarDataProxy *m_secondaryData; - QDataVis::MeshStyle m_style; + QAbstract3DSeries::Mesh m_primaryStyle; + QAbstract3DSeries::Mesh m_secondaryStyle; bool m_smooth; }; diff --git a/examples/bars/main.cpp b/examples/bars/main.cpp index 7cf4381d..e4a05401 100644 --- a/examples/bars/main.cpp +++ b/examples/bars/main.cpp @@ -73,11 +73,12 @@ int main(int argc, char **argv) smoothCheckBox->setChecked(false); QComboBox *barStyleList = new QComboBox(widget); - barStyleList->addItem(QStringLiteral("Bars")); - barStyleList->addItem(QStringLiteral("Pyramids")); - barStyleList->addItem(QStringLiteral("Cones")); - barStyleList->addItem(QStringLiteral("Cylinders")); - barStyleList->addItem(QStringLiteral("Beveled Bars")); + barStyleList->addItem(QStringLiteral("Bar"), int(QAbstract3DSeries::MeshBar)); + barStyleList->addItem(QStringLiteral("Pyramid"), int(QAbstract3DSeries::MeshPyramid)); + barStyleList->addItem(QStringLiteral("Cone"), int(QAbstract3DSeries::MeshCone)); + barStyleList->addItem(QStringLiteral("Cylinder"), int(QAbstract3DSeries::MeshCylinder)); + barStyleList->addItem(QStringLiteral("Bevel bar"), int(QAbstract3DSeries::MeshBevelBar)); + barStyleList->addItem(QStringLiteral("Sphere"), int(QAbstract3DSeries::MeshSphere)); barStyleList->setCurrentIndex(4); QPushButton *cameraButton = new QPushButton(widget); diff --git a/examples/custominput/scatterdatamodifier.cpp b/examples/custominput/scatterdatamodifier.cpp index a1e7e55f..fbe44f58 100644 --- a/examples/custominput/scatterdatamodifier.cpp +++ b/examples/custominput/scatterdatamodifier.cpp @@ -32,7 +32,6 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) : m_graph(scatter), m_inputHandler(new CustomInputHandler()) { - m_graph->setObjectType(QDataVis::MeshStyleCubes, false); m_graph->setTheme(new Q3DTheme(QDataVis::ThemeDigia)); m_graph->setShadowQuality(QDataVis::ShadowQualitySoftLow); m_graph->scene()->activeCamera()->setCameraPreset(QDataVis::CameraPresetFront); @@ -42,7 +41,8 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) m_graph->setAxisZ(new Q3DValueAxis); QScatter3DSeries *series = new QScatter3DSeries; - series->setItemLabelFormat("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel"); + series->setItemLabelFormat("@xLabel, @yLabel, @zLabel"); + series->setMesh(QAbstract3DSeries::MeshCube); m_graph->addSeries(series); m_animationCameraX = new QPropertyAnimation(m_graph->scene()->activeCamera(), "xRotation"); diff --git a/examples/customproxy/rainfallgraph.cpp b/examples/customproxy/rainfallgraph.cpp index 1be61440..6556a296 100644 --- a/examples/customproxy/rainfallgraph.cpp +++ b/examples/customproxy/rainfallgraph.cpp @@ -63,7 +63,7 @@ RainfallGraph::RainfallGraph(Q3DBars *rainfall) m_graph->columnAxis()->setCategoryLabels(months); // Set bar type to cylinder - m_graph->setBarType(QDataVis::MeshStyleCylinders, false); + series->setMesh(QAbstract3DSeries::MeshCylinder); // Set shadows to medium m_graph->setShadowQuality(QDataVis::ShadowQualityMedium); diff --git a/examples/itemmodel/main.cpp b/examples/itemmodel/main.cpp index 1ee6ca25..708fd723 100644 --- a/examples/itemmodel/main.cpp +++ b/examples/itemmodel/main.cpp @@ -80,10 +80,6 @@ GraphDataGenerator::GraphDataGenerator(Q3DBars *bargraph, QTableWidget *tableWid // and add a small space between them m_graph->setBarThickness(1.0f); m_graph->setBarSpacing(QSizeF(0.2, 0.2)); - - // Set bar type to flat pyramids - m_graph->setBarType(QDataVis::MeshStylePyramids, false); - //! [5] #ifndef USE_STATIC_DATA @@ -270,6 +266,7 @@ int main(int argc, char **argv) QItemModelBarDataProxy *proxy = new QItemModelBarDataProxy(tableWidget->model()); proxy->setUseModelCategories(true); QBar3DSeries *series = new QBar3DSeries(proxy); + series->setMesh(QAbstract3DSeries::MeshPyramid); graph->addSeries(series); //! [2] diff --git a/examples/qmlcustominput/qml/qmlcustominput/main.qml b/examples/qmlcustominput/qml/qmlcustominput/main.qml index fb95f09f..005b40a0 100644 --- a/examples/qmlcustominput/qml/qmlcustominput/main.qml +++ b/examples/qmlcustominput/qml/qmlcustominput/main.qml @@ -45,7 +45,6 @@ Item { theme: Theme3D { type: AbstractGraph3D.ThemeDigia } shadowQuality: AbstractGraph3D.ShadowQualitySoftMedium scene.activeCamera.yRotation: 30.0 - objectType: AbstractGraph3D.MeshStyleCubes //! [1] inputHandler: null //! [1] @@ -53,6 +52,7 @@ Item { Scatter3DSeries { id: scatterSeries itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel" + mesh: Abstract3DSeries.MeshCube ItemModelScatterDataProxy { itemModel: graphData.model diff --git a/examples/qmlscatter/qml/qmlscatter/main.qml b/examples/qmlscatter/qml/qmlscatter/main.qml index 7893ae56..e4f95d09 100644 --- a/examples/qmlscatter/qml/qmlscatter/main.qml +++ b/examples/qmlscatter/qml/qmlscatter/main.qml @@ -109,12 +109,12 @@ Item { text: "Use Smooth Dots" anchors.left: shadowToggle.right onClicked: { - if (scatterGraph.objectSmoothingEnabled === false) { + if (scatterSeries.meshSmooth === false) { text = "Use Flat Dots"; - scatterGraph.objectSmoothingEnabled = true; + scatterSeries.meshSmooth = true; } else { text = "Use Smooth Dots" - scatterGraph.objectSmoothingEnabled = false; + scatterSeries.meshSmooth = false; } } } diff --git a/examples/scatter/main.cpp b/examples/scatter/main.cpp index 40027a40..d981620c 100644 --- a/examples/scatter/main.cpp +++ b/examples/scatter/main.cpp @@ -73,10 +73,12 @@ int main(int argc, char **argv) smoothCheckBox->setText(QStringLiteral("Smooth dots")); smoothCheckBox->setChecked(true); - QComboBox *barStyleList = new QComboBox(widget); - barStyleList->addItem(QStringLiteral("Sphere")); - barStyleList->addItem(QStringLiteral("Tetrahedron")); - barStyleList->setCurrentIndex(0); + QComboBox *itemStyleList = new QComboBox(widget); + itemStyleList->addItem(QStringLiteral("Sphere"), int(QAbstract3DSeries::MeshSphere)); + itemStyleList->addItem(QStringLiteral("Cube"), int(QAbstract3DSeries::MeshCube)); + itemStyleList->addItem(QStringLiteral("Minimal"), int(QAbstract3DSeries::MeshMinimal)); + itemStyleList->addItem(QStringLiteral("Point"), int(QAbstract3DSeries::MeshPoint)); + itemStyleList->setCurrentIndex(0); QPushButton *cameraButton = new QPushButton(widget); cameraButton->setText(QStringLiteral("Change camera preset")); @@ -110,7 +112,7 @@ int main(int argc, char **argv) vLayout->addWidget(gridCheckBox); vLayout->addWidget(smoothCheckBox, 0, Qt::AlignTop); vLayout->addWidget(new QLabel(QStringLiteral("Change dot style"))); - vLayout->addWidget(barStyleList); + vLayout->addWidget(itemStyleList); vLayout->addWidget(new QLabel(QStringLiteral("Change theme"))); vLayout->addWidget(themeList); vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality"))); @@ -140,8 +142,7 @@ int main(int argc, char **argv) backgroundCheckBox, &QCheckBox::setChecked); QObject::connect(modifier, &ScatterDataModifier::gridEnabledChanged, gridCheckBox, &QCheckBox::setChecked); - - QObject::connect(barStyleList, SIGNAL(currentIndexChanged(int)), modifier, + QObject::connect(itemStyleList, SIGNAL(currentIndexChanged(int)), modifier, SLOT(changeStyle(int))); QObject::connect(themeList, SIGNAL(currentIndexChanged(int)), modifier, diff --git a/examples/scatter/scatterdatamodifier.cpp b/examples/scatter/scatterdatamodifier.cpp index fea50992..ee49402a 100644 --- a/examples/scatter/scatterdatamodifier.cpp +++ b/examples/scatter/scatterdatamodifier.cpp @@ -24,6 +24,8 @@ #include #include #include +#include + using namespace QtDataVisualization; //#define RANDOM_SCATTER // Uncomment this to switch to random scatter @@ -33,7 +35,7 @@ const int numberOfItems = 3600; ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) : m_graph(scatter), m_fontSize(40.0f), - m_style(QDataVis::MeshStyleSpheres), + m_style(QAbstract3DSeries::MeshSphere), m_smooth(true) { //! [0] @@ -41,7 +43,6 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) QFont font = m_graph->theme()->font(); font.setPointSize(m_fontSize); m_graph->theme()->setFont(font); - m_graph->setObjectType(QDataVis::MeshStyleSpheres, true); m_graph->setShadowQuality(QDataVis::ShadowQualitySoftLow); m_graph->scene()->activeCamera()->setCameraPreset(QDataVis::CameraPresetFront); //! [0] @@ -56,6 +57,7 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) QScatterDataProxy *proxy = new QScatterDataProxy; QScatter3DSeries *series = new QScatter3DSeries(proxy); series->setItemLabelFormat("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel"); + series->setMesh(QAbstract3DSeries::MeshSphere); m_graph->addSeries(series); //! [2] @@ -117,14 +119,19 @@ void ScatterDataModifier::addData() //! [8] void ScatterDataModifier::changeStyle(int style) { - m_style = QDataVis::MeshStyle(style + 5); // skip unsupported mesh types - m_graph->setObjectType(m_style, m_smooth); + QComboBox *comboBox = qobject_cast(sender()); + if (comboBox) { + m_style = QAbstract3DSeries::Mesh(comboBox->itemData(style).toInt()); + if (m_graph->seriesList().size()) + m_graph->seriesList().at(0)->setMesh(m_style); + } } void ScatterDataModifier::setSmoothDots(int smooth) { m_smooth = bool(smooth); - m_graph->setObjectType(m_style, m_smooth); + QScatter3DSeries *series = m_graph->seriesList().at(0); + series->setMeshSmooth(m_smooth); } void ScatterDataModifier::changeTheme(int theme) diff --git a/examples/scatter/scatterdatamodifier.h b/examples/scatter/scatterdatamodifier.h index 43c58fd9..78dd45e3 100644 --- a/examples/scatter/scatterdatamodifier.h +++ b/examples/scatter/scatterdatamodifier.h @@ -20,6 +20,7 @@ #define SCATTERDATAMODIFIER_H #include +#include #include using namespace QtDataVisualization; @@ -58,7 +59,7 @@ private: QVector3D randVector(); Q3DScatter *m_graph; int m_fontSize; - QDataVis::MeshStyle m_style; + QAbstract3DSeries::Mesh m_style; bool m_smooth; }; diff --git a/src/datavisualization/data/barrenderitem.cpp b/src/datavisualization/data/barrenderitem.cpp index 558e2f96..67029c60 100644 --- a/src/datavisualization/data/barrenderitem.cpp +++ b/src/datavisualization/data/barrenderitem.cpp @@ -25,7 +25,8 @@ BarRenderItem::BarRenderItem() : AbstractRenderItem(), m_value(0), m_height(0.0f), - m_sliceLabelItem(0) + m_sliceLabelItem(0), + m_seriesIndex(0) { } @@ -37,6 +38,7 @@ BarRenderItem::BarRenderItem(const BarRenderItem &other) m_height = other.m_height; m_sliceLabel = other.m_sliceLabel; m_sliceLabelItem = 0; + m_seriesIndex = other.m_seriesIndex; } BarRenderItem::~BarRenderItem() diff --git a/src/datavisualization/data/barrenderitem_p.h b/src/datavisualization/data/barrenderitem_p.h index a837ff2c..480d5049 100644 --- a/src/datavisualization/data/barrenderitem_p.h +++ b/src/datavisualization/data/barrenderitem_p.h @@ -61,12 +61,18 @@ public: void setSliceLabel(const QString &label); QString &sliceLabel(); // Formats label if not previously formatted + // Series index in visual series that this item belongs to. + // This is only utilized by slicing, so it may not be up to date on all items. + inline void setSeriesIndex(int seriesIndex) { m_seriesIndex = seriesIndex; } + inline int seriesIndex() { return m_seriesIndex; } + protected: float m_value; QPoint m_position; // x = row, y = column GLfloat m_height; QString m_sliceLabel; LabelItem *m_sliceLabelItem; + int m_seriesIndex; friend class QBarDataItem; }; diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index 579e1dec..d5c4c6b8 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -78,6 +78,36 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * Series type for Q3DSurface. */ +/*! + \enum QAbstract3DSeries::Mesh + + Predefined mesh types. All styles are not usable with all visualization types. + + \value MeshUserDefined + User defined mesh, set via QAbstract3DSeries::userDefinedMesh property. + \value MeshBar + Basic rectangular bar. + \value MeshCube + Basic cube. + \value MeshPyramid + Four-sided pyramid. + \value MeshCone + Basic cone. + \value MeshCylinder + Basic cylinder. + \value MeshBevelBar + Slightly beveled (rounded) rectangular bar. + \value MeshBevelCube + Slightly beveled (rounded) cube. + \value MeshSphere + Sphere. + \value MeshMinimal + The minimal 3D mesh: a triangular pyramid. Usable only with Q3DScatter. + \value MeshPoint + 2D point. Usable only with Q3DScatter. + \b Note: Shadows and color gradients do not affect this style. +*/ + /*! * \internal */ @@ -115,7 +145,7 @@ QAbstract3DSeries::SeriesType QAbstract3DSeries::type() const */ void QAbstract3DSeries::setItemLabelFormat(const QString &format) { - if (format != itemLabelFormat()) { + if (d_ptr->m_itemLabelFormat != format) { d_ptr->setItemLabelFormat(format); emit itemLabelFormatChanged(format); } @@ -134,8 +164,10 @@ QString QAbstract3DSeries::itemLabelFormat() const */ void QAbstract3DSeries::setVisible(bool visible) { - d_ptr->m_visible = visible; - emit visibilityChanged(visible); + if (d_ptr->m_visible != visible) { + d_ptr->setVisible(visible); + emit visibilityChanged(visible); + } } bool QAbstract3DSeries::isVisible() const @@ -143,6 +175,70 @@ bool QAbstract3DSeries::isVisible() const return d_ptr->m_visible; } +/*! + * \property QAbstract3DSeries::mesh + * + * Sets the mesh of the items in the series, or the selection pointer in case of + * QSurface3DSeries. If the \a mesh is MeshUserDefined, then the userDefinedMesh property + * must also be set for items to render properly. The default value depends on the graph type. + */ +void QAbstract3DSeries::setMesh(QAbstract3DSeries::Mesh mesh) +{ + if ((mesh == QAbstract3DSeries::MeshPoint || mesh == QAbstract3DSeries::MeshMinimal) + && type() != QAbstract3DSeries::SeriesTypeScatter) { + qWarning() << "Specified style is only supported for QScatter3DSeries."; + } else if (d_ptr->m_mesh != mesh) { + d_ptr->setMesh(mesh); + emit meshChanged(mesh); + } +} + +QAbstract3DSeries::Mesh QAbstract3DSeries::mesh() const +{ + return d_ptr->m_mesh; +} + +/*! + * \property QAbstract3DSeries::meshSmooth + * + * If \a enable is true, smooth versions of predefined meshes set via mesh property are used. + * This property doesn't affect custom meshes used when mesh is MeshUserDefined. + * Defaults to false. + */ +void QAbstract3DSeries::setMeshSmooth(bool enable) +{ + if (d_ptr->m_meshSmooth != enable) { + d_ptr->setMeshSmooth(enable); + emit meshSmoothChanged(enable); + } +} + +bool QAbstract3DSeries::isMeshSmooth() const +{ + return d_ptr->m_meshSmooth; +} + +/*! + * \property QAbstract3DSeries::userDefinedMesh + * + * Sets the \a fileName for user defined custom mesh for objects that is used when mesh + * is MeshUserDefined. + * \note The file specified by \a fileName needs to be in Wavefront obj format and include + * vertices, normals and UVs. It also needs to be in triangles. + */ +void QAbstract3DSeries::setUserDefinedMesh(const QString &fileName) +{ + if (d_ptr->m_userDefinedMesh != fileName) { + d_ptr->setUserDefinedMesh(fileName); + emit userDefinedMeshChanged(fileName); + } +} + +QString QAbstract3DSeries::userDefinedMesh() const +{ + return d_ptr->m_userDefinedMesh; +} + // QAbstract3DSeriesPrivate QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstract3DSeries::SeriesType type) @@ -151,7 +247,9 @@ QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstra m_type(type), m_dataProxy(0), m_visible(true), - m_controller(0) + m_controller(0), + m_mesh(QAbstract3DSeries::MeshCube), + m_meshSmooth(false) { } @@ -159,13 +257,6 @@ QAbstract3DSeriesPrivate::~QAbstract3DSeriesPrivate() { } -void QAbstract3DSeriesPrivate::setItemLabelFormat(const QString &format) -{ - m_itemLabelFormat = format; - if (m_controller) - m_controller->setSeriesDirty(); -} - QAbstractDataProxy *QAbstract3DSeriesPrivate::dataProxy() const { return m_dataProxy; @@ -180,8 +271,10 @@ void QAbstract3DSeriesPrivate::setDataProxy(QAbstractDataProxy *proxy) proxy->d_ptr->setSeries(q_ptr); // also sets parent - if (m_controller) + if (m_controller) { connectControllerAndProxy(m_controller); + m_controller->markDataDirty(); + } } void QAbstract3DSeriesPrivate::setController(Abstract3DController *controller) @@ -191,4 +284,43 @@ void QAbstract3DSeriesPrivate::setController(Abstract3DController *controller) q_ptr->setParent(controller); } +void QAbstract3DSeriesPrivate::setItemLabelFormat(const QString &format) +{ + m_itemLabelFormat = format; + m_changeTracker.itemLabelFormatChanged = true; + if (m_controller) + m_controller->markSeriesVisualsDirty(); +} + +void QAbstract3DSeriesPrivate::setVisible(bool visible) +{ + m_visible = visible; + if (m_controller) + m_controller->markSeriesVisualsDirty(); +} + +void QAbstract3DSeriesPrivate::setMesh(QAbstract3DSeries::Mesh mesh) +{ + m_mesh = mesh; + m_changeTracker.meshChanged = true; + if (m_controller) + m_controller->markSeriesVisualsDirty(); +} + +void QAbstract3DSeriesPrivate::setMeshSmooth(bool enable) +{ + m_meshSmooth = enable; + m_changeTracker.meshSmoothChanged = true; + if (m_controller) + m_controller->markSeriesVisualsDirty(); +} + +void QAbstract3DSeriesPrivate::setUserDefinedMesh(const QString &meshFile) +{ + m_userDefinedMesh = meshFile; + m_changeTracker.userDefinedMeshChanged = true; + if (m_controller) + m_controller->markSeriesVisualsDirty(); +} + QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h index ccd93ad2..4d971749 100644 --- a/src/datavisualization/data/qabstract3dseries.h +++ b/src/datavisualization/data/qabstract3dseries.h @@ -31,9 +31,13 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DSeries : public QObject { Q_OBJECT Q_ENUMS(SeriesType) + Q_ENUMS(Mesh) Q_PROPERTY(SeriesType type READ type) Q_PROPERTY(QString itemLabelFormat READ itemLabelFormat WRITE setItemLabelFormat NOTIFY itemLabelFormatChanged) Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibilityChanged) + Q_PROPERTY(Mesh mesh READ mesh WRITE setMesh NOTIFY meshChanged) + Q_PROPERTY(bool meshSmooth READ isMeshSmooth WRITE setMeshSmooth NOTIFY meshSmoothChanged) + Q_PROPERTY(QString userDefinedMesh READ userDefinedMesh WRITE setUserDefinedMesh NOTIFY userDefinedMeshChanged) public: enum SeriesType { @@ -43,6 +47,20 @@ public: SeriesTypeSurface = 4 }; + enum Mesh { + MeshUserDefined = 0, + MeshBar, + MeshCube, + MeshPyramid, + MeshCone, + MeshCylinder, + MeshBevelBar, + MeshBevelCube, + MeshSphere, + MeshMinimal, + MeshPoint + }; + protected: explicit QAbstract3DSeries(QAbstract3DSeriesPrivate *d, QObject *parent = 0); @@ -57,9 +75,21 @@ public: void setVisible(bool visible); bool isVisible() const; + void setMesh(Mesh mesh); + Mesh mesh() const; + + void setMeshSmooth(bool enable); + bool isMeshSmooth() const; + + void setUserDefinedMesh(const QString &fileName); + QString userDefinedMesh() const; + signals: void itemLabelFormatChanged(QString format); void visibilityChanged(bool visible); + void meshChanged(Mesh mesh); + void meshSmoothChanged(bool enabled); + void userDefinedMeshChanged(QString fileName); protected: QScopedPointer d_ptr; @@ -80,6 +110,7 @@ private: friend class Surface3DController; friend class Scatter3DController; friend class QBar3DSeries; + friend class SeriesRenderCache; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h index a5dbe867..d37df562 100644 --- a/src/datavisualization/data/qabstract3dseries_p.h +++ b/src/datavisualization/data/qabstract3dseries_p.h @@ -38,6 +38,21 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE class QAbstractDataProxy; class Abstract3DController; +struct QAbstract3DSeriesChangeBitField { + bool itemLabelFormatChanged : 1; + bool meshChanged : 1; + bool meshSmoothChanged : 1; + bool userDefinedMeshChanged : 1; + + QAbstract3DSeriesChangeBitField() + : itemLabelFormatChanged(true), + meshChanged(true), + meshSmoothChanged(true), + userDefinedMeshChanged(true) + { + } +}; + class QAbstract3DSeriesPrivate : public QObject { Q_OBJECT @@ -45,30 +60,27 @@ public: QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstract3DSeries::SeriesType type); virtual ~QAbstract3DSeriesPrivate(); - void setItemLabelFormat(const QString &format); - QAbstractDataProxy *dataProxy() const; virtual void setDataProxy(QAbstractDataProxy *proxy); virtual void setController(Abstract3DController *controller); virtual void connectControllerAndProxy(Abstract3DController *newController) = 0; -protected: + void setItemLabelFormat(const QString &format); + void setVisible(bool visible); + void setMesh(QAbstract3DSeries::Mesh mesh); + void setMeshSmooth(bool enable); + void setUserDefinedMesh(const QString &meshFile); + + QAbstract3DSeriesChangeBitField m_changeTracker; QAbstract3DSeries *q_ptr; QAbstract3DSeries::SeriesType m_type; QString m_itemLabelFormat; QAbstractDataProxy *m_dataProxy; bool m_visible; Abstract3DController *m_controller; - -private: - friend class QAbstract3DSeries; - friend class Abstract3DController; - friend class Bars3DController; - friend class Surface3DController; - friend class Scatter3DController; - friend class QBar3DSeries; - friend class QScatter3DSeries; - friend class QSurface3DSeries; + QAbstract3DSeries::Mesh m_mesh; + bool m_meshSmooth; + QString m_userDefinedMesh; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp index 301f36f1..18e8b2ed 100644 --- a/src/datavisualization/data/qbar3dseries.cpp +++ b/src/datavisualization/data/qbar3dseries.cpp @@ -213,6 +213,7 @@ QBar3DSeriesPrivate::QBar3DSeriesPrivate(QBar3DSeries *q) m_selectedBar(Bars3DController::invalidSelectionPosition()) { m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel"); + m_mesh = QAbstract3DSeries::MeshBevelBar; } QBar3DSeriesPrivate::~QBar3DSeriesPrivate() @@ -261,8 +262,6 @@ void QBar3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newCon &Bars3DController::handleDataRowLabelsChanged); QObject::connect(barDataProxy, &QBarDataProxy::columnLabelsChanged, controller, &Bars3DController::handleDataColumnLabelsChanged); - QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller, - &Abstract3DController::handleSeriesVisibilityChanged); } } diff --git a/src/datavisualization/data/qscatter3dseries.cpp b/src/datavisualization/data/qscatter3dseries.cpp index 4d9eb01a..25e32ffe 100644 --- a/src/datavisualization/data/qscatter3dseries.cpp +++ b/src/datavisualization/data/qscatter3dseries.cpp @@ -207,6 +207,7 @@ QScatter3DSeriesPrivate::QScatter3DSeriesPrivate(QScatter3DSeries *q) m_selectedItem(Scatter3DController::invalidSelectionIndex()) { m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel"); + m_mesh = QAbstract3DSeries::MeshSphere; } QScatter3DSeriesPrivate::~QScatter3DSeriesPrivate() @@ -249,9 +250,6 @@ void QScatter3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *ne controller, &Scatter3DController::handleItemsRemoved); QObject::connect(scatterDataProxy, &QScatterDataProxy::itemsInserted, controller, &Scatter3DController::handleItemsInserted); - - QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller, - &Abstract3DController::handleSeriesVisibilityChanged); } } diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp index 2e850b03..baae3a78 100644 --- a/src/datavisualization/data/qsurface3dseries.cpp +++ b/src/datavisualization/data/qsurface3dseries.cpp @@ -33,6 +33,9 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * If no data proxy is set explicitly for the series, the series creates a default * proxy. Setting another proxy will destroy the existing proxy and all data added to it. * + * The object mesh set via QAbstract3DSeries::mesh property defines the selection + * pointer shape in surface series. + * * QSurface3DSeries supports the following format tags for QAbstract3DSeries::setItemLabelFormat(): * \table * \row @@ -207,6 +210,7 @@ QSurface3DSeriesPrivate::QSurface3DSeriesPrivate(QSurface3DSeries *q) m_selectedPoint(Surface3DController::invalidSelectionPosition()) { m_itemLabelFormat = QStringLiteral("(@xLabel, @yLabel, @zLabel)"); + m_mesh = QAbstract3DSeries::MeshSphere; } QSurface3DSeriesPrivate::~QSurface3DSeriesPrivate() @@ -244,9 +248,6 @@ void QSurface3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *ne &Surface3DController::handleArrayReset); QObject::connect(surfaceDataProxy, &QSurfaceDataProxy::rowsChanged, controller, &Surface3DController::handleRowsChanged); - - QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller, - &Abstract3DController::handleSeriesVisibilityChanged); } } diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc index bb99a539..b64c3c03 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-bars3d.qdoc @@ -78,11 +78,6 @@ */ -/*! - * \qmlproperty Bars3D.MeshStyle Bars3D::barType - * Bar object type. - */ - /*! * \qmlproperty real Bars3D::barThickness * Bar thickness ratio between X and Z dimensions. 1.0 means bars are as wide as they are deep, 0.5 @@ -99,18 +94,6 @@ * Relative or absolute bar spacing. */ -/*! - * \qmlproperty bool Bars3D::barSmoothingEnabled - * Bar smoothing. If false, bar shading is flat. - */ - -/*! - * \qmlproperty string Bars3D::meshFileName - * Override bar type with a mesh object. - * \note Object needs to be in Wavefront obj format and include vertices, normals and UVs. - * It also needs to be in triangles. - */ - /*! * \qmlproperty int Bars3D::rows * Row count of data window. diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc index da7faaa3..1f04424f 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-scatter3d.qdoc @@ -39,19 +39,6 @@ \sa Scatter3DSeries, ScatterDataProxy, Bars3D, Surface3D, {Qt Data Visualization C++ Classes} */ -/*! - * \qmlmethod void Scatter3D::setObjectColor(const QColor &baseColor, bool uniform) - * Set item color using your own colors. \a baseColor sets the base color of a item. The \a uniform - * -flag is used to define if color needs to be uniform throughout item's length, or will the colors - * be applied by height. It is \c true by default. - * - * Calling this method overrides colors from theme. - * - * \sa AbstractGraph3D::theme - * - * \warning This method is subject to change. - */ - /*! \qmlproperty ValueAxis3D Scatter3D::axisX A user-defined X axis. @@ -79,23 +66,6 @@ This temporary axis is destroyed if another axis is explicitly set to same orientation. */ -/*! - \qmlproperty Scatter3D.MeshStyle Scatter3D::objectType - Dot object type. - */ - -/*! - \qmlproperty bool Scatter3D::objectSmoothingEnabled - Dot smoothing. If false, dot shading is flat. - */ - -/*! - \qmlproperty string Scatter3D::meshFileName - Override object type with a mesh object. - \note Object needs to be in Wavefront obj format and include vertices, normals and UVs. - It also needs to be in triangles. - */ - /*! * \qmlproperty list Scatter3D::seriesList * This property holds the series of the graph. diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc index f422a5b5..cbc8a900 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-surface3d.qdoc @@ -71,12 +71,6 @@ The smoothing of surface. If false, the shading of the surface is flat. */ -/*! - * \qmlproperty bool Surface3D::surfaceVisible - * The surface visibility. If false, no surface is drawn. If surface grid is enabled, it is still - * drawn. - */ - /*! \qmlproperty bool Surface3D::surfaceGridEnabled The surface grid visibility. If false, no surface grid is drawn. diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 302b74ad..b8b2e826 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -52,7 +52,8 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) : m_axisZ(0), m_renderer(0), m_isDataDirty(true), - m_isSeriesDirty(true), + m_isSeriesVisibilityDirty(true), + m_isSeriesVisualsDirty(true), m_renderPending(false) { // Set initial theme @@ -98,6 +99,8 @@ void Abstract3DController::addSeries(QAbstract3DSeries *series) if (series && !m_seriesList.contains(series)) { m_seriesList.append(series); series->d_ptr->setController(this); + QObject::connect(series, &QAbstract3DSeries::visibilityChanged, + this, &Abstract3DController::handleSeriesVisibilityChanged); if (series->isVisible()) handleSeriesVisibilityChangedBySender(series); } @@ -107,9 +110,11 @@ void Abstract3DController::removeSeries(QAbstract3DSeries *series) { if (series && series->d_ptr->m_controller == this) { m_seriesList.removeAll(series); + QObject::disconnect(series, &QAbstract3DSeries::visibilityChanged, + this, &Abstract3DController::handleSeriesVisibilityChanged); series->d_ptr->setController(0); m_isDataDirty = true; - m_isSeriesDirty = true; + m_isSeriesVisibilityDirty = true; emitNeedRender(); } } @@ -189,11 +194,6 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.selectionModeChanged = false; } - if (m_changeTracker.objFileChanged) { - m_renderer->updateMeshFileName(m_objFile); - m_changeTracker.objFileChanged = false; - } - if (m_changeTracker.axisXTypeChanged) { m_renderer->updateAxisType(Q3DAbstractAxis::AxisOrientationX, m_axisX->type()); m_changeTracker.axisXTypeChanged = false; @@ -337,9 +337,10 @@ void Abstract3DController::synchDataToRenderer() } } - if (m_isSeriesDirty) { - m_renderer->updateSeries(m_seriesList); - m_isSeriesDirty = false; + if (m_isSeriesVisibilityDirty || m_isSeriesVisualsDirty) { + m_renderer->updateSeries(m_seriesList, m_isSeriesVisibilityDirty); + m_isSeriesVisibilityDirty = false; + m_isSeriesVisualsDirty = false; } if (m_isDataDirty) { @@ -833,24 +834,21 @@ void Abstract3DController::setSlicingActive(bool isSlicing) emitNeedRender(); } -void Abstract3DController::setMeshFileName(const QString &fileName) +Q3DScene *Abstract3DController::scene() { - if (fileName != m_objFile) { - m_objFile = fileName; - m_changeTracker.objFileChanged = true; - emit meshFileNameChanged(fileName); - emitNeedRender(); - } + return m_scene; } -QString Abstract3DController::meshFileName() const +void Abstract3DController::markDataDirty() { - return m_objFile; + m_isDataDirty = true; + emitNeedRender(); } -Q3DScene *Abstract3DController::scene() +void Abstract3DController::markSeriesVisualsDirty() { - return m_scene; + m_isSeriesVisualsDirty = true; + emitNeedRender(); } void Abstract3DController::handleAxisTitleChanged(const QString &title) @@ -1023,7 +1021,7 @@ void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender Q_UNUSED(sender) m_isDataDirty = true; - m_isSeriesDirty = true; + m_isSeriesVisibilityDirty = true; emitNeedRender(); } diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 556d1ea5..27cfb9a1 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -61,7 +61,6 @@ struct Abstract3DChangeBitField { bool selectionModeChanged : 1; bool objFileChanged : 1; bool gridEnabledChanged : 1; - bool backgroundEnabledChanged : 1; bool axisXTypeChanged : 1; bool axisYTypeChanged : 1; bool axisZTypeChanged : 1; @@ -105,7 +104,6 @@ struct Abstract3DChangeBitField { selectionModeChanged(true), objFileChanged(true), gridEnabledChanged(true), - backgroundEnabledChanged(true), axisXTypeChanged(true), axisYTypeChanged(true), axisZTypeChanged(true), @@ -172,7 +170,6 @@ private: bool m_labelBackground; bool m_isBackgroundEnabled; bool m_isGridEnabled; - QString m_objFile; Q3DScene *m_scene; QDataVis::ColorStyle m_colorStyle; QColor m_objectColor; @@ -194,7 +191,8 @@ protected: QList m_axes; // List of all added axes Abstract3DRenderer *m_renderer; bool m_isDataDirty; - bool m_isSeriesDirty; + bool m_isSeriesVisibilityDirty; + bool m_isSeriesVisualsDirty; bool m_renderPending; QList m_seriesList; @@ -282,12 +280,11 @@ public: bool isSlicingActive() const; void setSlicingActive(bool isSlicing); - virtual void setMeshFileName(const QString &fileName); - virtual QString meshFileName() const; - Q3DScene *scene(); - inline void setSeriesDirty() { m_isSeriesDirty = true; } + void markDataDirty(); + void markSeriesVisualsDirty(); + void emitNeedRender(); virtual void mouseDoubleClickEvent(QMouseEvent *event); @@ -327,7 +324,6 @@ signals: void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); void themeChanged(Q3DTheme *theme); void selectionModeChanged(QDataVis::SelectionFlags mode); - void meshFileNameChanged(QString filename); void needRender(); void colorStyleChanged(QDataVis::ColorStyle style); void objectColorChanged(QColor color); @@ -345,6 +341,8 @@ protected: private: void setAxisHelper(Q3DAbstractAxis::AxisOrientation orientation, Q3DAbstractAxis *axis, Q3DAbstractAxis **axisPtr); + + friend class Bars3DController; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 50e56ce5..7e17baff 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -25,6 +25,7 @@ #include "q3dlight_p.h" #include "qabstract3dseries_p.h" #include "q3dtheme_p.h" +#include "objecthelper_p.h" Q_DECLARE_METATYPE(QtDataVisualization::QDataVis::ShadowQuality) @@ -71,6 +72,8 @@ Abstract3DRenderer::~Abstract3DRenderer() delete m_drawer; delete m_textureHelper; delete m_cachedScene; + for (int i = 0; i < m_visibleSeriesList.size(); i++) + delete m_visibleSeriesList.at(i).object(); } void Abstract3DRenderer::initializeOpenGL() @@ -250,14 +253,6 @@ void Abstract3DRenderer::handleShadowQualityChange() #endif } -void Abstract3DRenderer::updateMeshFileName(const QString &objFileName) -{ - if (objFileName != m_cachedObjFile) { - m_cachedObjFile = objFileName; - loadMeshFile(); - } -} - void Abstract3DRenderer::updateSelectionMode(QDataVis::SelectionFlags mode) { m_cachedSelectionMode = mode; @@ -365,21 +360,31 @@ void Abstract3DRenderer::updateMultiHighlightGradient(const QLinearGradient &gra fixGradient(&m_cachedMultiHighlightGradient, &m_multiHighlightGradientTexture); } -void Abstract3DRenderer::updateSeries(const QList &seriesList) +void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) +{ + // Default implementation does nothing. + Q_UNUSED(fileName) + Q_UNUSED(mesh) +} + +void Abstract3DRenderer::updateSeries(const QList &seriesList, + bool updateVisibility) { int visibleCount = 0; - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - visibleCount++; - } + if (updateVisibility) { + foreach (QAbstract3DSeries *current, seriesList) { + if (current->isVisible()) + visibleCount++; + } - if (visibleCount != m_visibleSeriesList.size()) - m_visibleSeriesList.resize(visibleCount); + if (visibleCount != m_visibleSeriesList.size()) + m_visibleSeriesList.resize(visibleCount); - visibleCount = 0; + visibleCount = 0; + } foreach (QAbstract3DSeries *current, seriesList) { if (current->isVisible()) - m_visibleSeriesList[visibleCount++].populate(current); + m_visibleSeriesList[visibleCount++].populate(current, this); } } diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 6582fbc3..fe213b33 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -66,7 +66,6 @@ protected: QDataVis::ShadowQuality m_cachedShadowQuality; GLfloat m_autoScaleAdjustment; - QString m_cachedObjFile; QDataVis::SelectionFlags m_cachedSelectionMode; QDataVis::ColorStyle m_cachedColorStyle; @@ -104,7 +103,7 @@ public: virtual ~Abstract3DRenderer(); virtual void updateData() = 0; - virtual void updateSeries(const QList &seriesList); + virtual void updateSeries(const QList &seriesList, bool updateVisibility); virtual void render(GLuint defaultFboHandle); @@ -113,7 +112,6 @@ public: virtual void updateTheme(Q3DTheme *theme); virtual void updateSelectionMode(QDataVis::SelectionFlags newMode); - virtual void updateMeshFileName(const QString &objFileName); virtual void updateScene(Q3DScene *scene); virtual void updateTextures() = 0; virtual void initSelectionBuffer() = 0; @@ -141,6 +139,8 @@ public: virtual void updateMultiHighlightColor(const QColor &color); virtual void updateMultiHighlightGradient(const QLinearGradient &gradient); + virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); + signals: void needRender(); // Emit this if something in renderer causes need for another render pass. void requestShadowQuality(QDataVis::ShadowQuality quality); // For automatic quality adjustments @@ -153,7 +153,6 @@ protected: void reInitShaders(); virtual void handleShadowQualityChange(); virtual void handleResize(); - virtual void loadMeshFile() = 0; AxisRenderCache &axisCacheForOrientation(Q3DAbstractAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index cb7ba5cb..7c3eff09 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -24,6 +24,8 @@ #include "q3dcategoryaxis_p.h" #include "qbardataproxy_p.h" #include "qbar3dseries_p.h" +#include "thememanager_p.h" +#include "q3dtheme_p.h" #include #include @@ -39,9 +41,6 @@ Bars3DController::Bars3DController(QRect boundRect) m_barSpacing(QSizeF(1.0, 1.0)), m_renderer(0) { - // Default bar type; specific to bars - setBarType(QDataVis::MeshStyleBevelBars, false); - // Setting a null axis creates a new default axis according to orientation and graph type. // Note: these cannot be set in the Abstract3DController constructor, as they will call virtual // functions implemented by subclasses. @@ -72,6 +71,13 @@ void Bars3DController::initializeOpenGL() void Bars3DController::synchDataToRenderer() { + // Background change requires reloading the meshes in bar graphs, so dirty the series visuals + if (m_themeManager->theme()->d_ptr->m_dirtyBits.backgroundEnabledDirty) { + m_isSeriesVisualsDirty = true; + foreach (QAbstract3DSeries *series, m_seriesList) + series->d_ptr->m_changeTracker.meshChanged = true; + } + Abstract3DController::synchDataToRenderer(); if (!isInitialized()) @@ -311,26 +317,6 @@ bool Bars3DController::isBarSpecRelative() return m_isBarSpecRelative; } -void Bars3DController::setBarType(QDataVis::MeshStyle style, bool smooth) -{ - QString objFile; - if (style == QDataVis::MeshStyleBars) - objFile = QStringLiteral(":/defaultMeshes/bar"); - else if (style == QDataVis::MeshStylePyramids) - objFile = QStringLiteral(":/defaultMeshes/pyramid"); - else if (style == QDataVis::MeshStyleCones) - objFile = QStringLiteral(":/defaultMeshes/cone"); - else if (style == QDataVis::MeshStyleCylinders) - objFile = QStringLiteral(":/defaultMeshes/cylinder"); - else if (style == QDataVis::MeshStyleBevelBars) - objFile = QStringLiteral(":/defaultMeshes/bevelbar"); - - if (smooth) - objFile += QStringLiteral("Smooth"); - - Abstract3DController::setMeshFileName(objFile); -} - void Bars3DController::setSelectionMode(QDataVis::SelectionFlags mode) { if (mode.testFlag(QDataVis::SelectionSlice) diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index e9f39541..71009024 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -88,7 +88,6 @@ public: GLfloat barThickness(); QSizeF barSpacing(); bool isBarSpecRelative(); - void setBarType(QDataVis::MeshStyle style, bool smooth = false); void setSelectionMode(QDataVis::SelectionFlags mode); void setSelectedBar(const QPoint &position, QBar3DSeries *series); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 142640b3..addad904 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -64,7 +64,6 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_selectionShader(0), m_backgroundShader(0), m_labelShader(0), - m_barObj(0), m_backgroundObj(0), m_gridLineObj(0), m_labelObj(0), @@ -114,7 +113,6 @@ Bars3DRenderer::~Bars3DRenderer() delete m_depthShader; delete m_selectionShader; delete m_backgroundShader; - delete m_barObj; delete m_backgroundObj; delete m_gridLineObj; delete m_labelObj; @@ -297,9 +295,6 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, const LabelItem &zLabel) { GLfloat barPosX = 0; - GLint startBar = 0; - GLint stopBar = m_sliceSelection->size(); - GLint stepBar = 1; QVector3D lightPos; // Specify viewport @@ -484,7 +479,8 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, gradientTexture = m_objectGradientTexture; } - for (int bar = startBar; bar != stopBar; bar += stepBar) { + int stopBar = m_sliceSelection->size(); + for (int bar = 0; bar < stopBar; bar++) { BarRenderItem *item = m_sliceSelection->at(bar); if (!item) continue; @@ -517,6 +513,7 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, MVPMatrix = projectionViewMatrix * modelMatrix; QVector3D barColor; + // TODO: Get color from correct series if (itemMode && m_visualSelectedBarPos.x() == item->position().x() && m_visualSelectedBarPos.y() == item->position().y()) { if (m_cachedColorStyle == QDataVis::ColorStyleUniform) @@ -544,7 +541,9 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, } // Draw the object - m_drawer->drawObject(m_barShader, m_barObj, gradientTexture); + m_drawer->drawObject(m_barShader, + m_visibleSeriesList.at(item->seriesIndex()).object(), + gradientTexture); } } @@ -591,7 +590,8 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, // TODO: Maybe use selection label instead of value? Should it be user controllable // as well? (QTRD-2546) if (itemMode && m_visualSelectedBarPos.x() == item->position().x() - && m_visualSelectedBarPos.y() == item->position().y()) { + && m_visualSelectedBarPos.y() == item->position().y() + && item->seriesIndex() == m_visualSelectedBarSeriesIndex) { m_drawer->drawLabel(*item, item->sliceLabelItem(), viewMatrix, projectionMatrix, valuePositionComp, sliceValueRotation, item->height(), m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, @@ -785,6 +785,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar); if (!item.value()) continue; + ObjectHelper *barObj = m_visibleSeriesList.at(series).object(); // Set front face culling for negative valued bars and back face culling for // positive valued bars to remove peter-panning issues if (item.height() > 0) { @@ -818,15 +819,15 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // 1st attribute buffer : vertices glEnableVertexAttribArray(m_depthShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, m_barObj->vertexBuf()); + glBindBuffer(GL_ARRAY_BUFFER, barObj->vertexBuf()); glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0); // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_barObj->elementBuf()); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, barObj->elementBuf()); // Draw the triangles - glDrawElements(GL_TRIANGLES, m_barObj->indexCount(), GL_UNSIGNED_SHORT, + glDrawElements(GL_TRIANGLES, barObj->indexCount(), GL_UNSIGNED_SHORT, (void *)0); // Free buffers @@ -890,6 +891,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) seriesPos += m_seriesStep; continue; } + ObjectHelper *barObj = m_visibleSeriesList.at(series).object(); if (item.height() < 0) glCullFace(GL_FRONT); @@ -926,15 +928,15 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // 1st attribute buffer : vertices glEnableVertexAttribArray(m_selectionShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, m_barObj->vertexBuf()); + glBindBuffer(GL_ARRAY_BUFFER, barObj->vertexBuf()); glVertexAttribPointer(m_selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0); // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_barObj->elementBuf()); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, barObj->elementBuf()); // Draw the triangles - glDrawElements(GL_TRIANGLES, m_barObj->indexCount(), GL_UNSIGNED_SHORT, + glDrawElements(GL_TRIANGLES, barObj->indexCount(), GL_UNSIGNED_SHORT, (void *)0); // Free buffers @@ -1001,6 +1003,14 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (m_sliceSelection && m_sliceSelection->size()) { // Slice doesn't own its items, no need to delete them - just clear m_sliceSelection->clear(); + int reserveAmount = 0; + if (rowMode) + reserveAmount = m_renderColumns; + else + reserveAmount = m_renderRows; + if (m_cachedSelectionMode.testFlag(QDataVis::SelectionMultiSeries)) + reserveAmount *= m_visibleSeriesList.size(); + m_sliceSelection->reserve(reserveAmount); } // Set slice cache, i.e. axis cache from where slice labels are taken if (rowMode) @@ -1029,6 +1039,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) for (int bar = startBar; bar != stopBar; bar += stepBar) { float seriesPos = m_seriesStart; for (int series = 0; series < seriesCount; series++) { + ObjectHelper *barObj = m_visibleSeriesList.at(series).object(); BarRenderItem &item = m_renderingArrays[series][row][bar]; if (item.height() < 0) @@ -1094,6 +1105,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } item.setTranslation(translation); item.setPosition(QPoint(row, bar)); + item.setSeriesIndex(series); m_sliceSelection->append(&item); barSelectionFound = true; } @@ -1112,6 +1124,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) item.setTranslation(modelMatrix.column(3).toVector3D()); item.setPosition(QPoint(row, bar)); if (m_selectionDirty && bar < m_renderColumns) { + item.setSeriesIndex(series); if (!m_sliceTitleItem && m_axisCacheX.labelItems().size() > row) m_sliceTitleItem = m_axisCacheX.labelItems().at(row); m_sliceSelection->append(&item); @@ -1138,6 +1151,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) item.setTranslation(translation); item.setPosition(QPoint(row, bar)); if (m_selectionDirty && row < m_renderRows) { + item.setSeriesIndex(series); if (!m_sliceTitleItem && m_axisCacheZ.labelItems().size() > bar) m_sliceTitleItem = m_axisCacheZ.labelItems().at(bar); m_sliceSelection->append(&item); @@ -1176,7 +1190,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_barShader->setUniformValue(m_barShader->lightS(), shadowLightStrength); // Draw the object - m_drawer->drawObject(m_barShader, m_barObj, gradientTexture, m_depthTexture); + m_drawer->drawObject(m_barShader, barObj, gradientTexture, m_depthTexture); } else #endif { @@ -1184,7 +1198,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_barShader->setUniformValue(m_barShader->lightS(), lightStrength); // Draw the object - m_drawer->drawObject(m_barShader, m_barObj, gradientTexture); + m_drawer->drawObject(m_barShader, barObj, gradientTexture); } } seriesPos += m_seriesStep; @@ -1829,16 +1843,6 @@ void Bars3DRenderer::updateAxisRange(Q3DAbstractAxis::AxisOrientation orientatio } } -void Bars3DRenderer::updateTheme(Q3DTheme *theme) -{ - bool wasEnabled = m_cachedTheme->isBackgroundEnabled(); - - Abstract3DRenderer::updateTheme(theme); - - if (theme->isBackgroundEnabled() != wasEnabled) - loadMeshFile(); // Load changed bar type -} - void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSeries *series) { m_selectedBarPos = position; @@ -1914,21 +1918,6 @@ void Bars3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality) #endif } -void Bars3DRenderer::loadMeshFile() -{ - if (m_cachedObjFile.isEmpty()) - return; - - QString objectFileName = m_cachedObjFile; - if (m_barObj) - delete m_barObj; - // If background is disabled, load full version of bar mesh - if (!m_cachedTheme->isBackgroundEnabled()) - objectFileName.append(QStringLiteral("Full")); - m_barObj = new ObjectHelper(objectFileName); - m_barObj->load(); -} - void Bars3DRenderer::loadBackgroundMesh() { if (m_backgroundObj) @@ -1962,6 +1951,16 @@ void Bars3DRenderer::updateTextures() m_updateLabels = true; } +void Bars3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) +{ + if (!m_cachedTheme->isBackgroundEnabled()) { + // Load full version of meshes that have it available + // Note: Minimal and Point not supported in bar charts + if (mesh != QAbstract3DSeries::MeshSphere) + fileName.append(QStringLiteral("Full")); + } +} + void Bars3DRenderer::calculateSceneScalingFactors() { // Calculate scene scaling and translation factors diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index f3e9103b..47c77537 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -74,7 +74,6 @@ private: ShaderHelper *m_selectionShader; ShaderHelper *m_backgroundShader; ShaderHelper *m_labelShader; - ObjectHelper *m_barObj; ObjectHelper *m_backgroundObj; ObjectHelper *m_gridLineObj; ObjectHelper *m_labelObj; @@ -122,7 +121,6 @@ public: protected: virtual void initializeOpenGL(); - virtual void loadMeshFile(); public slots: void updateBarSpecs(GLfloat thicknessRatio = 1.0f, @@ -141,7 +139,7 @@ private: virtual void initShaders(const QString &vertexShader, const QString &fragmentShader); virtual void updateShadowQuality(QDataVis::ShadowQuality quality); virtual void updateTextures(); - virtual void updateTheme(Q3DTheme *theme); + virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); void drawSlicedScene(const LabelItem &xLabel, const LabelItem &yLabel, const LabelItem &zLabel); void drawScene(GLuint defaultFboHandle); diff --git a/src/datavisualization/engine/engine.qrc b/src/datavisualization/engine/engine.qrc index ecf9e29b..8fcaecec 100644 --- a/src/datavisualization/engine/engine.qrc +++ b/src/datavisualization/engine/engine.qrc @@ -24,9 +24,9 @@ meshes/barFilledSmooth.obj meshes/cubeFilledFlat.obj meshes/cubeFilledSmooth.obj - meshes/scatterdot.obj - meshes/scatterdotFlat.obj meshes/backgroundNegatives.obj + meshes/minimalFlat.obj + meshes/minimalSmooth.obj shaders/default.frag diff --git a/src/datavisualization/engine/meshes/minimalFlat.obj b/src/datavisualization/engine/meshes/minimalFlat.obj new file mode 100644 index 00000000..9ab60a21 --- /dev/null +++ b/src/datavisualization/engine/meshes/minimalFlat.obj @@ -0,0 +1,27 @@ +# Blender v2.66 (sub 0) OBJ File: 'scatterdot.blend' +# www.blender.org +o Cone +v 0.000000 -1.000000 -1.414000 +v 1.224560 -1.000000 0.707000 +v 0.000000 1.000000 0.000000 +v -1.224560 -1.000000 0.707000 +vt 0.499966 0.866025 +vt 0.000000 1.153999 +vt 0.000590 0.577029 +vt 0.999376 0.000000 +vt 1.000000 0.577029 +vt 0.500000 0.288996 +vt 1.000000 0.866025 +vt 0.500000 1.154058 +vt 0.500624 0.577029 +vt 0.000000 0.577029 +vt 0.000624 0.000000 +vn -0.000000 -1.000000 0.000000 +vn 0.816510 0.333289 -0.471412 +vn -0.000000 0.333289 0.942825 +vn -0.816510 0.333289 -0.471413 +s off +f 4/1/1 1/2/1 2/3/1 +f 1/4/2 3/5/2 2/6/2 +f 2/7/3 3/8/3 4/9/3 +f 4/6/4 3/10/4 1/11/4 diff --git a/src/datavisualization/engine/meshes/minimalSmooth.obj b/src/datavisualization/engine/meshes/minimalSmooth.obj new file mode 100644 index 00000000..dd2e77d3 --- /dev/null +++ b/src/datavisualization/engine/meshes/minimalSmooth.obj @@ -0,0 +1,27 @@ +# Blender v2.66 (sub 0) OBJ File: 'scatterdot.blend' +# www.blender.org +o Cone +v 0.000000 -1.000000 -1.414000 +v 1.224560 -1.000000 0.707000 +v 0.000000 1.000000 0.000000 +v -1.224560 -1.000000 0.707000 +vt 0.499966 0.866025 +vt 0.000000 1.153999 +vt 0.000590 0.577029 +vt 0.999376 0.000000 +vt 1.000000 0.577029 +vt 0.500000 0.288996 +vt 1.000000 0.866025 +vt 0.500000 1.154058 +vt 0.500624 0.577029 +vt 0.000000 0.577029 +vt 0.000624 0.000000 +vn -0.816462 -0.333354 0.471389 +vn 0.000000 -0.333354 -0.942778 +vn 0.816462 -0.333354 0.471389 +vn 0.000000 1.000000 0.000000 +s 1 +f 4/1/1 1/2/2 2/3/3 +f 1/4/2 3/5/4 2/6/3 +f 2/7/3 3/8/4 4/9/1 +f 4/6/1 3/10/4 1/11/2 diff --git a/src/datavisualization/engine/meshes/scatterdot.obj b/src/datavisualization/engine/meshes/scatterdot.obj deleted file mode 100644 index dd2e77d3..00000000 --- a/src/datavisualization/engine/meshes/scatterdot.obj +++ /dev/null @@ -1,27 +0,0 @@ -# Blender v2.66 (sub 0) OBJ File: 'scatterdot.blend' -# www.blender.org -o Cone -v 0.000000 -1.000000 -1.414000 -v 1.224560 -1.000000 0.707000 -v 0.000000 1.000000 0.000000 -v -1.224560 -1.000000 0.707000 -vt 0.499966 0.866025 -vt 0.000000 1.153999 -vt 0.000590 0.577029 -vt 0.999376 0.000000 -vt 1.000000 0.577029 -vt 0.500000 0.288996 -vt 1.000000 0.866025 -vt 0.500000 1.154058 -vt 0.500624 0.577029 -vt 0.000000 0.577029 -vt 0.000624 0.000000 -vn -0.816462 -0.333354 0.471389 -vn 0.000000 -0.333354 -0.942778 -vn 0.816462 -0.333354 0.471389 -vn 0.000000 1.000000 0.000000 -s 1 -f 4/1/1 1/2/2 2/3/3 -f 1/4/2 3/5/4 2/6/3 -f 2/7/3 3/8/4 4/9/1 -f 4/6/1 3/10/4 1/11/2 diff --git a/src/datavisualization/engine/meshes/scatterdotFlat.obj b/src/datavisualization/engine/meshes/scatterdotFlat.obj deleted file mode 100644 index 9ab60a21..00000000 --- a/src/datavisualization/engine/meshes/scatterdotFlat.obj +++ /dev/null @@ -1,27 +0,0 @@ -# Blender v2.66 (sub 0) OBJ File: 'scatterdot.blend' -# www.blender.org -o Cone -v 0.000000 -1.000000 -1.414000 -v 1.224560 -1.000000 0.707000 -v 0.000000 1.000000 0.000000 -v -1.224560 -1.000000 0.707000 -vt 0.499966 0.866025 -vt 0.000000 1.153999 -vt 0.000590 0.577029 -vt 0.999376 0.000000 -vt 1.000000 0.577029 -vt 0.500000 0.288996 -vt 1.000000 0.866025 -vt 0.500000 1.154058 -vt 0.500624 0.577029 -vt 0.000000 0.577029 -vt 0.000624 0.000000 -vn -0.000000 -1.000000 0.000000 -vn 0.816510 0.333289 -0.471412 -vn -0.000000 0.333289 0.942825 -vn -0.816510 0.333289 -0.471413 -s off -f 4/1/1 1/2/1 2/3/1 -f 1/4/2 3/5/2 2/6/2 -f 2/7/3 3/8/3 4/9/3 -f 4/6/4 3/10/4 1/11/4 diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 52db2100..095c5d8d 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -106,8 +106,6 @@ Q3DBars::Q3DBars() &Q3DBars::selectionModeChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::shadowQualityChanged, this, &Q3DBars::shadowQualityChanged); - QObject::connect(d_ptr->m_shared, &Abstract3DController::meshFileNameChanged, this, - &Q3DBars::meshFileNameChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::themeChanged, this, &Q3DBars::themeChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::colorStyleChanged, this, @@ -299,18 +297,6 @@ bool Q3DBars::isBarSpacingRelative() return d_ptr->m_shared->isBarSpecRelative(); } -/*! - * Sets the bar \a style to one of the values in \c QDataVis::MeshStyle. It is preset to - * \c QDataVis::MeshStyleBars by default. A \a smooth flag can be used to set shading to smooth. - * It is \c false by default. - * - * \sa setMeshFileName() - */ -void Q3DBars::setBarType(QDataVis::MeshStyle style, bool smooth) -{ - d_ptr->m_shared->setBarType(style, smooth); -} - /*! * \property Q3DBars::theme * @@ -344,25 +330,6 @@ QDataVis::SelectionFlags Q3DBars::selectionMode() const return d_ptr->m_shared->selectionMode(); } -/*! - * \property Q3DBars::meshFileName - * - * Override bar type with a mesh object located in \a objFileName. - * \note Object needs to be in Wavefront obj format and include vertices, normals and UVs. - * It also needs to be in triangles. - * - * \sa setBarType() - */ -void Q3DBars::setMeshFileName(const QString &objFileName) -{ - d_ptr->m_shared->setMeshFileName(objFileName); -} - -QString Q3DBars::meshFileName() const -{ - return d_ptr->m_shared->meshFileName(); -} - /*! * \property Q3DBars::scene * diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h index c08db74a..37243a0d 100644 --- a/src/datavisualization/engine/q3dbars.h +++ b/src/datavisualization/engine/q3dbars.h @@ -42,7 +42,6 @@ class QT_DATAVISUALIZATION_EXPORT Q3DBars : public Q3DWindow Q_PROPERTY(float barThickness READ barThickness WRITE setBarThickness NOTIFY barThicknessChanged) Q_PROPERTY(QSizeF barSpacing READ barSpacing WRITE setBarSpacing NOTIFY barSpacingChanged) Q_PROPERTY(bool barSpacingRelative READ isBarSpacingRelative WRITE setBarSpacingRelative NOTIFY barSpacingRelativeChanged) - Q_PROPERTY(QString meshFileName READ meshFileName WRITE setMeshFileName NOTIFY meshFileNameChanged) Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged) Q_PROPERTY(Q3DScene* scene READ scene) Q_PROPERTY(QtDataVisualization::QDataVis::ColorStyle colorStyle READ colorStyle WRITE setColorStyle NOTIFY colorStyleChanged) @@ -61,9 +60,6 @@ public: void removeSeries(QBar3DSeries *series); QList seriesList(); - // TODO: Move to dataset object once that is done QTRD-2121 - void setBarType(QDataVis::MeshStyle style, bool smooth = false); - void setTheme(Q3DTheme *theme); Q3DTheme *theme() const; @@ -76,10 +72,6 @@ public: void setBarSpacingRelative(bool relative); bool isBarSpacingRelative(); - // TODO: Move to dataset object once that is done QTRD-2121 - void setMeshFileName(const QString &objFileName); - QString meshFileName() const; - void setSelectionMode(QDataVis::SelectionFlags mode); QDataVis::SelectionFlags selectionMode() const; @@ -123,7 +115,6 @@ signals: void barThicknessChanged(float thicknessRatio); void barSpacingChanged(QSizeF spacing); void barSpacingRelativeChanged(bool relative); - void meshFileNameChanged(QString filename); void themeChanged(Q3DTheme *theme); void colorStyleChanged(QDataVis::ColorStyle style); void barColorChanged(QColor color); diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp index acacaa8f..a71bdb18 100644 --- a/src/datavisualization/engine/q3dscatter.cpp +++ b/src/datavisualization/engine/q3dscatter.cpp @@ -90,8 +90,6 @@ Q3DScatter::Q3DScatter() &Q3DScatter::selectionModeChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::shadowQualityChanged, this, &Q3DScatter::shadowQualityChanged); - QObject::connect(d_ptr->m_shared, &Abstract3DController::meshFileNameChanged, this, - &Q3DScatter::meshFileNameChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::themeChanged, this, &Q3DScatter::themeChanged); QObject::connect(d_ptr->m_shared, &Abstract3DController::colorStyleChanged, this, @@ -220,18 +218,6 @@ void Q3DScatter::setHeight(const int height) QWindow::setHeight(height); } -/*! - * Sets the item \a style to one of the values in \c QDataVis::MeshStyle. It is preset to - * \c QDataVis::MeshStyleSpheres by default. A \a smooth flag can be used to set shading to smooth. - * It is \c false by default. - * - * \sa setMeshFileName() - */ -void Q3DScatter::setObjectType(QDataVis::MeshStyle style, bool smooth) -{ - d_ptr->m_shared->setObjectType(style, smooth); -} - /*! * \property Q3DScatter::theme * @@ -265,25 +251,6 @@ QDataVis::SelectionFlags Q3DScatter::selectionMode() const return d_ptr->m_shared->selectionMode(); } -/*! - * \property Q3DScatter::meshFileName - * - * Override item type with a mesh object located in \a objFileName. - * \note Object needs to be in Wavefront obj format and include vertices, normals and UVs. - * It also needs to be in triangles. - * - * \sa setObjectType() - */ -void Q3DScatter::setMeshFileName(const QString &objFileName) -{ - d_ptr->m_shared->setMeshFileName(objFileName); -} - -QString Q3DScatter::meshFileName() const -{ - return d_ptr->m_shared->meshFileName(); -} - /*! * \property Q3DScatter::scene * diff --git a/src/datavisualization/engine/q3dscatter.h b/src/datavisualization/engine/q3dscatter.h index bec6a647..917b31bc 100644 --- a/src/datavisualization/engine/q3dscatter.h +++ b/src/datavisualization/engine/q3dscatter.h @@ -39,7 +39,6 @@ class QT_DATAVISUALIZATION_EXPORT Q3DScatter : public Q3DWindow Q_OBJECT Q_PROPERTY(QtDataVisualization::QDataVis::SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) Q_PROPERTY(QtDataVisualization::QDataVis::ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged) - Q_PROPERTY(QString meshFileName READ meshFileName WRITE setMeshFileName NOTIFY meshFileNameChanged) Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged) Q_PROPERTY(Q3DScene* scene READ scene) Q_PROPERTY(QtDataVisualization::QDataVis::ColorStyle colorStyle READ colorStyle WRITE setColorStyle NOTIFY colorStyleChanged) @@ -58,14 +57,9 @@ public: void removeSeries(QScatter3DSeries *series); QList seriesList(); - void setObjectType(QDataVis::MeshStyle style, bool smooth = false); - void setTheme(Q3DTheme *theme); Q3DTheme *theme() const; - void setMeshFileName(const QString &objFileName); - QString meshFileName() const; - void setSelectionMode(QDataVis::SelectionFlags mode); QDataVis::SelectionFlags selectionMode() const; @@ -106,7 +100,6 @@ public: signals: void selectionModeChanged(QDataVis::SelectionFlags mode); void shadowQualityChanged(QDataVis::ShadowQuality quality); - void meshFileNameChanged(QString filename); void themeChanged(Q3DTheme* theme); void colorStyleChanged(QDataVis::ColorStyle style); void itemColorChanged(QColor color); diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index 08668dbb..6923f26e 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -35,9 +35,6 @@ Scatter3DController::Scatter3DController(QRect boundRect) m_selectedItem(invalidSelectionIndex()), m_selectedItemSeries(0) { - // Default object type; specific to scatter - setObjectType(QDataVis::MeshStyleSpheres, false); - // Setting a null axis creates a new default axis according to orientation and graph type. // Note: These cannot be set in Abstract3DController constructor, as they will call virtual // functions implemented by subclasses. @@ -197,33 +194,6 @@ void Scatter3DController::handleAxisRangeChangedBySender(QObject *sender) setSelectedItem(m_selectedItem, m_selectedItemSeries); } -void Scatter3DController::setObjectType(QDataVis::MeshStyle style, bool smooth) -{ - QString objFile; - if (style == QDataVis::MeshStyleSpheres) { - if (smooth) - objFile = QStringLiteral(":/defaultMeshes/sphereSmooth"); - else - objFile = QStringLiteral(":/defaultMeshes/sphere"); - } else if (style == QDataVis::MeshStyleDots) { - if (smooth) - objFile = QStringLiteral(":/defaultMeshes/dotSmooth"); - else - objFile = QStringLiteral(":/defaultMeshes/dot"); - } else if (style == QDataVis::MeshStyleBars) { - if (smooth) - objFile = QStringLiteral(":/defaultMeshes/barSmoothFull"); - else - objFile = QStringLiteral(":/defaultMeshes/barFull"); - } else { - objFile = QString(); -#if defined(QT_OPENGL_ES_2) - qWarning("MeshStylePoints is not fully supported on OpenGL ES2"); -#endif - } - Abstract3DController::setMeshFileName(objFile); -} - void Scatter3DController::setSelectionMode(QDataVis::SelectionFlags mode) { // We only support single item selection mode and no selection mode diff --git a/src/datavisualization/engine/scatter3dcontroller_p.h b/src/datavisualization/engine/scatter3dcontroller_p.h index 349b226a..838c8010 100644 --- a/src/datavisualization/engine/scatter3dcontroller_p.h +++ b/src/datavisualization/engine/scatter3dcontroller_p.h @@ -68,9 +68,6 @@ public: void initializeOpenGL(); - // Object type - void setObjectType(QDataVis::MeshStyle style, bool smooth = false); - // Change selection mode void setSelectionMode(QDataVis::SelectionFlags mode); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 24e33ba6..27262c4c 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -66,7 +66,6 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_selectionShader(0), m_backgroundShader(0), m_labelShader(0), - m_dotObj(0), m_backgroundObj(0), m_gridLineObj(0), m_labelObj(0), @@ -86,8 +85,7 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_selectedSeries(0), m_areaSize(QSizeF(0.0, 0.0)), m_dotSizeScale(1.0f), - m_hasHeightAdjustmentChanged(true), - m_drawingPoints(false) + m_hasHeightAdjustmentChanged(true) { initializeOpenGLFunctions(); initializeOpenGL(); @@ -105,7 +103,6 @@ Scatter3DRenderer::~Scatter3DRenderer() delete m_selectionShader; delete m_backgroundShader; delete m_labelShader; - delete m_dotObj; delete m_backgroundObj; delete m_gridLineObj; delete m_labelObj; @@ -284,8 +281,18 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 depthProjectionMatrix; QMatrix4x4 depthProjectionViewMatrix; + // Check if we have any series with points + bool havePointSeries = false; + bool haveMeshSeries = false; + for (int i = 0; i < seriesCount; i++) { + if (m_visibleSeriesList.at(i).mesh() == QAbstract3DSeries::MeshPoint) + havePointSeries = true; + else + haveMeshSeries = true; + } + #if !defined(QT_OPENGL_ES_2) - if (m_drawingPoints) { + if (havePointSeries) { glEnable(GL_POINT_SMOOTH); glEnable(GL_PROGRAM_POINT_SIZE); // Scale points based on shadow quality for shadows, not by zoom level @@ -335,6 +342,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Draw dots to depth buffer for (int series = 0; series < seriesCount; series++) { + ObjectHelper *dotObj = m_visibleSeriesList.at(series).object(); + bool drawingPoints = (m_visibleSeriesList.at(series).mesh() == QAbstract3DSeries::MeshPoint); for (int dot = 0; dot < m_renderingArrays.at(series).size(); dot++) { const ScatterRenderItem &item = m_renderingArrays.at(series).at(dot); if (!item.isVisible()) @@ -344,7 +353,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 MVPMatrix; modelMatrix.translate(item.translation()); - if (!m_drawingPoints) { + if (!drawingPoints) { modelMatrix.scale(modelScaler); // TODO: Remove all references to item size? //modelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler, @@ -356,20 +365,20 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix); - if (m_drawingPoints) { + if (drawingPoints) { m_drawer->drawPoint(m_depthShader); } else { // 1st attribute buffer : vertices glEnableVertexAttribArray(m_depthShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, m_dotObj->vertexBuf()); + glBindBuffer(GL_ARRAY_BUFFER, dotObj->vertexBuf()); glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0); // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_dotObj->elementBuf()); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dotObj->elementBuf()); // Draw the triangles - glDrawElements(GL_TRIANGLES, m_dotObj->indexCount(), GL_UNSIGNED_SHORT, + glDrawElements(GL_TRIANGLES, dotObj->indexCount(), GL_UNSIGNED_SHORT, (void *)0); // Free buffers @@ -409,24 +418,18 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #endif } - if (m_drawingPoints) + if (havePointSeries) glPointSize(m_dotSizeScale * activeCamera->zoomLevel()); // Scale points based on zoom - ShaderHelper *selectionShader = m_selectionShader; + ShaderHelper *pointSelectionShader = m_selectionShader; #else - ShaderHelper *selectionShader; - if (m_drawingPoints) - selectionShader = m_pointShader; - else - selectionShader = m_selectionShader; + ShaderHelper *pointSelectionShader = m_pointShader; #endif + ShaderHelper *selectionShader = m_selectionShader; // Skip selection mode drawing if we have no selection mode if (m_cachedSelectionMode > QDataVis::SelectionNone && SelectOnScene == m_selectionState) { - // Bind selection shader - selectionShader->bind(); - // Draw dots to selection buffer glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer); glEnable(GL_DEPTH_TEST); // Needed, otherwise the depth render buffer is not used @@ -438,7 +441,23 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) int totalArraySize = 0; int dotNo = 0; + // Init previous to opposite of first to ensure we change binding for first series + bool previousDrawingPoints = (m_visibleSeriesList.at(0).mesh() != QAbstract3DSeries::MeshPoint); for (int series = 0; series < seriesCount; series++) { + ObjectHelper *dotObj = m_visibleSeriesList.at(series).object(); + bool drawingPoints = (m_visibleSeriesList.at(series).mesh() == QAbstract3DSeries::MeshPoint); + // Rebind selection shader if it has changed + if (drawingPoints != previousDrawingPoints) { + previousDrawingPoints = drawingPoints; + if (series) // Don't release for first series + selectionShader->release(); + if (drawingPoints) + selectionShader = pointSelectionShader; + else + selectionShader = m_selectionShader; + + selectionShader->bind(); + } arraySize = m_renderingArrays.at(series).size(); totalArraySize += arraySize; @@ -454,7 +473,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 MVPMatrix; modelMatrix.translate(item.translation()); - if (!m_drawingPoints) { + if (!drawingPoints) { modelMatrix.scale(modelScaler); // TODO: Remove all references to item size? //modelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler, @@ -470,20 +489,20 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) selectionShader->setUniformValue(selectionShader->MVP(), MVPMatrix); selectionShader->setUniformValue(selectionShader->color(), dotColor); - if (m_drawingPoints) { + if (drawingPoints) { m_drawer->drawPoint(selectionShader); } else { // 1st attribute buffer : vertices glEnableVertexAttribArray(selectionShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, m_dotObj->vertexBuf()); + glBindBuffer(GL_ARRAY_BUFFER, dotObj->vertexBuf()); glVertexAttribPointer(selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0); // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_dotObj->elementBuf()); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dotObj->elementBuf()); // Draw the triangles - glDrawElements(GL_TRIANGLES, m_dotObj->indexCount(), GL_UNSIGNED_SHORT, + glDrawElements(GL_TRIANGLES, dotObj->indexCount(), GL_UNSIGNED_SHORT, (void *)0); // Free buffers @@ -508,7 +527,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); // Release selection shader - selectionShader->release(); + if (seriesCount) + selectionShader->release(); #if 0 // Use this if you want to see what is being drawn to the framebuffer m_labelShader->bind(); @@ -525,12 +545,15 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #endif } - // Bind dot shader + // Draw dots ShaderHelper *dotShader = 0; GLuint gradientTexture = 0; + bool dotSelectionFound = false; + ScatterRenderItem *selectedItem(0); + int dotNo = 0; - if (!m_drawingPoints) { - // Set default shader + bool previousDrawingPoints = false; + if (haveMeshSeries) { dotShader = m_dotShader; dotShader->bind(); @@ -538,9 +561,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->setUniformValue(dotShader->lightP(), lightPos); dotShader->setUniformValue(dotShader->view(), viewMatrix); dotShader->setUniformValue(dotShader->ambientS(), m_cachedTheme->ambientLightStrength()); - if (m_cachedColorStyle != QDataVis::ColorStyleUniform && !m_drawingPoints) { + if (m_cachedColorStyle != QDataVis::ColorStyleUniform) { if (m_cachedColorStyle == QDataVis::ColorStyleObjectGradient) { - // Round the gradient off a bit to avoid it looping over dotShader->setUniformValue(dotShader->gradientMin(), 0.0f); dotShader->setUniformValue(dotShader->gradientHeight(), 0.5f); } else { @@ -550,24 +572,27 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) gradientTexture = m_objectGradientTexture; } - // Enable texture glEnable(GL_TEXTURE_2D); } else { - // We can use selection shader for points -#if !defined(QT_OPENGL_ES_2) - dotShader = m_selectionShader; -#else - dotShader = m_pointShader; -#endif + dotShader = pointSelectionShader; dotShader->bind(); + previousDrawingPoints = true; } - // Draw dots - bool dotSelectionFound = false; - ScatterRenderItem *selectedItem(0); - int dotNo = 0; - for (int series = 0; series < seriesCount; series++) { + ObjectHelper *dotObj = m_visibleSeriesList.at(series).object(); + bool drawingPoints = (m_visibleSeriesList.at(series).mesh() == QAbstract3DSeries::MeshPoint); + // Rebind selection shader if it has changed + if (drawingPoints != previousDrawingPoints) { + previousDrawingPoints = drawingPoints; + dotShader->release(); + if (drawingPoints) + dotShader = pointSelectionShader; + else + dotShader = m_dotShader; + dotShader->bind(); + } + // TODO: Color per series. Let's just hack it while testing with 2 series QTRD-2557 QVector3D baseColor = Utils::vectorFromColor(m_cachedObjectColor) * (series + 0.25f); QVector3D dotColor = baseColor; @@ -582,7 +607,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 itModelMatrix; modelMatrix.translate(item.translation()); - if (!m_drawingPoints) { + if (!drawingPoints) { modelMatrix.scale(modelScaler); itModelMatrix.scale(modelScaler); // TODO: Remove all references to item size? @@ -599,14 +624,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) MVPMatrix = projectionViewMatrix * modelMatrix; #endif - if (m_cachedColorStyle == QDataVis::ColorStyleUniform || m_drawingPoints) + if (m_cachedColorStyle == QDataVis::ColorStyleUniform || drawingPoints) dotColor = baseColor; else gradientTexture = m_objectGradientTexture; GLfloat lightStrength = m_cachedTheme->lightStrength(); if (m_cachedSelectionMode > QDataVis::SelectionNone && (m_selectedItemTotalIndex == dotNo)) { - if (m_cachedColorStyle == QDataVis::ColorStyleUniform || m_drawingPoints) + if (m_cachedColorStyle == QDataVis::ColorStyleUniform || drawingPoints) dotColor = Utils::vectorFromColor(m_cachedSingleHighlightColor); else gradientTexture = m_singleHighlightGradientTexture; @@ -616,14 +641,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotSelectionFound = true; } - if (!m_drawingPoints) { + if (!drawingPoints) { // Set shader bindings dotShader->setUniformValue(dotShader->model(), modelMatrix); dotShader->setUniformValue(dotShader->nModel(), itModelMatrix.inverted().transposed()); } dotShader->setUniformValue(dotShader->MVP(), MVPMatrix); - if (m_cachedColorStyle == QDataVis::ColorStyleUniform || m_drawingPoints) { + if (m_cachedColorStyle == QDataVis::ColorStyleUniform || drawingPoints) { dotShader->setUniformValue(dotShader->color(), dotColor); } else if (m_cachedColorStyle == QDataVis::ColorStyleRangeGradient) { dotShader->setUniformValue(dotShader->gradientMin(), @@ -631,7 +656,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } #if !defined(QT_OPENGL_ES_2) if (m_cachedShadowQuality > QDataVis::ShadowQualityNone) { - if (!m_drawingPoints) { + if (!drawingPoints) { // Set shadow shader bindings QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; dotShader->setUniformValue(dotShader->shadowQ(), m_shadowQualityToShader); @@ -639,7 +664,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->setUniformValue(dotShader->lightS(), lightStrength / 10.0f); // Draw the object - m_drawer->drawObject(dotShader, m_dotObj, gradientTexture, m_depthTexture); + m_drawer->drawObject(dotShader, dotObj, gradientTexture, m_depthTexture); } else { // Draw the object m_drawer->drawPoint(dotShader); @@ -647,12 +672,11 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } else #endif { - - if (!m_drawingPoints) { + if (!drawingPoints) { // Set shadowless shader bindings dotShader->setUniformValue(dotShader->lightS(), lightStrength); // Draw the object - m_drawer->drawObject(dotShader, m_dotObj, gradientTexture); + m_drawer->drawObject(dotShader, dotObj, gradientTexture); } else { // Draw the object m_drawer->drawPoint(dotShader); @@ -666,10 +690,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->release(); #if !defined(QT_OPENGL_ES_2) - if (m_drawingPoints) { + if (havePointSeries) { glDisable(GL_POINT_SMOOTH); glDisable(GL_PROGRAM_POINT_SIZE); - glEnable(GL_TEXTURE_2D); // Enable texturing for background } #endif @@ -1497,21 +1520,6 @@ void Scatter3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality) #endif } -void Scatter3DRenderer::loadMeshFile() -{ - if (m_dotObj) { - delete m_dotObj; - m_dotObj = 0; - } - if (m_cachedObjFile.isEmpty()) { - m_drawingPoints = true; - } else { - m_drawingPoints = false; - m_dotObj = new ObjectHelper(m_cachedObjFile); - m_dotObj->load(); - } -} - void Scatter3DRenderer::loadBackgroundMesh() { if (m_backgroundObj) @@ -1542,6 +1550,16 @@ void Scatter3DRenderer::updateTextures() m_updateLabels = true; } +void Scatter3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) +{ + // Load full version of meshes that have it available + if (mesh != QAbstract3DSeries::MeshSphere + && mesh != QAbstract3DSeries::MeshMinimal + && mesh != QAbstract3DSeries::MeshPoint) { + fileName.append(QStringLiteral("Full")); + } +} + void Scatter3DRenderer::updateAxisRange(Q3DAbstractAxis::AxisOrientation orientation, float min, float max) { diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 6a0bbbec..104737eb 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -67,7 +67,6 @@ private: ShaderHelper *m_selectionShader; ShaderHelper *m_backgroundShader; ShaderHelper *m_labelShader; - ObjectHelper *m_dotObj; ObjectHelper *m_backgroundObj; ObjectHelper *m_gridLineObj; ObjectHelper *m_labelObj; @@ -89,7 +88,6 @@ private: GLfloat m_dotSizeScale; QVector3D m_translationOffset; bool m_hasHeightAdjustmentChanged; - bool m_drawingPoints; ScatterRenderItem m_dummyRenderItem; QVector m_renderingArrays; @@ -106,12 +104,12 @@ public: protected: virtual void initializeOpenGL(); - virtual void loadMeshFile(); private: virtual void initShaders(const QString &vertexShader, const QString &fragmentShader); virtual void updateShadowQuality(QDataVis::ShadowQuality quality); virtual void updateTextures(); + virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); void drawScene(GLuint defaultFboHandle); void handleResize(); diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp index 53bc97a1..7a4c0a14 100644 --- a/src/datavisualization/engine/seriesrendercache.cpp +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -17,11 +17,17 @@ ****************************************************************************/ #include "seriesrendercache_p.h" +#include "objecthelper_p.h" +#include "abstract3drenderer_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE +const QString smoothString(QStringLiteral("Smooth")); + SeriesRenderCache::SeriesRenderCache() - : m_series(0) + : m_series(0), + m_object(0), + m_mesh(QAbstract3DSeries::MeshCube) { } @@ -29,12 +35,89 @@ SeriesRenderCache::~SeriesRenderCache() { } -void SeriesRenderCache::populate(QAbstract3DSeries *series) +void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer *renderer) { Q_ASSERT(series); - m_series = series; - m_itemLabelFormat = series->itemLabelFormat(); + bool seriesChanged = false; + + if (m_series != series) { + m_series = series; + seriesChanged = true; + } + + QAbstract3DSeriesChangeBitField &changeTracker = series->d_ptr->m_changeTracker; + + if (seriesChanged || changeTracker.itemLabelFormatChanged) { + m_itemLabelFormat = series->itemLabelFormat(); + changeTracker.itemLabelFormatChanged = false; + } + + if (seriesChanged || changeTracker.meshChanged || changeTracker.meshSmoothChanged + || changeTracker.userDefinedMeshChanged) { + m_mesh = series->mesh(); + changeTracker.meshChanged = false; + changeTracker.meshSmoothChanged = false; + changeTracker.userDefinedMeshChanged = false; + + QString meshFileName; + + // Compose mesh filename + if (m_mesh == QAbstract3DSeries::MeshUserDefined) { + // Always use the supplied mesh directly + meshFileName = series->userDefinedMesh(); + } else { + switch (m_mesh) { + case QAbstract3DSeries::MeshBar: + case QAbstract3DSeries::MeshCube: + meshFileName = QStringLiteral(":/defaultMeshes/bar"); + break; + case QAbstract3DSeries::MeshPyramid: + meshFileName = QStringLiteral(":/defaultMeshes/pyramid"); + break; + case QAbstract3DSeries::MeshCone: + meshFileName = QStringLiteral(":/defaultMeshes/cone"); + break; + case QAbstract3DSeries::MeshCylinder: + meshFileName = QStringLiteral(":/defaultMeshes/cylinder"); + break; + case QAbstract3DSeries::MeshBevelBar: + case QAbstract3DSeries::MeshBevelCube: + meshFileName = QStringLiteral(":/defaultMeshes/bevelbar"); + break; + case QAbstract3DSeries::MeshSphere: + meshFileName = QStringLiteral(":/defaultMeshes/sphere"); + break; + case QAbstract3DSeries::MeshMinimal: + meshFileName = QStringLiteral(":/defaultMeshes/minimal"); + break; + case QAbstract3DSeries::MeshPoint: +#if defined(QT_OPENGL_ES_2) + qWarning("QAbstract3DSeries::MeshPoint is not fully supported on OpenGL ES2"); +#endif + break; + default: + // Default to cube + meshFileName = QStringLiteral(":/defaultMeshes/bar"); + break; + } + + if (series->isMeshSmooth() && m_mesh != QAbstract3DSeries::MeshPoint) + meshFileName += smoothString; + + // Give renderer an opportunity to customize the mesh + renderer->fixMeshFileName(meshFileName, m_mesh); + } + + // TODO: Optimize by having some kind of object cache in renderer instead of having separate ObjectHelper for each series? + delete m_object; + if (meshFileName.isEmpty()) { + m_object = 0; + } else { + m_object = new ObjectHelper(meshFileName); + m_object->load(); + } + } // TODO: Add other visual element extractions } diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h index 34b1d97d..976b69c3 100644 --- a/src/datavisualization/engine/seriesrendercache_p.h +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -34,27 +34,35 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE +class Abstract3DRenderer; +class ObjectHelper; + class SeriesRenderCache { public: SeriesRenderCache(); virtual ~SeriesRenderCache(); - void populate(QAbstract3DSeries *series); - - inline const QString &itemLabelFormat() const { return m_itemLabelFormat; } + void populate(QAbstract3DSeries *series, Abstract3DRenderer *renderer); // NOTE: Series pointer can only be used to access the series when syncing with controller. // It is not guaranteed to be valid while rendering and should only be used as an identifier. inline QAbstract3DSeries *series() const { return m_series; } + inline const QString &itemLabelFormat() const { return m_itemLabelFormat; } + inline const QAbstract3DSeries::Mesh &mesh() const { return m_mesh; } + inline ObjectHelper *object() const { return m_object; } + // TODO: Add other visual elements protected: - QString m_itemLabelFormat; QAbstract3DSeries *m_series; + QString m_itemLabelFormat; + ObjectHelper *m_object; + QAbstract3DSeries::Mesh m_mesh; }; QT_DATAVISUALIZATION_END_NAMESPACE #endif + diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index df4a12f0..b0df81d1 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1940,12 +1940,6 @@ QString Surface3DRenderer::createSelectionLabel(float value, int column, int row return labelText; } -void Surface3DRenderer::loadMeshFile() -{ - // Do nothing, not yet supported by this renderer - // TODO: To be used for overriding the selection ball mesh after technology preview -} - void Surface3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality) { m_cachedShadowQuality = quality; diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 9c1be32b..ce49cf13 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -147,7 +147,6 @@ public: protected: void initializeOpenGL(); - virtual void loadMeshFile(); signals: void pointClicked(QPoint position, QSurface3DSeries *series); diff --git a/src/datavisualization/global/qdatavisualizationenums.h b/src/datavisualization/global/qdatavisualizationenums.h index a3773d0b..712ae38d 100644 --- a/src/datavisualization/global/qdatavisualizationenums.h +++ b/src/datavisualization/global/qdatavisualizationenums.h @@ -28,7 +28,6 @@ namespace QtDataVisualization { class QT_DATAVISUALIZATION_EXPORT QDataVis : public QObject { Q_OBJECT - Q_ENUMS(MeshStyle) Q_ENUMS(CameraPreset) Q_ENUMS(Theme) Q_ENUMS(ShadowQuality) @@ -47,19 +46,6 @@ public: InputStateOnPinch }; - // TODO: Move to series (QTRD-2557) - enum MeshStyle { - MeshStyleBars = 0, - MeshStyleCubes = MeshStyleBars, - MeshStylePyramids, - MeshStyleCones, - MeshStyleCylinders, - MeshStyleBevelBars, - MeshStyleSpheres, - MeshStyleDots, - MeshStylePoints - }; - // TODO: Move to camera (QTRD-2505) enum CameraPreset { CameraPresetNone = -1, diff --git a/src/datavisualization/global/qtdatavisualizationenums.qdoc b/src/datavisualization/global/qtdatavisualizationenums.qdoc index 42b6e8ad..cb285397 100644 --- a/src/datavisualization/global/qtdatavisualizationenums.qdoc +++ b/src/datavisualization/global/qtdatavisualizationenums.qdoc @@ -55,30 +55,6 @@ Pinch/punch multitouch input received. */ -/*! - \enum QtDataVisualization::QDataVis::MeshStyle - - Predefined mesh types. All styles are not usable with all visualization types. - - \value MeshStyleBars - Basic cubic bar. Usable only with Q3DBars. - \value MeshStylePyramids - Four-sided pyramid. Usable only with Q3DBars. - \value MeshStyleCones - Basic cone. Usable only with Q3DBars. - \value MeshStyleCylinders - Basic cylinder. Usable only with Q3DBars. - \value MeshStyleBevelBars - Slightly beveled (rounded) cubic bar. Usable only with Q3DBars. - \value MeshStyleSpheres - Sphere. Usable only with Q3DScatter. - \value MeshStyleDots - Triangular pyramid. Usable only with Q3DScatter. - \value MeshStylePoints - 2D spots. Usable only with Q3DScatter. - \b Note: Shadows and color gradients do not affect this style. -*/ - /*! \enum QtDataVisualization::QDataVis::CameraPreset diff --git a/src/datavisualization/theme/q3dtheme.h b/src/datavisualization/theme/q3dtheme.h index db044826..ea6e0a4b 100644 --- a/src/datavisualization/theme/q3dtheme.h +++ b/src/datavisualization/theme/q3dtheme.h @@ -160,6 +160,7 @@ protected: friend class ThemeManager; friend class Abstract3DRenderer; + friend class Bars3DController; private: Q_DISABLE_COPY(Q3DTheme) diff --git a/src/datavisualization/utils/objecthelper.cpp b/src/datavisualization/utils/objecthelper.cpp index 9660c215..180ce009 100644 --- a/src/datavisualization/utils/objecthelper.cpp +++ b/src/datavisualization/utils/objecthelper.cpp @@ -57,8 +57,6 @@ void ObjectHelper::load() if (!loadOk) qFatal("loading failed"); - //qDebug() << "vertex count" << vertices.size();; - // Index vertices QVector indices; QVector indexed_vertices; @@ -68,7 +66,6 @@ void ObjectHelper::load() indexed_normals); m_indexCount = indices.size(); - //qDebug() << "index count" << m_indexCount; glGenBuffers(1, &m_vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, m_vertexbuffer); diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp index ab08765e..91b338bd 100644 --- a/src/datavisualizationqml2/declarativebars.cpp +++ b/src/datavisualizationqml2/declarativebars.cpp @@ -23,8 +23,6 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE -const QString smoothString(QStringLiteral("Smooth")); - DeclarativeBars::DeclarativeBars(QQuickItem *parent) : AbstractDeclarative(parent), m_shared(0), @@ -40,8 +38,6 @@ DeclarativeBars::DeclarativeBars(QQuickItem *parent) // Create the shared component on the main GUI thread. m_shared = new Bars3DController(boundingRect().toRect()); AbstractDeclarative::setSharedController(m_shared); - QObject::connect(m_shared, &Abstract3DController::meshFileNameChanged, this, - &DeclarativeBars::meshFileNameChanged); } DeclarativeBars::~DeclarativeBars() @@ -146,55 +142,6 @@ bool DeclarativeBars::isBarSpacingRelative() const return m_shared->isBarSpecRelative(); } -void DeclarativeBars::setBarType(QDataVis::MeshStyle style) -{ - QString objFile = m_shared->meshFileName(); - bool smooth = objFile.endsWith(smoothString); - m_shared->setBarType(style, smooth); -} - -QDataVis::MeshStyle DeclarativeBars::barType() const -{ - QString objFile = m_shared->meshFileName(); - if (objFile.contains("/sphere")) - return QDataVis::MeshStyleSpheres; - else - return QDataVis::MeshStyleDots; -} - -void DeclarativeBars::setBarSmoothingEnabled(bool enabled) -{ - QString objFile = m_shared->meshFileName(); - if (objFile.endsWith(smoothString)) { - if (enabled) - return; // Already smooth; do nothing - else // Rip Smooth off the end - objFile.resize(objFile.indexOf(smoothString)); - } else { - if (!enabled) // Already flat; do nothing - return; - else // Append Smooth to the end - objFile.append(smoothString); - } - m_shared->setMeshFileName(objFile); -} - -bool DeclarativeBars::isBarSmoothingEnabled() const -{ - QString objFile = m_shared->meshFileName(); - return objFile.endsWith(smoothString); -} - -void DeclarativeBars::setMeshFileName(const QString &objFileName) -{ - m_shared->setMeshFileName(objFileName); -} - -QString DeclarativeBars::meshFileName() const -{ - return m_shared->meshFileName(); -} - QQmlListProperty DeclarativeBars::seriesList() { return QQmlListProperty(this, this, diff --git a/src/datavisualizationqml2/declarativebars_p.h b/src/datavisualizationqml2/declarativebars_p.h index 041be418..6db17788 100644 --- a/src/datavisualizationqml2/declarativebars_p.h +++ b/src/datavisualizationqml2/declarativebars_p.h @@ -51,12 +51,9 @@ class DeclarativeBars : public AbstractDeclarative Q_PROPERTY(Q3DCategoryAxis *rowAxis READ rowAxis WRITE setRowAxis) Q_PROPERTY(Q3DValueAxis *valueAxis READ valueAxis WRITE setValueAxis) Q_PROPERTY(Q3DCategoryAxis *columnAxis READ columnAxis WRITE setColumnAxis) - Q_PROPERTY(QtDataVisualization::QDataVis::MeshStyle barType READ barType WRITE setBarType NOTIFY meshFileNameChanged) Q_PROPERTY(float barThickness READ barThickness WRITE setBarThickness NOTIFY barThicknessChanged) Q_PROPERTY(QSizeF barSpacing READ barSpacing WRITE setBarSpacing NOTIFY barSpacingChanged) Q_PROPERTY(bool barSpacingRelative READ isBarSpacingRelative WRITE setBarSpacingRelative NOTIFY barSpacingRelativeChanged) - Q_PROPERTY(bool barSmoothingEnabled READ isBarSmoothingEnabled WRITE setBarSmoothingEnabled NOTIFY meshFileNameChanged) - Q_PROPERTY(QString meshFileName READ meshFileName WRITE setMeshFileName NOTIFY meshFileNameChanged) Q_PROPERTY(QQmlListProperty seriesList READ seriesList) Q_CLASSINFO("DefaultProperty", "seriesList") @@ -82,15 +79,6 @@ public: void setBarSpacingRelative(bool relative); bool isBarSpacingRelative() const; - void setBarType(QDataVis::MeshStyle style); - QDataVis::MeshStyle barType() const; - - void setBarSmoothingEnabled(bool enabled); - bool isBarSmoothingEnabled() const; - - void setMeshFileName(const QString &objFileName); - QString meshFileName() const; - QQmlListProperty seriesList(); static void appendSeriesFunc(QQmlListProperty *list, QBar3DSeries *series); static int countSeriesFunc(QQmlListProperty *list); diff --git a/src/datavisualizationqml2/declarativescatter.cpp b/src/datavisualizationqml2/declarativescatter.cpp index 7efcf8a6..2848997f 100644 --- a/src/datavisualizationqml2/declarativescatter.cpp +++ b/src/datavisualizationqml2/declarativescatter.cpp @@ -22,8 +22,6 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE -const QString smoothString(QStringLiteral("Smooth")); - DeclarativeScatter::DeclarativeScatter(QQuickItem *parent) : AbstractDeclarative(parent), m_shared(0), @@ -39,9 +37,6 @@ DeclarativeScatter::DeclarativeScatter(QQuickItem *parent) // Create the shared component on the main GUI thread. m_shared = new Scatter3DController(boundingRect().toRect()); setSharedController(m_shared); - - QObject::connect(m_shared, &Abstract3DController::meshFileNameChanged, this, - &DeclarativeScatter::meshFileNameChanged); } DeclarativeScatter::~DeclarativeScatter() @@ -72,11 +67,6 @@ QSGNode *DeclarativeScatter::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDa return node; } -void DeclarativeScatter::setObjectColor(const QColor &baseColor) -{ - m_shared->setBaseColor(baseColor); -} - Q3DValueAxis *DeclarativeScatter::axisX() const { return static_cast(m_shared->axisX()); @@ -107,55 +97,6 @@ void DeclarativeScatter::setAxisZ(Q3DValueAxis *axis) m_shared->setAxisZ(axis); } -void DeclarativeScatter::setObjectType(QDataVis::MeshStyle style) -{ - QString objFile = m_shared->meshFileName(); - bool smooth = objFile.endsWith(smoothString); - m_shared->setObjectType(style, smooth); -} - -QDataVis::MeshStyle DeclarativeScatter::objectType() const -{ - QString objFile = m_shared->meshFileName(); - if (objFile.contains("/sphere")) - return QDataVis::MeshStyleSpheres; - else - return QDataVis::MeshStyleDots; -} - -void DeclarativeScatter::setObjectSmoothingEnabled(bool enabled) -{ - QString objFile = m_shared->meshFileName(); - if (objFile.endsWith(smoothString)) { - if (enabled) - return; // Already smooth; do nothing - else // Rip Smooth off the end - objFile.resize(objFile.indexOf(smoothString)); - } else { - if (!enabled) // Already flat; do nothing - return; - else // Append Smooth to the end - objFile.append(smoothString); - } - m_shared->setMeshFileName(objFile); -} - -bool DeclarativeScatter::isObjectSmoothingEnabled() const -{ - QString objFile = m_shared->meshFileName(); - return objFile.endsWith(smoothString); -} - -void DeclarativeScatter::setMeshFileName(const QString &objFileName) -{ - m_shared->setMeshFileName(objFileName); -} - -QString DeclarativeScatter::meshFileName() const -{ - return m_shared->meshFileName(); -} - QQmlListProperty DeclarativeScatter::seriesList() { return QQmlListProperty(this, this, diff --git a/src/datavisualizationqml2/declarativescatter_p.h b/src/datavisualizationqml2/declarativescatter_p.h index d42c3b23..7490deda 100644 --- a/src/datavisualizationqml2/declarativescatter_p.h +++ b/src/datavisualizationqml2/declarativescatter_p.h @@ -49,9 +49,6 @@ class DeclarativeScatter : public AbstractDeclarative 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(QtDataVisualization::QDataVis::MeshStyle objectType READ objectType WRITE setObjectType NOTIFY meshFileNameChanged) - Q_PROPERTY(bool objectSmoothingEnabled READ isObjectSmoothingEnabled WRITE setObjectSmoothingEnabled NOTIFY meshFileNameChanged) - Q_PROPERTY(QString meshFileName READ meshFileName WRITE setMeshFileName NOTIFY meshFileNameChanged) Q_PROPERTY(QQmlListProperty seriesList READ seriesList) Q_CLASSINFO("DefaultProperty", "seriesList") @@ -59,8 +56,6 @@ public: explicit DeclarativeScatter(QQuickItem *parent = 0); ~DeclarativeScatter(); - Q_INVOKABLE void setObjectColor(const QColor &baseColor); // TODO property (or more likely as part of data set) - Q3DValueAxis *axisX() const; void setAxisX(Q3DValueAxis *axis); Q3DValueAxis *axisY() const; @@ -68,15 +63,6 @@ public: Q3DValueAxis *axisZ() const; void setAxisZ(Q3DValueAxis *axis); - void setObjectType(QDataVis::MeshStyle style); - QDataVis::MeshStyle objectType() const; - - void setObjectSmoothingEnabled(bool enabled); - bool isObjectSmoothingEnabled() const; - - void setMeshFileName(const QString &objFileName); - QString meshFileName() const; - QQmlListProperty seriesList(); static void appendSeriesFunc(QQmlListProperty *list, QScatter3DSeries *series); static int countSeriesFunc(QQmlListProperty *list); diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index 546204ce..cd7098ff 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -466,34 +466,44 @@ void GraphModifier::changeStyle() static int model = 0; switch (model) { case 0: - m_graph->setBarType(QDataVis::MeshStyleCylinders, false); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshCylinder); + m_graph->seriesList().at(0)->setMeshSmooth(false); break; case 1: - m_graph->setBarType(QDataVis::MeshStyleCylinders, true); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshCylinder); + m_graph->seriesList().at(0)->setMeshSmooth(true); break; case 2: - m_graph->setBarType(QDataVis::MeshStyleCones, false); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshCone); + m_graph->seriesList().at(0)->setMeshSmooth(false); break; case 3: - m_graph->setBarType(QDataVis::MeshStyleCones, true); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshCone); + m_graph->seriesList().at(0)->setMeshSmooth(true); break; case 4: - m_graph->setBarType(QDataVis::MeshStyleBars, false); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshBar); + m_graph->seriesList().at(0)->setMeshSmooth(false); break; case 5: - m_graph->setBarType(QDataVis::MeshStyleBars, true); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshBar); + m_graph->seriesList().at(0)->setMeshSmooth(true); break; case 6: - m_graph->setBarType(QDataVis::MeshStylePyramids, false); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshPyramid); + m_graph->seriesList().at(0)->setMeshSmooth(false); break; case 7: - m_graph->setBarType(QDataVis::MeshStylePyramids, true); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshPyramid); + m_graph->seriesList().at(0)->setMeshSmooth(true); break; case 8: - m_graph->setBarType(QDataVis::MeshStyleBevelBars, false); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshBevelBar); + m_graph->seriesList().at(0)->setMeshSmooth(false); break; case 9: - m_graph->setBarType(QDataVis::MeshStyleBevelBars, true); + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshBevelBar); + m_graph->seriesList().at(0)->setMeshSmooth(true); break; } model++; diff --git a/tests/kinectsurface/surfacedata.cpp b/tests/kinectsurface/surfacedata.cpp index 79489fc8..e48a4b58 100644 --- a/tests/kinectsurface/surfacedata.cpp +++ b/tests/kinectsurface/surfacedata.cpp @@ -59,7 +59,7 @@ SurfaceData::SurfaceData(Q3DSurface *surface, Q3DScatter *scatter, Q3DBars *bars m_scatter->setTheme(QDataVis::ThemeStoneMoss); m_scatter->setSelectionMode(QDataVis::SelectionNone); m_scatter->setGridVisible(false); - m_scatter->setObjectType(QDataVis::MeshStyleDots, false); + m_scatter->setObjectType(QDataVis::MeshDots, false); m_scatter->setShadowQuality(QDataVis::ShadowQualitySoftLow); m_scatter->setCameraPosition(0.0, 85.0, 110); m_scatter->axisY()->setMin(-128); @@ -73,7 +73,7 @@ SurfaceData::SurfaceData(Q3DSurface *surface, Q3DScatter *scatter, Q3DBars *bars m_bars->setTheme(QDataVis::ThemeQt); m_bars->setSelectionMode(QDataVis::SelectionModeNone); m_bars->setGridVisible(false); - m_bars->setBarType(QDataVis::MeshStyleBars, true); + m_bars->setBarType(QDataVis::MeshBars, true); #if 1 m_bars->setShadowQuality(QDataVis::ShadowQualityLow); #else @@ -98,7 +98,7 @@ SurfaceData::~SurfaceData() delete m_scatter; delete m_bars; delete m_surface; - } else if (m_mode == MeshStyleBars) { + } else if (m_mode == MeshBars) { delete m_scatter; delete m_surface; delete m_bars; @@ -201,7 +201,7 @@ void SurfaceData::setResolution(int selection) m_scatter->axisZ()->setMax(m_resolution.height() / 2); m_scatterDataArray = new QScatterDataArray; m_scatterDataArray->resize(m_resolution.width() * m_resolution.height()); - } else if (m_mode == MeshStyleBars) { + } else if (m_mode == MeshBars) { m_resize = true; m_resolution /= 4; m_barDataArray = new QBarDataArray; diff --git a/tests/kinectsurface/surfacedata.h b/tests/kinectsurface/surfacedata.h index 0bf753cd..fcae03b4 100644 --- a/tests/kinectsurface/surfacedata.h +++ b/tests/kinectsurface/surfacedata.h @@ -55,7 +55,7 @@ public: enum VisualizationMode { Surface = 0, Scatter, - MeshStyleBars + MeshBars }; public slots: diff --git a/tests/multigraphs/data.cpp b/tests/multigraphs/data.cpp index d2fe1051..53236e39 100644 --- a/tests/multigraphs/data.cpp +++ b/tests/multigraphs/data.cpp @@ -64,7 +64,7 @@ Data::Data(Q3DSurface *surface, Q3DScatter *scatter, Q3DBars *bars, m_scatter->setTheme(new Q3DTheme(QDataVis::ThemeStoneMoss)); m_scatter->setSelectionMode(QDataVis::SelectionNone); m_scatter->theme()->setGridEnabled(false); - m_scatter->setObjectType(QDataVis::MeshStylePoints); + m_scatter->setObjectType(QDataVis::MeshPoint); m_scatter->setShadowQuality(QDataVis::ShadowQualitySoftLow); m_scatter->scene()->activeCamera()->setCameraPosition(0.0, 85.0, 150); m_scatter->addSeries(new QScatter3DSeries); @@ -73,7 +73,7 @@ Data::Data(Q3DSurface *surface, Q3DScatter *scatter, Q3DBars *bars, m_bars->setTheme(new Q3DTheme(QDataVis::ThemeQt)); m_bars->setSelectionMode(QDataVis::SelectionItemAndRow | QDataVis::SelectionSlice); m_bars->theme()->setGridEnabled(false); - m_bars->setBarType(QDataVis::MeshStyleBars, false); + m_bars->setBarType(QDataVis::MeshBar, false); m_bars->setShadowQuality(QDataVis::ShadowQualityLow); m_bars->setBarSpacing(QSizeF(0.0, 0.0)); m_bars->scene()->activeCamera()->setCameraPosition(0.0, 75.0, 150); diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index 5f43b486..f0cf362f 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -41,7 +41,6 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) QFont font = m_chart->theme()->font(); font.setPointSize(m_fontSize); m_chart->theme()->setFont(font); - m_chart->setObjectType(QDataVis::MeshStyleSpheres, true); m_chart->setShadowQuality(QDataVis::ShadowQualityNone); m_chart->scene()->activeCamera()->setCameraPreset(QDataVis::CameraPresetFront); m_chart->setAxisX(new Q3DValueAxis); @@ -110,27 +109,42 @@ void ScatterDataModifier::addData() void ScatterDataModifier::changeStyle() { - static int model = 0; - switch (model) { - case 0: - m_chart->setObjectType(QDataVis::MeshStyleDots, false); - break; - case 1: - m_chart->setObjectType(QDataVis::MeshStyleDots, true); - break; - case 2: - m_chart->setObjectType(QDataVis::MeshStyleSpheres, false); - break; - case 3: - m_chart->setObjectType(QDataVis::MeshStyleSpheres, true); - break; - case 4: - m_chart->setObjectType(QDataVis::MeshStylePoints); - break; + if (!m_targetSeries) + createAndAddSeries(); + + if (m_targetSeries->isMeshSmooth()) { + m_targetSeries->setMeshSmooth(false); + switch (m_targetSeries->mesh()) { + case QAbstract3DSeries::MeshCube: + m_targetSeries->setMesh(QAbstract3DSeries::MeshPyramid); + break; + case QAbstract3DSeries::MeshPyramid: + m_targetSeries->setMesh(QAbstract3DSeries::MeshCone); + break; + case QAbstract3DSeries::MeshCone: + m_targetSeries->setMesh(QAbstract3DSeries::MeshCylinder); + break; + case QAbstract3DSeries::MeshCylinder: + m_targetSeries->setMesh(QAbstract3DSeries::MeshBevelCube); + break; + case QAbstract3DSeries::MeshBevelCube: + m_targetSeries->setMesh(QAbstract3DSeries::MeshSphere); + break; + case QAbstract3DSeries::MeshSphere: + m_targetSeries->setMesh(QAbstract3DSeries::MeshMinimal); + break; + case QAbstract3DSeries::MeshMinimal: + m_targetSeries->setMesh(QAbstract3DSeries::MeshPoint); + break; + default: + m_targetSeries->setMesh(QAbstract3DSeries::MeshCube); + break; + } + } else { + m_targetSeries->setMeshSmooth(true); } - model++; - if (model > 4) - model = 0; + + qDebug() << __FUNCTION__ << m_targetSeries->mesh() << m_targetSeries->isMeshSmooth(); } void ScatterDataModifier::changePresetCamera() @@ -478,6 +492,8 @@ QScatter3DSeries *ScatterDataModifier::createAndAddSeries() m_chart->addSeries(series); series->setItemLabelFormat(QString("%1: @xLabel - @yLabel - @zLabel").arg(counter++)); + series->setMesh(QAbstract3DSeries::MeshSphere); + series->setMeshSmooth(true); QObject::connect(series, &QScatter3DSeries::selectedItemChanged, this, &ScatterDataModifier::handleSelectionChange); diff --git a/tests/spectrum/spectrumapp/main.cpp b/tests/spectrum/spectrumapp/main.cpp index 7277d752..8d954dc9 100644 --- a/tests/spectrum/spectrumapp/main.cpp +++ b/tests/spectrum/spectrumapp/main.cpp @@ -85,7 +85,7 @@ MainApp::MainApp(Q3DBars *window) m_chart->setBarThickness(1.25); m_chart->setBarSpacing(QSizeF(0.2, -0.75)); // Set bar type, smooth cones - m_chart->setBarType(QDataVis::MeshStyleCones, true); + m_chart->setBarType(QDataVis::MeshCones, true); // Adjust zoom manually; automatic zoom level calculation does not work well with negative // spacings (in setBarSpacing) m_chart->setCameraPosition(10.0f, 5.0f, 70.0f); @@ -94,7 +94,7 @@ MainApp::MainApp(Q3DBars *window) m_chart->setBarThickness(2.0f); m_chart->setBarSpacing(QSizeF(0.0, 0.0)); // Set bar type, flat bars - m_chart->setBarType(QDataVis::MeshStyleBars, false); + m_chart->setBarType(QDataVis::MeshBar, false); // Adjust camera position m_chart->scene()->activeCamera()->setCameraPosition(10.0f, 7.5f, 75.0f); #endif -- cgit v1.2.3