after Peter review

.
This commit is contained in:
vcloarec 2020-02-24 22:10:27 -04:00 committed by Nyall Dawson
parent e11f65b85a
commit 4b038fa2d9
10 changed files with 135 additions and 130 deletions

View File

@ -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 );
}

View File

@ -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:

View File

@ -36,7 +36,7 @@ static QByteArray createTerrainVertexData( const QgsTriangularMesh &mesh,
{
const int nVerts = mesh.vertices().count();
QVector<QVector3D> normales = mesh.vertexNormals( vertScale );
QVector<QVector3D> 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<QVector3D> normales( nVerts );
QVector<QVector3D> 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<quint32>( 3 * activeFaceCount );
Q_ASSERT( indices < std::numeric_limits<quint32>::max() );
QByteArray indexBytes;
indexBytes.resize( int( indices * sizeof( quint32 ) ) );
quint32 *indexPtr = reinterpret_cast<quint32 *>( 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<double> verticaleMagnitude,
const QVector<double> scalarMagnitude,
@ -337,14 +341,19 @@ class MeshDatasetVertexBufferFunctor : public QBufferDataGenerator
QgsMeshLayer *QgsMesh3dGeometry::meshLayer() const
{
return qobject_cast<QgsMeshLayer *>( 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<QgsMeshLayer *>( mLayerRef.layer.data() );
QgsMeshLayer *layer = meshLayer();
if ( !layer )
return;
@ -417,7 +426,7 @@ void QgsMeshDataset3dGeometry::init()
int QgsMeshDataset3dGeometry::extractDataset( QVector<double> &verticalMagnitude, QVector<double> &scalarMagnitude, QgsMeshDataBlock &activeFaceFlagValues )
{
QgsMeshLayer *layer = qobject_cast<QgsMeshLayer *>( mLayerRef.layer.data() );
QgsMeshLayer *layer = meshLayer();
if ( !layer )
return 0;
@ -430,59 +439,23 @@ int QgsMeshDataset3dGeometry::extractDataset( QVector<double> &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<double> 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<double> &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<QgsMeshLayer *>( 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 );
}

View File

@ -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<double> &verticaleMagnitude, QVector<double> &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
{

View File

@ -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<QgsColorRampShader::ColorRampItem> 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 ) );

View File

@ -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 );

View File

@ -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;

View File

@ -40,8 +40,6 @@ class QgsMesh3dSymbolWidget : public QWidget, private Ui::QgsMesh3dPropsWidget
void configureForTerrain();
void configureForDataset();
public slots:
void reloadColorRampShaderMinMax();
void enableVerticalSetting( bool isEnable );

View File

@ -233,6 +233,52 @@ QVector<double> QgsMeshLayerUtils::interpolateFromFacesData(
return res;
}
QVector<double> QgsMeshLayerUtils::calculateMagnitudeOnVertices( const QgsMeshLayer *meshLayer,
const QgsMeshDatasetIndex index,
QgsMeshDataBlock *activeFaceFlagValues,
const QgsMeshRendererScalarSettings::DataInterpolationMethod method )
{
QVector<double> 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

View File

@ -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<double> 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