mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-06 00:05:02 -05:00
after Peter review
.
This commit is contained in:
parent
e11f65b85a
commit
4b038fa2d9
@ -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 );
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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 ) );
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -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;
|
||||
|
@ -40,8 +40,6 @@ class QgsMesh3dSymbolWidget : public QWidget, private Ui::QgsMesh3dPropsWidget
|
||||
void configureForTerrain();
|
||||
void configureForDataset();
|
||||
|
||||
|
||||
|
||||
public slots:
|
||||
void reloadColorRampShaderMinMax();
|
||||
void enableVerticalSetting( bool isEnable );
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user