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/pipe.mesh"
"data/refinery.mesh"
"data/narrowarrow.mesh"
"data/maptexture.jpg"
"data/topography.png"
)

View File

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

View File

@ -201,6 +201,11 @@ void GraphModifier::changeStyle(int style)
m_primarySeries->setMesh(m_barMesh);
m_secondarySeries->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/oilrig.mesh</file>
<file>data/pipe.mesh</file>
<file>data/narrowarrow.mesh</file>
<file>data/maptexture.jpg</file>
<file>data/topography.png</file>
</qresource>

View File

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

View File

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

View File

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

View File

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