Navigation Menu

Skip to content

Commit

Permalink
make mesh 3d rendering more thread safe
Browse files Browse the repository at this point in the history
  • Loading branch information
vcloarec authored and nyalldawson committed Oct 22, 2020
1 parent 560cc73 commit 04d665f
Show file tree
Hide file tree
Showing 11 changed files with 121 additions and 132 deletions.
48 changes: 26 additions & 22 deletions src/3d/mesh/qgsmesh3dentity_p.cpp
Expand Up @@ -28,16 +28,21 @@



QgsMesh3dEntity::QgsMesh3dEntity( const Qgs3DMapSettings &map, QgsMeshLayer *meshLayer, const QgsMesh3DSymbol *symbol )
QgsMesh3dEntity::QgsMesh3dEntity( const Qgs3DMapSettings &map,
const QgsTriangularMesh &triangularMesh,
const QgsMesh3DSymbol *symbol )
: mMapSettings( map )
, mLayerRef( meshLayer )
, mTriangularMesh( triangularMesh )
, mSymbol( symbol->clone() )
{}

QgsMeshDataset3dEntity::QgsMeshDataset3dEntity( const Qgs3DMapSettings &map,
QgsMeshLayer *meshLayer,
const QgsMesh3DSymbol *symbol )
: QgsMesh3dEntity( map, meshLayer, symbol )
QgsMeshDataset3dEntity::QgsMeshDataset3dEntity(
const Qgs3DMapSettings &map,
const QgsTriangularMesh &triangularMesh,
QgsMeshLayer *meshLayer,
const QgsMesh3DSymbol *symbol )
: QgsMesh3dEntity( map, triangularMesh, symbol ),
mLayerRef( meshLayer )
{}

void QgsMesh3dEntity::build()
Expand All @@ -52,7 +57,7 @@ void QgsMeshDataset3dEntity::buildGeometry()
return;

Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer;
mesh->setGeometry( new QgsMeshDataset3dGeometry( layer(), mMapSettings.temporalRange(), mMapSettings.origin(), mSymbol.get(), mesh ) );
mesh->setGeometry( new QgsMeshDataset3dGeometry( mTriangularMesh, layer(), mMapSettings.temporalRange(), mMapSettings.origin(), mSymbol.get(), mesh ) );
addComponent( mesh );
}

Expand All @@ -69,36 +74,35 @@ void QgsMeshDataset3dEntity::applyMaterial()
addComponent( material );
}

QgsMesh3dTerrainTileEntity::QgsMesh3dTerrainTileEntity( const Qgs3DMapSettings &map,
QgsMeshLayer *meshLayer,
const QgsMesh3DSymbol *symbol,
QgsChunkNodeId nodeId,
Qt3DCore::QNode *parent )
: QgsMesh3dEntity( map, meshLayer, symbol )
QgsMeshLayer *QgsMeshDataset3dEntity::layer() const
{
return qobject_cast<QgsMeshLayer *>( mLayerRef.layer.data() );
}

QgsMesh3dTerrainTileEntity::QgsMesh3dTerrainTileEntity(
const Qgs3DMapSettings &map,
const QgsTriangularMesh &triangularMesh,
const QgsMesh3DSymbol *symbol,
QgsChunkNodeId nodeId,
Qt3DCore::QNode *parent )
: QgsMesh3dEntity( map, triangularMesh, symbol )
, QgsTerrainTileEntity( nodeId, parent )
{}

void QgsMesh3dTerrainTileEntity::buildGeometry()
{
if ( !layer() )
return;

Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer;
mesh->setGeometry( new QgsMeshTerrain3dGeometry( layer(), mMapSettings.origin(), mSymbol.get(), mesh ) );
mesh->setGeometry( new QgsMeshTerrain3dGeometry( mTriangularMesh, mMapSettings.origin(), mSymbol.get(), mesh ) );
addComponent( mesh );
}

void QgsMesh3dTerrainTileEntity::applyMaterial()
{
QgsMesh3dMaterial *material = new QgsMesh3dMaterial(
layer(), mMapSettings.temporalRange(),
nullptr, QgsDateTimeRange(),
mMapSettings.origin(),
mSymbol.get(),
QgsMesh3dMaterial::ZValue );
addComponent( material );
}

QgsMeshLayer *QgsMesh3dEntity::layer() const
{
return qobject_cast<QgsMeshLayer *>( mLayerRef.layer.data() );
}
12 changes: 7 additions & 5 deletions src/3d/mesh/qgsmesh3dentity_p.h
Expand Up @@ -54,15 +54,13 @@ class QgsMesh3dEntity
protected:
//! Constructor
QgsMesh3dEntity( const Qgs3DMapSettings &map,
QgsMeshLayer *meshLayer,
const QgsTriangularMesh &triangularMesh,
const QgsMesh3DSymbol *symbol );

virtual ~QgsMesh3dEntity() = default;

QgsMeshLayer *layer() const;

Qgs3DMapSettings mMapSettings;
QgsMapLayerRef mLayerRef;
QgsTriangularMesh mTriangularMesh;
std::unique_ptr< QgsMesh3DSymbol > mSymbol;

private:
Expand All @@ -76,21 +74,25 @@ class QgsMeshDataset3dEntity: public QgsMesh3dEntity, public Qt3DCore::QEntity
public:
//! Constructor
QgsMeshDataset3dEntity( const Qgs3DMapSettings &map,
const QgsTriangularMesh &triangularMesh,
QgsMeshLayer *meshLayer,
const QgsMesh3DSymbol *symbol );

private:
virtual void buildGeometry();
virtual void applyMaterial();

QgsMeshLayer *layer() const;
QgsMapLayerRef mLayerRef;

};

//! Entity that handles rendering of terrain mesh
class QgsMesh3dTerrainTileEntity: public QgsMesh3dEntity, public QgsTerrainTileEntity
{
public:
QgsMesh3dTerrainTileEntity( const Qgs3DMapSettings &map,
QgsMeshLayer *meshLayer,
const QgsTriangularMesh &triangularMesh,
const QgsMesh3DSymbol *symbol,
QgsChunkNodeId nodeId,
Qt3DCore::QNode *parent = nullptr );
Expand Down
83 changes: 35 additions & 48 deletions src/3d/mesh/qgsmesh3dgeometry_p.cpp
Expand Up @@ -170,7 +170,6 @@ class MeshTerrainVertexBufferFunctor : public QBufferDataGenerator
QByteArray operator()() final
{
return createTerrainVertexData( mMesh, mOrigin, mVertScale );

}

bool operator ==( const QBufferDataGenerator &other ) const final
Expand Down Expand Up @@ -305,43 +304,34 @@ class MeshDatasetVertexBufferFunctor : public QBufferDataGenerator

};



QgsMeshLayer *QgsMesh3dGeometry::meshLayer() const
{
return qobject_cast<QgsMeshLayer *>( mLayerRef.layer.data() );
}

QgsMesh3dGeometry::QgsMesh3dGeometry( QgsMeshLayer *layer,
QgsMesh3dGeometry::QgsMesh3dGeometry( const QgsTriangularMesh &triangularMesh,
const QgsVector3D &origin,
const QgsMesh3DSymbol *symbol,
Qt3DCore::QNode *parent )
: Qt3DRender::QGeometry( parent )
, mOrigin( origin )
, mVertScale( symbol->verticalScale() )
, mLayerRef( layer )
, mTriangulaMesh( triangularMesh )
{}

QgsMeshDataset3dGeometry::QgsMeshDataset3dGeometry( QgsMeshLayer *layer,
const QgsDateTimeRange &timeRange,
const QgsVector3D &origin,
const QgsMesh3DSymbol *symbol,
Qt3DCore::QNode *parent )
: QgsMesh3dGeometry( layer, origin, symbol, parent )
QgsMeshDataset3dGeometry::QgsMeshDataset3dGeometry(
const QgsTriangularMesh &triangularMesh,
QgsMeshLayer *layer,
const QgsDateTimeRange &timeRange,
const QgsVector3D &origin,
const QgsMesh3DSymbol *symbol,
Qt3DCore::QNode *parent )
: QgsMesh3dGeometry( triangularMesh, origin, symbol, parent )
, mIsVerticalMagnitudeRelative( symbol->isVerticalMagnitudeRelative() )
, mVerticalGroupDatasetIndex( symbol->verticalDatasetGroupIndex() )
, mTimeRange( timeRange )
, mLayerRef( layer )
{
init();
}

void QgsMeshDataset3dGeometry::init()
{
QgsMeshLayer *layer = meshLayer();

if ( !layer )
return;

if ( mVerticalGroupDatasetIndex < 0 )
return;

Expand All @@ -353,10 +343,9 @@ void QgsMeshDataset3dGeometry::init()
if ( activefaceCount == 0 )
return;

QgsTriangularMesh triangularMesh = *layer->triangularMesh();

if ( verticaleMagnitude.count() != triangularMesh.vertices().count() ||
scalarMagnitude.count() != triangularMesh.vertices().count() )
if ( verticaleMagnitude.count() != mTriangulaMesh.vertices().count() ||
scalarMagnitude.count() != mTriangulaMesh.vertices().count() )
return;

#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Expand All @@ -371,7 +360,7 @@ void QgsMeshDataset3dGeometry::init()
3 /*normale*/ +
1 /*magnitude*/ ) * sizeof( float );

const uint nVerts = uint( triangularMesh.vertices().count() );
const uint nVerts = uint( mTriangulaMesh.vertices().count() );

prepareVerticesPositionAttribute( vertexBuffer, nVerts, stride, 0 );
prepareVerticesNormalAttribute( vertexBuffer, nVerts, stride, 3 );
Expand All @@ -381,11 +370,11 @@ void QgsMeshDataset3dGeometry::init()


Qt3DRender::QBufferDataGeneratorPtr vertexDataGenerator = Qt3DRender::QBufferDataGeneratorPtr(
new MeshDatasetVertexBufferFunctor( triangularMesh, verticaleMagnitude, scalarMagnitude, mOrigin, mVertScale, mIsVerticalMagnitudeRelative ) );
new MeshDatasetVertexBufferFunctor( mTriangulaMesh, verticaleMagnitude, scalarMagnitude, mOrigin, mVertScale, mIsVerticalMagnitudeRelative ) );
vertexBuffer->setDataGenerator( vertexDataGenerator );

Qt3DRender::QBufferDataGeneratorPtr indexDataGenerator( new MeshDatasetIndexBufferFunctor(
triangularMesh, activeFaces, activefaceCount ) );
mTriangulaMesh, activeFaces, activefaceCount ) );
indexBuffer->setDataGenerator( indexDataGenerator );
}

Expand All @@ -404,7 +393,6 @@ int QgsMeshDataset3dGeometry::extractDataset( QVector<double> &verticalMagnitude
if ( mVerticalGroupDatasetIndex < 0 )
return 0;

QgsTriangularMesh triangularMesh = *layer->triangularMesh();
const QgsMesh nativeMesh = *layer->nativeMesh();

//extract the scalar dataset used to render vertical magnitude of geometry
Expand All @@ -429,11 +417,11 @@ int QgsMeshDataset3dGeometry::extractDataset( QVector<double> &verticalMagnitude
//count active faces
int activeTriangularCount = 0;
if ( activeFaceFlagValues.active().isEmpty() )
activeTriangularCount = triangularMesh.triangles().count();
activeTriangularCount = mTriangulaMesh.triangles().count();
else
for ( int i = 0; i < triangularMesh.triangles().count(); ++i )
for ( int i = 0; i < mTriangulaMesh.triangles().count(); ++i )
{
int nativeIndex = triangularMesh.trianglesToNativeFaces()[i];
int nativeIndex = mTriangulaMesh.trianglesToNativeFaces()[i];
if ( activeFaceFlagValues.active( nativeIndex ) )
activeTriangularCount++;
}
Expand All @@ -450,22 +438,18 @@ int QgsMeshDataset3dGeometry::extractDataset( QVector<double> &verticalMagnitude
}


QgsMeshTerrain3dGeometry::QgsMeshTerrain3dGeometry( QgsMeshLayer *layer,
const QgsVector3D &origin,
const QgsMesh3DSymbol *symbol,
Qt3DCore::QNode *parent )
: QgsMesh3dGeometry( layer, origin, symbol, parent )
QgsMeshTerrain3dGeometry::QgsMeshTerrain3dGeometry(
const QgsTriangularMesh &triangularMesh,
const QgsVector3D &origin,
const QgsMesh3DSymbol *symbol,
Qt3DCore::QNode *parent )
: QgsMesh3dGeometry( triangularMesh, origin, symbol, parent )
{
init();
}

void QgsMeshTerrain3dGeometry::init()
{
QgsMeshLayer *layer = meshLayer();

if ( !layer )
return;

#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
Qt3DRender::QBuffer *vertexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this );
Qt3DRender::QBuffer *indexBuffer = new Qt3DRender::QBuffer( Qt3DRender::QBuffer::IndexBuffer, this );
Expand All @@ -474,22 +458,20 @@ void QgsMeshTerrain3dGeometry::init()
Qt3DRender::QBuffer *indexBuffer = new Qt3DRender::QBuffer( this );
#endif

QgsTriangularMesh triangularMesh = *layer->triangularMesh();

const int stride = ( 3 /*position*/ +
3 /*normale*/ ) * sizeof( float );

const uint nVerts = uint( triangularMesh.vertices().count() );
const uint nVerts = uint( mTriangulaMesh.vertices().count() );

prepareVerticesPositionAttribute( vertexBuffer, nVerts, stride, 0 );
prepareVerticesNormalAttribute( vertexBuffer, nVerts, stride, 3 );
prepareIndexesAttribute( indexBuffer, triangularMesh.triangles().count() );
prepareIndexesAttribute( indexBuffer, mTriangulaMesh.triangles().count() );

Qt3DRender::QBufferDataGeneratorPtr vertexDataGenerator =
Qt3DRender::QBufferDataGeneratorPtr( new MeshTerrainVertexBufferFunctor( triangularMesh, mOrigin, mVertScale ) );
Qt3DRender::QBufferDataGeneratorPtr( new MeshTerrainVertexBufferFunctor( mTriangulaMesh, mOrigin, mVertScale ) );
vertexBuffer->setDataGenerator( vertexDataGenerator );

Qt3DRender::QBufferDataGeneratorPtr indexDataGenerator( new MeshTerrainIndexBufferFunctor( triangularMesh ) );
Qt3DRender::QBufferDataGeneratorPtr indexDataGenerator( new MeshTerrainIndexBufferFunctor( mTriangulaMesh ) );
indexBuffer->setDataGenerator( indexDataGenerator );

}
Expand Down Expand Up @@ -542,6 +524,11 @@ void QgsMeshDataset3dGeometry::prepareVerticesDatasetAttribute( Qt3DRender::QBuf
addAttribute( magnitudeAttribute );
}

QgsMeshLayer *QgsMeshDataset3dGeometry::meshLayer() const
{
return qobject_cast<QgsMeshLayer *>( mLayerRef.layer.data() );
}

void QgsMesh3dGeometry::prepareIndexesAttribute( Qt3DRender::QBuffer *buffer, int trianglesCount )
{

Expand All @@ -550,7 +537,7 @@ void QgsMesh3dGeometry::prepareIndexesAttribute( Qt3DRender::QBuffer *buffer, in
indexAttribute->setVertexBaseType( QAttribute::UnsignedInt );
indexAttribute->setBuffer( buffer );

// Each primitive has 3 vertives
// Each primitive has 3 vertices
indexAttribute->setCount( trianglesCount * 3 );

addAttribute( indexAttribute );
Expand Down
18 changes: 9 additions & 9 deletions src/3d/mesh/qgsmesh3dgeometry_p.h
Expand Up @@ -28,6 +28,7 @@

#include "qgsmaplayerref.h"
#include "qgsmesh3dsymbol.h"
#include "qgstriangularmesh.h"

///@cond PRIVATE

Expand Down Expand Up @@ -55,12 +56,9 @@ class QgsMeshLayer;
*/
class QgsMesh3dGeometry: public Qt3DRender::QGeometry
{
public:
QgsMeshLayer *meshLayer() const;

protected:
//! Constructor
explicit QgsMesh3dGeometry( QgsMeshLayer *layer,
explicit QgsMesh3dGeometry( const QgsTriangularMesh &triangularMesh,
const QgsVector3D &origin,
const QgsMesh3DSymbol *symbol,
QNode *parent );
Expand All @@ -71,10 +69,8 @@ class QgsMesh3dGeometry: public Qt3DRender::QGeometry

QgsVector3D mOrigin;
float mVertScale;
QgsTriangularMesh mTriangulaMesh;

private:

QgsMapLayerRef mLayerRef;
};

/**
Expand All @@ -84,7 +80,8 @@ class QgsMeshDataset3dGeometry: public QgsMesh3dGeometry
{
public:
//! Constructs a mesh layer geometry from triangular mesh.
explicit QgsMeshDataset3dGeometry( QgsMeshLayer *layer,
explicit QgsMeshDataset3dGeometry( const QgsTriangularMesh &triangularMesh,
QgsMeshLayer *layer,
const QgsDateTimeRange &timeRange,
const QgsVector3D &origin,
const QgsMesh3DSymbol *symbol,
Expand All @@ -100,6 +97,9 @@ class QgsMeshDataset3dGeometry: public QgsMesh3dGeometry
bool mIsVerticalMagnitudeRelative;
int mVerticalGroupDatasetIndex;
QgsDateTimeRange mTimeRange;
QgsMapLayerRef mLayerRef;

QgsMeshLayer *meshLayer() const;

};

Expand All @@ -110,7 +110,7 @@ class QgsMeshTerrain3dGeometry: public QgsMesh3dGeometry
{
public:
//! Constructs a mesh layer geometry from triangular mesh.
explicit QgsMeshTerrain3dGeometry( QgsMeshLayer *layer,
explicit QgsMeshTerrain3dGeometry( const QgsTriangularMesh &triangularMesh,
const QgsVector3D &origin,
const QgsMesh3DSymbol *symbol,
QNode *parent );
Expand Down

0 comments on commit 04d665f

Please sign in to comment.