Add support for MeshUserDefined

Fixes: QTBUG-114135
Change-Id: I56ed1a7a64673b0804b23e7f610d6c5be19013b0
Reviewed-by: Dilek Akcay <dilek.akcay@qt.io>
Reviewed-by: Sami Varanka <sami.varanka@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
This commit is contained in:
Tomi Korpipaa 2023-06-01 13:36:23 +03:00
parent 6e7221b64e
commit cbd5aaf638
9 changed files with 54 additions and 29 deletions

View File

@ -57,6 +57,7 @@ set(widgetgraphgallery_resource_files
"data/oilrig.mesh" "data/oilrig.mesh"
"data/pipe.mesh" "data/pipe.mesh"
"data/refinery.mesh" "data/refinery.mesh"
"data/narrowarrow.mesh"
"data/maptexture.jpg" "data/maptexture.jpg"
"data/topography.png" "data/topography.png"
) )

View File

@ -65,6 +65,7 @@ void BarGraph::initialize()
barStyleList->addItem(u"Cylinder"_s, QAbstract3DSeries::MeshCylinder); barStyleList->addItem(u"Cylinder"_s, QAbstract3DSeries::MeshCylinder);
barStyleList->addItem(u"Bevel bar"_s, QAbstract3DSeries::MeshBevelBar); barStyleList->addItem(u"Bevel bar"_s, QAbstract3DSeries::MeshBevelBar);
barStyleList->addItem(u"Sphere"_s, QAbstract3DSeries::MeshSphere); barStyleList->addItem(u"Sphere"_s, QAbstract3DSeries::MeshSphere);
barStyleList->addItem(u"UserDefined"_s, QAbstract3DSeries::MeshUserDefined);
barStyleList->setCurrentIndex(4); barStyleList->setCurrentIndex(4);
QPushButton *cameraButton = new QPushButton(m_barsWidget); QPushButton *cameraButton = new QPushButton(m_barsWidget);

View File

@ -201,6 +201,11 @@ void GraphModifier::changeStyle(int style)
m_primarySeries->setMesh(m_barMesh); m_primarySeries->setMesh(m_barMesh);
m_secondarySeries->setMesh(m_barMesh); m_secondarySeries->setMesh(m_barMesh);
m_customData->customSeries()->setMesh(m_barMesh); m_customData->customSeries()->setMesh(m_barMesh);
if (m_barMesh == QAbstract3DSeries::MeshUserDefined) {
m_primarySeries->setUserDefinedMesh(":/data/narrowarrow.mesh");
m_secondarySeries->setUserDefinedMesh(":/data/narrowarrow.mesh");
m_customData->customSeries()->setUserDefinedMesh(":/data/narrowarrow.mesh");
}
} }
} }

View File

@ -7,6 +7,7 @@
<file>data/refinery.mesh</file> <file>data/refinery.mesh</file>
<file>data/oilrig.mesh</file> <file>data/oilrig.mesh</file>
<file>data/pipe.mesh</file> <file>data/pipe.mesh</file>
<file>data/narrowarrow.mesh</file>
<file>data/maptexture.jpg</file> <file>data/maptexture.jpg</file>
<file>data/topography.png</file> <file>data/topography.png</file>
</qresource> </qresource>

View File

@ -651,14 +651,12 @@ void QQuickGraphsBars::handleAxisZChanged(QAbstract3DAxis *axis)
void QQuickGraphsBars::handleSeriesMeshChanged(QAbstract3DSeries::Mesh mesh) void QQuickGraphsBars::handleSeriesMeshChanged(QAbstract3DSeries::Mesh mesh)
{ {
QList<QBar3DSeries *> barSeriesList = m_barsController->barSeriesList();
m_meshType = mesh; m_meshType = mesh;
removeBarModels(); removeBarModels();
} }
void QQuickGraphsBars::handleMeshSmoothChanged(bool enable) void QQuickGraphsBars::handleMeshSmoothChanged(bool enable)
{ {
QList<QBar3DSeries *> barSeriesList = m_barsController->barSeriesList();
m_smooth = enable; m_smooth = enable;
removeBarModels(); removeBarModels();
} }
@ -740,7 +738,7 @@ void QQuickGraphsBars::generateBars(QList<QBar3DSeries *> &barSeriesList)
for (int i = 0; i < dataColCount; i++) { for (int i = 0; i < dataColCount; i++) {
QBarDataItem *dataItem = const_cast <QBarDataItem *> (&(dataRow->at(i))); QBarDataItem *dataItem = const_cast <QBarDataItem *> (&(dataRow->at(i)));
auto scene = QQuick3DViewport::scene(); auto scene = QQuick3DViewport::scene();
QQuick3DModel *model = createDataItem(scene); QQuick3DModel *model = createDataItem(scene, barSeries);
model->setVisible(visible); model->setVisible(visible);
BarModel *barModel = new BarModel(); BarModel *barModel = new BarModel();
@ -769,7 +767,7 @@ void QQuickGraphsBars::generateBars(QList<QBar3DSeries *> &barSeriesList)
} }
if (barInstancing->model == nullptr) { if (barInstancing->model == nullptr) {
barInstancing->model = createDataItem(scene); barInstancing->model = createDataItem(scene, barSeries);
barInstancing->model->setInstancing(barInstancing->instancing); barInstancing->model->setInstancing(barInstancing->instancing);
barInstancing->model->setVisible(visible); barInstancing->model->setVisible(visible);
barInstancing->model->setPickable(true); barInstancing->model->setPickable(true);
@ -791,21 +789,23 @@ void QQuickGraphsBars::generateBars(QList<QBar3DSeries *> &barSeriesList)
} }
} }
QQuick3DModel *QQuickGraphsBars::createDataItem(QQuick3DNode *scene) QQuick3DModel *QQuickGraphsBars::createDataItem(QQuick3DNode *scene, QAbstract3DSeries *series)
{ {
auto model = new QQuick3DModel(); auto model = new QQuick3DModel();
model->setParent(scene); model->setParent(scene);
model->setParentItem(scene); model->setParentItem(scene);
model->setObjectName(QStringLiteral("BarModel")); model->setObjectName(QStringLiteral("BarModel"));
QString fileName = getMeshFileName(); QString fileName = getMeshFileName();
if (fileName.isEmpty())
fileName = series->userDefinedMesh();
model->setSource(QUrl(fileName)); model->setSource(QUrl(fileName));
return model; return model;
} }
QString QQuickGraphsBars::getMeshFileName() QString QQuickGraphsBars::getMeshFileName()
{ {
QString fileName; QString fileName = {};
QString smoothString = QStringLiteral("Smooth");
switch (m_meshType) { switch (m_meshType) {
case QAbstract3DSeries::MeshSphere: case QAbstract3DSeries::MeshSphere:
fileName = QStringLiteral("defaultMeshes/sphereMesh"); fileName = QStringLiteral("defaultMeshes/sphereMesh");
@ -827,11 +827,11 @@ QString QQuickGraphsBars::getMeshFileName()
case QAbstract3DSeries::MeshBevelCube: case QAbstract3DSeries::MeshBevelCube:
fileName = QStringLiteral("defaultMeshes/bevelBarMesh"); fileName = QStringLiteral("defaultMeshes/bevelBarMesh");
break; break;
case QAbstract3DSeries::MeshUserDefined:
break;
default: default:
fileName = QStringLiteral("defaultMeshes/sphereMesh"); fileName = QStringLiteral("defaultMeshes/sphereMesh");
} }
if (m_smooth && m_meshType != QAbstract3DSeries::MeshPoint)
fileName += smoothString;
fixMeshFileName(fileName, m_meshType); fixMeshFileName(fileName, m_meshType);
@ -840,8 +840,17 @@ QString QQuickGraphsBars::getMeshFileName()
void QQuickGraphsBars::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh meshType) void QQuickGraphsBars::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh meshType)
{ {
// Should it be smooth?
if (m_smooth && meshType != QAbstract3DSeries::MeshPoint
&& meshType != QAbstract3DSeries::MeshUserDefined) {
fileName += QStringLiteral("Smooth");
}
// Should it be filled?
if (!m_barsController->activeTheme()->isBackgroundEnabled() if (!m_barsController->activeTheme()->isBackgroundEnabled()
&& meshType != QAbstract3DSeries::MeshSphere) { && meshType != QAbstract3DSeries::MeshSphere
&& meshType != QAbstract3DSeries::MeshPoint
&& meshType != QAbstract3DSeries::MeshUserDefined) {
fileName.append(QStringLiteral("Full")); fileName.append(QStringLiteral("Full"));
} }
} }
@ -1569,7 +1578,7 @@ void QQuickGraphsBars::createSelectedModels(QBar3DSeries *series)
} }
for (int ind = 0; ind < selectedModelsListSize; ++ind) { for (int ind = 0; ind < selectedModelsListSize; ++ind) {
QQuick3DModel *model = createDataItem(QQuick3DViewport::scene()); QQuick3DModel *model = createDataItem(QQuick3DViewport::scene(), series);
model->setVisible(false); model->setVisible(false);
if (!rangeGradient) { if (!rangeGradient) {
updateItemMaterial(model, useGradient, rangeGradient, updateItemMaterial(model, useGradient, rangeGradient,
@ -1650,7 +1659,7 @@ void QQuickGraphsBars::createSliceView()
slicedBarListSize = barSeries->dataProxy()->rowCount(); slicedBarListSize = barSeries->dataProxy()->rowCount();
for (int ind = 0; ind < slicedBarListSize; ++ind) { for (int ind = 0; ind < slicedBarListSize; ++ind) {
QQuick3DModel *model = createDataItem(sliceParent->scene()); QQuick3DModel *model = createDataItem(sliceParent->scene(), barSeries);
model->setVisible(false); model->setVisible(false);
if (!rangeGradient) { if (!rangeGradient) {
updateItemMaterial(model, useGradient, rangeGradient, updateItemMaterial(model, useGradient, rangeGradient,

View File

@ -231,7 +231,7 @@ private:
void connectSeries(QBar3DSeries *series); void connectSeries(QBar3DSeries *series);
void disconnectSeries(QBar3DSeries *series); void disconnectSeries(QBar3DSeries *series);
void generateBars(QList<QBar3DSeries *> &barSeriesList); void generateBars(QList<QBar3DSeries *> &barSeriesList);
QQuick3DModel *createDataItem(QQuick3DNode *scene); QQuick3DModel *createDataItem(QQuick3DNode *scene, QAbstract3DSeries *series);
QString getMeshFileName(); QString getMeshFileName();
void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh meshType); void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh meshType);
void updateBarVisuality(QBar3DSeries *series, int visualIndex); void updateBarVisuality(QBar3DSeries *series, int visualIndex);

View File

@ -96,9 +96,8 @@ void QQuickGraphsScatter::generatePointsForScatterModel(ScatterModel *graphModel
if (graphModel->series->dataProxy()->itemCount() > 0) if (graphModel->series->dataProxy()->itemCount() > 0)
itemList.resize(itemCount); itemList.resize(itemCount);
QAbstract3DSeries::Mesh meshType = graphModel->series->mesh();
for (int i = 0; i < itemCount; i++) { for (int i = 0; i < itemCount; i++) {
QQuick3DModel *item = createDataItem(meshType); QQuick3DModel *item = createDataItem(graphModel->series);
item->setPickable(true); item->setPickable(true);
item->setParent(graphModel->series); item->setParent(graphModel->series);
itemList[i] = item; itemList[i] = item;
@ -106,11 +105,11 @@ void QQuickGraphsScatter::generatePointsForScatterModel(ScatterModel *graphModel
graphModel->dataItems = itemList; graphModel->dataItems = itemList;
m_scatterController->markDataDirty(); m_scatterController->markDataDirty();
} else if (m_scatterController->optimizationHints() == QAbstract3DGraph::OptimizationDefault) { } else if (m_scatterController->optimizationHints() == QAbstract3DGraph::OptimizationDefault) {
graphModel->instancingRootItem = createDataItem(graphModel->series->mesh()); graphModel->instancingRootItem = createDataItem(graphModel->series);
graphModel->instancingRootItem->setParent(graphModel->series); graphModel->instancingRootItem->setParent(graphModel->series);
graphModel->instancingRootItem->setInstancing(graphModel->instancing); graphModel->instancingRootItem->setInstancing(graphModel->instancing);
if (m_scatterController->selectionMode() != QAbstract3DGraph::SelectionNone) { if (m_scatterController->selectionMode() != QAbstract3DGraph::SelectionNone) {
graphModel->selectionIndicator = createDataItem(graphModel->series->mesh()); graphModel->selectionIndicator = createDataItem(graphModel->series);
graphModel->instancingRootItem->setPickable(true); graphModel->instancingRootItem->setPickable(true);
} }
} }
@ -613,12 +612,14 @@ QQuick3DNode *QQuickGraphsScatter::createSeriesRoot()
return model; return model;
} }
QQuick3DModel *QQuickGraphsScatter::createDataItem(const QAbstract3DSeries::Mesh meshType) QQuick3DModel *QQuickGraphsScatter::createDataItem(QAbstract3DSeries *series)
{ {
auto model = new QQuick3DModel(); auto model = new QQuick3DModel();
model->setParent(this); model->setParent(this);
model->setParentItem(QQuick3DViewport::scene()); model->setParentItem(QQuick3DViewport::scene());
QString fileName = getMeshFileName(meshType); QString fileName = getMeshFileName(series->mesh());
if (fileName.isEmpty())
fileName = series->userDefinedMesh();
model->setSource(QUrl(fileName)); model->setSource(QUrl(fileName));
return model; return model;
@ -669,9 +670,8 @@ void QQuickGraphsScatter::recreateDataItems()
void QQuickGraphsScatter::addPointsToScatterModel(ScatterModel *graphModel, qsizetype count) void QQuickGraphsScatter::addPointsToScatterModel(ScatterModel *graphModel, qsizetype count)
{ {
QAbstract3DSeries::Mesh meshType = graphModel->series->mesh();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
QQuick3DModel *item = createDataItem(meshType); QQuick3DModel *item = createDataItem(graphModel->series);
item->setPickable(true); item->setPickable(true);
item->setParent(graphModel->series); item->setParent(graphModel->series);
graphModel->dataItems.push_back(item); graphModel->dataItems.push_back(item);
@ -697,16 +697,24 @@ QVector3D QQuickGraphsScatter::selectedItemPosition()
void QQuickGraphsScatter::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh meshType) void QQuickGraphsScatter::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh meshType)
{ {
// Should it be smooth?
if (m_smooth && meshType != QAbstract3DSeries::MeshPoint
&& meshType != QAbstract3DSeries::MeshUserDefined) {
fileName += QStringLiteral("Smooth");
}
// Should it be filled?
if (meshType != QAbstract3DSeries::MeshSphere && meshType != QAbstract3DSeries::MeshArrow if (meshType != QAbstract3DSeries::MeshSphere && meshType != QAbstract3DSeries::MeshArrow
&& meshType != QAbstract3DSeries::MeshMinimal && meshType != QAbstract3DSeries::MeshPoint) { && meshType != QAbstract3DSeries::MeshMinimal
&& meshType != QAbstract3DSeries::MeshPoint
&& meshType != QAbstract3DSeries::MeshUserDefined) {
fileName.append(QStringLiteral("Full")); fileName.append(QStringLiteral("Full"));
} }
} }
QString QQuickGraphsScatter::getMeshFileName(QAbstract3DSeries::Mesh meshType) QString QQuickGraphsScatter::getMeshFileName(QAbstract3DSeries::Mesh meshType)
{ {
QString fileName; QString fileName = {};
QString smoothString = QStringLiteral("Smooth");
switch (meshType) { switch (meshType) {
case QAbstract3DSeries::MeshSphere: case QAbstract3DSeries::MeshSphere:
fileName = QStringLiteral("defaultMeshes/sphereMesh"); fileName = QStringLiteral("defaultMeshes/sphereMesh");
@ -739,11 +747,11 @@ QString QQuickGraphsScatter::getMeshFileName(QAbstract3DSeries::Mesh meshType)
? QStringLiteral("defaultMeshes/planeMesh") ? QStringLiteral("defaultMeshes/planeMesh")
: QStringLiteral("defaultMeshes/octagonMesh"); : QStringLiteral("defaultMeshes/octagonMesh");
break; break;
case QAbstract3DSeries::MeshUserDefined:
break;
default: default:
fileName = QStringLiteral("defaultMeshes/sphereMesh"); fileName = QStringLiteral("defaultMeshes/sphereMesh");
} }
if (m_smooth && meshType != QAbstract3DSeries::MeshPoint)
fileName += smoothString;
fixMeshFileName(fileName, meshType); fixMeshFileName(fileName, meshType);
@ -1114,12 +1122,12 @@ void QQuickGraphsScatter::updateGraph()
graphModel->instancing->setParent(graphModel->series); graphModel->instancing->setParent(graphModel->series);
} }
if (graphModel->instancingRootItem == nullptr) { if (graphModel->instancingRootItem == nullptr) {
graphModel->instancingRootItem = createDataItem(graphModel->series->mesh()); graphModel->instancingRootItem = createDataItem(graphModel->series);
graphModel->instancingRootItem->setParent(graphModel->series); graphModel->instancingRootItem->setParent(graphModel->series);
graphModel->instancingRootItem->setInstancing(graphModel->instancing); graphModel->instancingRootItem->setInstancing(graphModel->instancing);
if (selectionMode() != QAbstract3DGraph::SelectionNone) { if (selectionMode() != QAbstract3DGraph::SelectionNone) {
graphModel->instancingRootItem->setPickable(true); graphModel->instancingRootItem->setPickable(true);
graphModel->selectionIndicator = createDataItem(graphModel->series->mesh()); graphModel->selectionIndicator = createDataItem(graphModel->series);
graphModel->selectionIndicator->setVisible(false); graphModel->selectionIndicator->setVisible(false);
} }
} }

View File

@ -153,7 +153,7 @@ private:
QQuick3DTexture *createTexture(); QQuick3DTexture *createTexture();
QQuick3DModel *createDataItemModel(QAbstract3DSeries::Mesh meshType); QQuick3DModel *createDataItemModel(QAbstract3DSeries::Mesh meshType);
QQuick3DNode *createSeriesRoot(); QQuick3DNode *createSeriesRoot();
QQuick3DModel *createDataItem(const QAbstract3DSeries::Mesh meshType); QQuick3DModel *createDataItem(QAbstract3DSeries *series);
void removeDataItems(ScatterModel *graphModel); void removeDataItems(ScatterModel *graphModel);
void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh meshType); void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh meshType);
QString getMeshFileName(QAbstract3DSeries::Mesh meshType); QString getMeshFileName(QAbstract3DSeries::Mesh meshType);