diff --git a/src/3d/mesh/qgsmesh3dentity_p.cpp b/src/3d/mesh/qgsmesh3dentity_p.cpp index 62164b9086b..75591a9bbbc 100644 --- a/src/3d/mesh/qgsmesh3dentity_p.cpp +++ b/src/3d/mesh/qgsmesh3dentity_p.cpp @@ -34,9 +34,11 @@ QgsMesh3dEntity::QgsMesh3dEntity( const Qgs3DMapSettings &map, QgsMeshLayer *mes mSymbol( symbol ) {} -QgsMeshDataset3dEntity::QgsMeshDataset3dEntity( const Qgs3DMapSettings &map, - QgsMeshLayer *meshLayer, - const QgsMesh3DSymbol &symbol ): QgsMesh3dEntity( map, meshLayer, symbol ) +QgsMeshDataset3dEntity::QgsMeshDataset3dEntity( + const Qgs3DMapSettings &map, + QgsMeshLayer *meshLayer, + const QgsMesh3DSymbol &symbol ): + QgsMesh3dEntity( map, meshLayer, symbol ) {} void QgsMesh3dEntity::build() @@ -48,12 +50,11 @@ void QgsMesh3dEntity::build() void QgsMeshDataset3dEntity::buildGeometry() { Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer; - QgsMeshLayer *l = layer(); if ( !layer() ) return; - mesh->setGeometry( new QgsMeshDataset3dGeometry( l, mMapSettings.origin(), mSymbol, mesh ) ); + mesh->setGeometry( new QgsMeshDataset3dGeometry( layer(), mMapSettings.origin(), mSymbol, mesh ) ); addComponent( mesh ); } @@ -61,8 +62,8 @@ void QgsMeshDataset3dEntity::applyMaterial() { if ( mSymbol.renderingStyle() == QgsMesh3DSymbol::ColorRamp2DRendering && layer() ) { - QgsMeshRendererSettings rendererSettings = layer()->rendererSettings(); - QgsMeshDatasetIndex datasetIndex = rendererSettings.activeScalarDataset(); + const QgsMeshRendererSettings rendererSettings = layer()->rendererSettings(); + const QgsMeshDatasetIndex datasetIndex = rendererSettings.activeScalarDataset(); if ( datasetIndex.isValid() ) mSymbol.setColorRampShader( rendererSettings.scalarSettings( datasetIndex.group() ).colorRampShader() ); } @@ -82,12 +83,11 @@ QgsMesh3dTerrainTileEntity::QgsMesh3dTerrainTileEntity( const Qgs3DMapSettings & void QgsMesh3dTerrainTileEntity::buildGeometry() { Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer; - QgsMeshLayer *l = layer(); if ( !layer() ) return; - mesh->setGeometry( new QgsMeshTerrain3dGeometry( l, mMapSettings.origin(), mSymbol, mesh ) ); + mesh->setGeometry( new QgsMeshTerrain3dGeometry( layer(), mMapSettings.origin(), mSymbol, mesh ) ); addComponent( mesh ); } diff --git a/src/3d/mesh/qgsmesh3dentity_p.h b/src/3d/mesh/qgsmesh3dentity_p.h index 14a75637dd9..062387180fc 100644 --- a/src/3d/mesh/qgsmesh3dentity_p.h +++ b/src/3d/mesh/qgsmesh3dentity_p.h @@ -68,7 +68,7 @@ class QgsMesh3dEntity virtual void applyMaterial() = 0; }; -//! Entity that handles rendering of dataset mesh +//! Entity that handles rendering of dataset class QgsMeshDataset3dEntity: public QgsMesh3dEntity, public Qt3DCore::QEntity { public: diff --git a/src/3d/mesh/qgsmesh3dgeometry_p.cpp b/src/3d/mesh/qgsmesh3dgeometry_p.cpp index fcd23c38056..03d4532758e 100644 --- a/src/3d/mesh/qgsmesh3dgeometry_p.cpp +++ b/src/3d/mesh/qgsmesh3dgeometry_p.cpp @@ -36,7 +36,7 @@ static QByteArray createTerrainVertexData( const QgsTriangularMesh &mesh, { const int nVerts = mesh.vertices().count(); - QVector normales = mesh.vertexNormals( vertScale ); + QVector normals = mesh.vertexNormals( vertScale ); // Populate a buffer with the interleaved per-vertex data with // vec3 pos, vec3 normal @@ -54,7 +54,7 @@ static QByteArray createTerrainVertexData( const QgsTriangularMesh &mesh, *fptr++ = float( vert.z() - origin.z() ) * vertScale ; *fptr++ = float( -vert.y() + origin.y() ); - QVector3D normal = normales.at( i ); + QVector3D normal = normals.at( i ); normal = QVector3D( normal.x() * vertScale, -normal.y() * vertScale, normal.z() ); normal.normalized(); @@ -76,7 +76,7 @@ static QByteArray createDatasetVertexData( const QgsTriangularMesh &mesh, const int nVerts = mesh.vertices().count(); //Calculate normales with Z value equal to verticaleMagnitude - QVector normales( nVerts ); + QVector normals( nVerts ); for ( const auto &face : mesh.triangles() ) { for ( int i = 0; i < 3; i++ ) @@ -107,12 +107,12 @@ static QByteArray createDatasetVertexData( const QgsTriangularMesh &mesh, float( otherVert2.y() - vert.y() ), vertScale * float( verticaleMagnitude[index2] - verticaleMagnitude[index] + adjustRelative2 - adjustRelative ) ); - normales[index] += QVector3D::crossProduct( v1, v2 ); + normals[index] += QVector3D::crossProduct( v1, v2 ); } } // Populate a buffer with the interleaved per-vertex data with - // vec3 pos, vec2 texCoord, vec3 normal, vec4 tangent + // vec3 pos, vec3 normal, float magnitude const quint32 elementSize = 3 + 3 + 1 ; const quint32 stride = elementSize * sizeof( float ); QByteArray bufferBytes; @@ -133,7 +133,7 @@ static QByteArray createDatasetVertexData( const QgsTriangularMesh &mesh, *fptr++ = float( vertMag - origin.z() ) * vertScale ; *fptr++ = float( -vert.y() + origin.y() ); - QVector3D normal = normales.at( i ); + QVector3D normal = normals.at( i ); normal = QVector3D( normal.x() * vertScale, -normal.y() * vertScale, normal.z() ); normal.normalized(); @@ -169,14 +169,13 @@ static QByteArray createIndexData( const QgsTriangularMesh &mesh ) static QByteArray createDatasetIndexData( const QgsTriangularMesh &mesh, const QgsMeshDataBlock &mActiveFaceFlagValues, int activeFaceCount ) { - const int faces = mesh.triangles().count(); + const int trianglesCount = mesh.triangles().count(); const quint32 indices = static_cast( 3 * activeFaceCount ); - Q_ASSERT( indices < std::numeric_limits::max() ); QByteArray indexBytes; indexBytes.resize( int( indices * sizeof( quint32 ) ) ); quint32 *indexPtr = reinterpret_cast( indexBytes.data() ); - for ( int i = 0; i < faces; ++i ) + for ( int i = 0; i < trianglesCount; ++i ) { int nativeFaceIndex = mesh.trianglesToNativeFaces()[i]; const bool isActive = mActiveFaceFlagValues.active( nativeFaceIndex ); @@ -287,6 +286,11 @@ class MeshDatasetIndexBufferFunctor : public QBufferDataGenerator class MeshDatasetVertexBufferFunctor : public QBufferDataGenerator { public: + + /** + * verticalRelative parameter is true when the vertical magnitude provides from the sum of the z vertices and the scalar dataset choosen + * for rendering the vertical component. + */ explicit MeshDatasetVertexBufferFunctor( const QgsTriangularMesh &mesh, const QVector verticaleMagnitude, const QVector scalarMagnitude, @@ -337,14 +341,19 @@ class MeshDatasetVertexBufferFunctor : public QBufferDataGenerator +QgsMeshLayer *QgsMesh3dGeometry::meshLayer() const +{ + return qobject_cast( mLayerRef.layer.data() ); +} + QgsMesh3dGeometry::QgsMesh3dGeometry( QgsMeshLayer *layer, const QgsVector3D &origin, const QgsMesh3DSymbol &symbol, Qt3DCore::QNode *parent ): Qt3DRender::QGeometry( parent ), - mLayerRef( layer ), mOrigin( origin ), - mVertScale( symbol.verticalScale() ) + mVertScale( symbol.verticalScale() ), + mLayerRef( layer ) {} QgsMeshDataset3dGeometry::QgsMeshDataset3dGeometry( @@ -361,7 +370,7 @@ QgsMeshDataset3dGeometry::QgsMeshDataset3dGeometry( void QgsMeshDataset3dGeometry::init() { - QgsMeshLayer *layer = qobject_cast( mLayerRef.layer.data() ); + QgsMeshLayer *layer = meshLayer(); if ( !layer ) return; @@ -417,7 +426,7 @@ void QgsMeshDataset3dGeometry::init() int QgsMeshDataset3dGeometry::extractDataset( QVector &verticalMagnitude, QVector &scalarMagnitude, QgsMeshDataBlock &activeFaceFlagValues ) { - QgsMeshLayer *layer = qobject_cast( mLayerRef.layer.data() ); + QgsMeshLayer *layer = meshLayer(); if ( !layer ) return 0; @@ -430,59 +439,23 @@ int QgsMeshDataset3dGeometry::extractDataset( QVector &verticalMagnitude return 0; QgsTriangularMesh triangularMesh = *layer->triangularMesh(); - const QgsMesh nativeMesh = *layer->nativeMesh(); - QgsMeshDatasetGroupMetadata verticalDatasetGroupMetadata = layer->dataProvider()->datasetGroupMetadata( mVerticalGroupDatasetIndex ); - int dataOnVerticesCount = triangularMesh.vertices().count(); - //***** extract the scalar dataset used to render vertical magintude of geometry - //define the vertical magitude datasetIndex + + //extract the scalar dataset used to render vertical magnitude of geometry + //define the vertical magnitude datasetIndex int verticalDataSetIndexNumber = 0; verticalDataSetIndexNumber = scalarDatasetIndex.dataset(); verticalDataSetIndexNumber = std::min( verticalDataSetIndexNumber, layer->dataProvider()->datasetCount( mVerticalGroupDatasetIndex ) - 1 ); QgsMeshDatasetIndex verticalMagDatasetIndex( mVerticalGroupDatasetIndex, verticalDataSetIndexNumber ); //define the active face for vertical magnitude, the inactive faces will not be rendered + // The active face flag values are defined based on the vertival magnitude dataset activeFaceFlagValues = layer->dataProvider()->areFacesActive( verticalMagDatasetIndex, 0, nativeMesh.faces.count() ); - - - if ( verticalDatasetGroupMetadata.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices ) - { - //The dataset values are on vertices, copy directly if data is scalar, calculate magnitude if data is vector - QgsMeshDataBlock dataOnVertices = layer->dataProvider()->datasetValues( verticalMagDatasetIndex, 0, dataOnVerticesCount ); - - if ( verticalDatasetGroupMetadata.isScalar() ) - verticalMagnitude = dataOnVertices.values(); - - if ( verticalDatasetGroupMetadata.isVector() ) - verticalMagnitude = QgsMeshLayerUtils::calculateMagnitudes( dataOnVertices ); - } - else if ( verticalDatasetGroupMetadata.dataType() == QgsMeshDatasetGroupMetadata::DataOnFaces || - verticalDatasetGroupMetadata.dataType() == QgsMeshDatasetGroupMetadata::DataOnVolumes ) - { - //The dataset values are on faces or volumes,calculate magnitude if data is vector, then interpolate from faces to vertices - QgsMeshDataBlock dataOnFaces = QgsMeshLayerUtils::datasetValues( - layer, - verticalMagDatasetIndex, - 0, - nativeMesh.faceCount() ); - - QVector magOnFaces; - - if ( verticalDatasetGroupMetadata.isScalar() ) - magOnFaces = dataOnFaces.values(); - - if ( verticalDatasetGroupMetadata.isVector() ) - magOnFaces = QgsMeshLayerUtils::calculateMagnitudes( dataOnFaces ); - - verticalMagnitude = QgsMeshLayerUtils::interpolateFromFacesData( - magOnFaces, - &nativeMesh, - &triangularMesh, - &activeFaceFlagValues, - QgsMeshRendererScalarSettings::NeighbourAverage - ); - } + verticalMagnitude = QgsMeshLayerUtils::calculateMagnitudeOnVertices( + layer, + verticalMagDatasetIndex, + &activeFaceFlagValues ); //count active faces int activeTriangularCount = 0; @@ -493,37 +466,14 @@ int QgsMeshDataset3dGeometry::extractDataset( QVector &verticalMagnitude activeTriangularCount++; } - //***** extract the scalar dataset used to render color shading - const QgsMeshDatasetGroupMetadata metadata = layer->dataProvider()->datasetGroupMetadata( scalarDatasetIndex ); - bool scalarDataOnVertices = metadata.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices; + //extract the scalar dataset used to render color shading + QgsMeshDataBlock scalarActiveFaceFlagValues = + layer->dataProvider()->areFacesActive( scalarDatasetIndex, 0, nativeMesh.faces.count() ); + scalarMagnitude = QgsMeshLayerUtils::calculateMagnitudeOnVertices( + layer, + scalarDatasetIndex, + &scalarActiveFaceFlagValues ); - // populate scalar values - int datacount = scalarDataOnVertices ? nativeMesh.vertices.count() : nativeMesh.faces.count(); - QgsMeshDataBlock vals = QgsMeshLayerUtils::datasetValues( - layer, - scalarDatasetIndex, - 0, - datacount ); - - // vals could be scalar or vectors, for contour rendering we want always magnitude - if ( vals.isValid() ) - { - scalarMagnitude = QgsMeshLayerUtils::calculateMagnitudes( vals ); - QgsMeshDataBlock scalarActiveFaceFlagValues = - layer->dataProvider()->areFacesActive( scalarDatasetIndex, 0, nativeMesh.faces.count() ); - - if ( !scalarDataOnVertices ) - { - //Need to interpolate data on vertices - scalarMagnitude = QgsMeshLayerUtils::interpolateFromFacesData( - scalarMagnitude, - &nativeMesh, - &triangularMesh, - &scalarActiveFaceFlagValues, - QgsMeshRendererScalarSettings::NeighbourAverage - ); - } - } return activeTriangularCount; } @@ -540,12 +490,11 @@ QgsMeshTerrain3dGeometry::QgsMeshTerrain3dGeometry( void QgsMeshTerrain3dGeometry::init() { - QgsMeshLayer *layer = qobject_cast( mLayerRef.layer.data() ); + QgsMeshLayer *layer = meshLayer(); if ( !layer ) return; - #if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) Qt3DRender::QBuffer *mVertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this ); Qt3DRender::QBuffer *mIndexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::IndexBuffer, this ); @@ -635,3 +584,4 @@ void QgsMesh3dGeometry::prepareIndexesAttribute( Qt3DRender::QBuffer *buffer, in addAttribute( indexAttribute ); } + diff --git a/src/3d/mesh/qgsmesh3dgeometry_p.h b/src/3d/mesh/qgsmesh3dgeometry_p.h index 7b316ff12e4..472cb8073f9 100644 --- a/src/3d/mesh/qgsmesh3dgeometry_p.h +++ b/src/3d/mesh/qgsmesh3dgeometry_p.h @@ -49,14 +49,15 @@ namespace Qt3DRender class QgsMeshLayer; /** - * \ingroup 3d * Creates attributes and vertex/index buffers for a mesh layer - * \since QGIS 3.12 */ class QgsMesh3dGeometry: public Qt3DRender::QGeometry { + public: + QgsMeshLayer *meshLayer() const; + protected: - //! Constructor protected because must anly be called from derived classes + //! Constructor explicit QgsMesh3dGeometry( QgsMeshLayer *layer, const QgsVector3D &origin, const QgsMesh3DSymbol &symbol, @@ -66,15 +67,16 @@ class QgsMesh3dGeometry: public Qt3DRender::QGeometry void prepareVerticesNormalAttribute( Qt3DRender::QBuffer *buffer, int count, int stride, int offset ); void prepareIndexesAttribute( Qt3DRender::QBuffer *buffer, int count ); - QgsMapLayerRef mLayerRef; QgsVector3D mOrigin; float mVertScale; + + private: + + QgsMapLayerRef mLayerRef; }; /** - * \ingroup 3d * Creates attributes and vertex/index buffers for a mesh layer that renders the dataset - * \since QGIS 3.14 */ class QgsMeshDataset3dGeometry: public QgsMesh3dGeometry { @@ -88,7 +90,7 @@ class QgsMeshDataset3dGeometry: public QgsMesh3dGeometry private: void init(); - // Returns the number of active faces + //! Returns the number of active faces int extractDataset( QVector &verticaleMagnitude, QVector &scalarMagnitude, QgsMeshDataBlock &verticalActiveFaceFlagValues ); void prepareVerticesDatasetAttribute( Qt3DRender::QBuffer *buffer, int count, int stride, int offset ); @@ -98,9 +100,7 @@ class QgsMeshDataset3dGeometry: public QgsMesh3dGeometry }; /** - * \ingroup 3d * Creates attributes and vertex/index buffers for a mesh layer that renders terrain - * \since QGIS 3.14 */ class QgsMeshTerrain3dGeometry: public QgsMesh3dGeometry { diff --git a/src/3d/mesh/qgsmesh3dmaterial_p.cpp b/src/3d/mesh/qgsmesh3dmaterial_p.cpp index a74c8c006c8..11cd45e9f30 100644 --- a/src/3d/mesh/qgsmesh3dmaterial_p.cpp +++ b/src/3d/mesh/qgsmesh3dmaterial_p.cpp @@ -37,7 +37,6 @@ class ColorRampTextureGenerator: public Qt3DRender::QTextureImageDataGenerator mVerticalScale( verticalScale ) {} - // QTextureImageDataGenerator interface public: Qt3DRender::QTextureImageDataPtr operator()() override { @@ -77,8 +76,6 @@ class ColorRampTextureGenerator: public Qt3DRender::QTextureImageDataGenerator dataPtr->setData( data, sizeof( float ) ); //size is the size of the type, here float - qDebug() << "Color ramp texture created"; - return dataPtr; } @@ -101,8 +98,8 @@ class ColorRampTextureGenerator: public Qt3DRender::QTextureImageDataGenerator QList otherColorItemList = otherColorRampShader.colorRampItemList(); for ( int i = 0; i < colorItemList.count(); ++i ) { - QColor color = colorItemList.at( i ).color; - QColor otherColor = otherColorItemList.at( i ).color; + const QColor color = colorItemList.at( i ).color; + const QColor otherColor = otherColorItemList.at( i ).color; double value = colorItemList.at( i ).value; double otherValue = otherColorItemList.at( i ).value; if ( color != otherColor || @@ -166,11 +163,11 @@ void QgsMesh3dMaterial::configure() switch ( mMagnitudeType ) { case QgsMesh3dMaterial::ZValue: - // if the color shading is done with the Z value of vertices, the color ramhave top adapted with verticale scale + // if the color shading is done with the Z value of vertices, the color ramp has to be adapted with vertical scale colorRampTexture->addTextureImage( new ColorRampTexture( mSymbol.colorRampShader(), mSymbol.verticalScale() ) ); break; case QgsMesh3dMaterial::ScalarDataSet: - // if the color shading is done with scalar dataset, no verticale scale to use + // if the color shading is done with scalar dataset, no vertical scale to use colorRampTexture->addTextureImage( new ColorRampTexture( mSymbol.colorRampShader(), 1 ) ); break; } @@ -196,7 +193,7 @@ void QgsMesh3dMaterial::configure() Qt3DRender::QShaderProgram *shaderProgram = new Qt3DRender::QShaderProgram(); //Load shader programs - QUrl urlVert = QUrl( QStringLiteral( "qrc:/shaders/mesh/mesh.vert" ) ); + QUrl urlVert( QStringLiteral( "qrc:/shaders/mesh/mesh.vert" ) ); shaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, shaderProgram->loadSource( urlVert ) ); QUrl urlGeom( QStringLiteral( "qrc:/shaders/mesh/mesh.geom" ) ); shaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Geometry, shaderProgram->loadSource( urlGeom ) ); diff --git a/src/3d/mesh/qgsmeshterraingenerator.cpp b/src/3d/mesh/qgsmeshterraingenerator.cpp index 5b1dc05b82f..4b6e3dd9c72 100644 --- a/src/3d/mesh/qgsmeshterraingenerator.cpp +++ b/src/3d/mesh/qgsmeshterraingenerator.cpp @@ -43,7 +43,7 @@ Qt3DCore::QEntity *QgsMeshTerrainTileLoader::createEntity( Qt3DCore::QEntity *pa if ( !layer ) return nullptr; - auto entity = new QgsMesh3dTerrainTileEntity( terrain()->map3D(), layer, mSymbol, mNode->tileId(), parent ); + QgsMesh3dTerrainTileEntity *entity = new QgsMesh3dTerrainTileEntity( terrain()->map3D(), layer, mSymbol, mNode->tileId(), parent ); entity->build(); createTexture( entity ); diff --git a/src/3d/symbols/qgsmesh3dsymbol.h b/src/3d/symbols/qgsmesh3dsymbol.h index 18b0da873cc..551b9a0bd46 100644 --- a/src/3d/symbols/qgsmesh3dsymbol.h +++ b/src/3d/symbols/qgsmesh3dsymbol.h @@ -55,15 +55,15 @@ class _3D_EXPORT QgsMesh3DSymbol : public QgsAbstract3DSymbol }; /** - * Which value to render the Z value of the mesh + * How to render the Z value of the mesh * * \since QGIS 3.14 */ - enum ZvalueType + enum ZValueType { //! Use the Z value of the vertices VerticesZValue = 0, - //! Render the mesh with a color ramp + //! Use the value from a dataset (for example, water surface value) ScalarDatasetZvalue }; @@ -214,28 +214,28 @@ class _3D_EXPORT QgsMesh3DSymbol : public QgsAbstract3DSymbol void setRenderingStyle( const QgsMesh3DSymbol::RenderingStyle &textureType ); /** - * Returns the index og the dataset group that will be used to render the vertical of the 3D mesh + * Returns the index of the dataset group that will be used to render the vertical component of the 3D mesh geometry * * \since QGIS 3.14 */ int verticalDatasetGroupIndex() const; /** - * Sets the index og the dataset group that will be used to render the vertical of the 3D mesh + * Sets the index of the dataset group that will be used to render the vertical component of the 3D mesh geometry * * \since QGIS 3.14 */ void setVerticalDatasetGroupIndex( int verticalDatasetGroupIndex ); /** - * Returns if the verticale magnitude is relative to the mesh vertices Z value + * Returns if the vertical component of the mesh is relative to the mesh vertices Z value * * \since QGIS 3.14 */ bool isVerticalMagnitudeRelative() const; /** - * Sets if the verticale magnitude is relative to the mesh vertices Z value + * Sets if the vertical component of the mesh is relative to the mesh vertices Z value * * \since QGIS 3.14 */ @@ -243,25 +243,24 @@ class _3D_EXPORT QgsMesh3DSymbol : public QgsAbstract3DSymbol private: - //old settings //! how to handle altitude of vector features Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative; float mHeight = 0.0f; //!< Base height of triangles QgsPhongMaterialSettings mMaterial; //!< Defines appearance of objects bool mAddBackFaces = false; - // Triangles settings + //! Triangles settings bool mSmoothedTriangles = false; bool mWireframeEnabled = false; double mWireframeLineWidth = 1.0; QColor mWireframeLineColor = Qt::darkGray; - // Verticals settings + //! Verticals settings double mVerticalScale = 1.0; int mVerticalDatasetGroupIndex = -1; bool mIsVerticalMagnitudeRelative = false; - // Color rendering settings + //! Color rendering settings QgsMesh3DSymbol::RenderingStyle mRenderingStyle = QgsMesh3DSymbol::SingleColor; QgsColorRampShader mColorRampShader; QColor mSingleColor = Qt::darkGreen; diff --git a/src/app/3d/qgsmesh3dsymbolwidget.h b/src/app/3d/qgsmesh3dsymbolwidget.h index 91d3d72593c..a28c68d9ac4 100644 --- a/src/app/3d/qgsmesh3dsymbolwidget.h +++ b/src/app/3d/qgsmesh3dsymbolwidget.h @@ -40,8 +40,6 @@ class QgsMesh3dSymbolWidget : public QWidget, private Ui::QgsMesh3dPropsWidget void configureForTerrain(); void configureForDataset(); - - public slots: void reloadColorRampShaderMinMax(); void enableVerticalSetting( bool isEnable ); diff --git a/src/core/mesh/qgsmeshlayerutils.cpp b/src/core/mesh/qgsmeshlayerutils.cpp index 14a3e2dcfe0..029dcf6953a 100644 --- a/src/core/mesh/qgsmeshlayerutils.cpp +++ b/src/core/mesh/qgsmeshlayerutils.cpp @@ -233,6 +233,52 @@ QVector QgsMeshLayerUtils::interpolateFromFacesData( return res; } +QVector QgsMeshLayerUtils::calculateMagnitudeOnVertices( const QgsMeshLayer *meshLayer, + const QgsMeshDatasetIndex index, + QgsMeshDataBlock *activeFaceFlagValues, + const QgsMeshRendererScalarSettings::DataInterpolationMethod method ) +{ + QVector ret; + + if ( !meshLayer && !index.isValid() ) + return ret; + + const QgsTriangularMesh *triangularMesh = meshLayer->triangularMesh(); + const QgsMesh *nativeMesh = meshLayer->nativeMesh(); + if ( !triangularMesh || !nativeMesh ) + return ret; + + const QgsMeshDatasetGroupMetadata metadata = meshLayer->dataProvider()->datasetGroupMetadata( index ); + bool scalarDataOnVertices = metadata.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices; + + // populate scalar values + int datacount = scalarDataOnVertices ? nativeMesh->vertices.count() : nativeMesh->faces.count(); + QgsMeshDataBlock vals = QgsMeshLayerUtils::datasetValues( + meshLayer, + index, + 0, + datacount ); + + if ( vals.isValid() ) + { + ret = QgsMeshLayerUtils::calculateMagnitudes( vals ); + QgsMeshDataBlock scalarActiveFaceFlagValues = + meshLayer->dataProvider()->areFacesActive( index, 0, nativeMesh->faces.count() ); + + if ( !scalarDataOnVertices ) + { + //Need to interpolate data on vertices + ret = QgsMeshLayerUtils::interpolateFromFacesData( + ret, + nativeMesh, + triangularMesh, + activeFaceFlagValues, + method ); + } + } + return ret; +} + QgsRectangle QgsMeshLayerUtils::triangleBoundingBox( const QgsPointXY &p1, const QgsPointXY &p2, const QgsPointXY &p3 ) { // p1 diff --git a/src/core/mesh/qgsmeshlayerutils.h b/src/core/mesh/qgsmeshlayerutils.h index 82efd055c8d..4721cf5b8b9 100644 --- a/src/core/mesh/qgsmeshlayerutils.h +++ b/src/core/mesh/qgsmeshlayerutils.h @@ -165,6 +165,21 @@ class CORE_EXPORT QgsMeshLayerUtils QgsMeshRendererScalarSettings::DataInterpolationMethod method ); + /** + * Calculates magnitude values ont vertices from the given QgsMeshDataBlock. + * If the values are defined on faces, + * \param meshLayer the mesh layer + * \param index the dataset index that contains the data + * \param activeFaceFlagValues pointer to the QVector containing active face flag values + * \param method used to inteprolate the values on vertices if needed + * \returns magnitude values of the dataset on all the vertices + * \since QGIS 3.14 + */ + static QVector calculateMagnitudeOnVertices( const QgsMeshLayer *meshLayer, + const QgsMeshDatasetIndex index, + QgsMeshDataBlock *activeFaceFlagValues, + const QgsMeshRendererScalarSettings::DataInterpolationMethod method = QgsMeshRendererScalarSettings::NeighbourAverage ); + /** * Calculates the bounding box of the triangle * \param p1 first vertex of the triangle