Skip to content

Commit

Permalink
fix triangles flickering for 3D mesh rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
vcloarec authored and nyalldawson committed Jan 20, 2020
1 parent ec59d3b commit f00b056
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 13 deletions.
7 changes: 4 additions & 3 deletions src/3d/mesh/qgsmesh3dentity_p.cpp
Expand Up @@ -53,14 +53,15 @@ void QgsMesh3dEntity::buildGeometry()
}

mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh,
mMapSettings.origin(),
mExtent,
mSymbol.verticaleScale(),
mesh ) );

addComponent( mesh );

Qt3DCore::QTransform *tform = new Qt3DCore::QTransform;
tform->setTranslation( QVector3D( float( -mMapSettings.origin().x() ), 0, float( mMapSettings.origin().y() ) ) );
tform->setTranslation( QVector3D( 0, 0, 0 ) ) ;
addComponent( tform );
}

Expand Down Expand Up @@ -93,11 +94,11 @@ void QgsMesh3dTerrainTileEntity::buildGeometry()
{
Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer;

mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh, mExtent, mSymbol.verticaleScale(), mesh ) );
mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh, mMapSettings.origin(), mExtent, mSymbol.verticaleScale(), mesh ) );
addComponent( mesh );

Qt3DCore::QTransform *tform = new Qt3DCore::QTransform;
tform->setTranslation( QVector3D( float( -mMapSettings.origin().x() ), 0, float( mMapSettings.origin().y() ) ) );
tform->setTranslation( QVector3D( 0, 0, 0 ) );
addComponent( tform );
}

Expand Down
24 changes: 17 additions & 7 deletions src/3d/mesh/qgsmesh3dgeometry_p.cpp
Expand Up @@ -26,7 +26,10 @@

using namespace Qt3DRender;

static QByteArray createPlaneVertexData( const QgsTriangularMesh &mesh, const QgsRectangle &extent, float vertScale )
static QByteArray createPlaneVertexData( const QgsTriangularMesh &mesh,
const QgsVector3D &origin,
const QgsRectangle &extent,
float vertScale )
{
const int nVerts = mesh.vertices().count();

Expand All @@ -49,9 +52,9 @@ static QByteArray createPlaneVertexData( const QgsTriangularMesh &mesh, const Qg
for ( int i = 0; i < nVerts; i++ )
{
const QgsMeshVertex &vert = mesh.vertices().at( i );
*fptr++ = float( vert.x() );
*fptr++ = float( vert.z() ) * vertScale ;
*fptr++ = float( -vert.y() );
*fptr++ = float( vert.x() - origin.x() );
*fptr++ = float( vert.z() - origin.z() ) * vertScale ;
*fptr++ = float( -vert.y() + origin.y() );

*fptr++ = float( ( vert.x() - x0 ) / w );
*fptr++ = float( ( y0 - vert.y() ) / h );
Expand Down Expand Up @@ -144,16 +147,20 @@ static QByteArray createPlaneIndexData( const QgsTriangularMesh &mesh )
class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator
{
public:
explicit MeshPlaneVertexBufferFunctor( const QgsTriangularMesh &mesh, const QgsRectangle &extent, float vertScale )
explicit MeshPlaneVertexBufferFunctor( const QgsTriangularMesh &mesh,
const QgsVector3D &origin,
const QgsRectangle &extent,
float vertScale )
: mMesh( mesh ),
mOrigin( origin ),
mExtent( extent ),
mVertScale( vertScale )

{}

QByteArray operator()() final
{
return createPlaneVertexData( mMesh, mExtent, mVertScale );
return createPlaneVertexData( mMesh, mOrigin, mExtent, mVertScale );
}

bool operator ==( const QBufferDataGenerator &other ) const final
Expand All @@ -171,6 +178,7 @@ class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator
private:

QgsTriangularMesh mMesh;
QgsVector3D mOrigin;
QgsRectangle mExtent;
float mVertScale;

Expand Down Expand Up @@ -253,11 +261,13 @@ class MeshPlaneVertexDatasetBufferFunctor : public QBufferDataGenerator

QgsMesh3dGeometry::QgsMesh3dGeometry(
const QgsTriangularMesh &mesh,
const QgsVector3D &origin,
const QgsRectangle &extent,
float verticaleScale,
QgsMesh3dGeometry::QNode *parent ):
QGeometry( parent ),
mTriangularMesh( mesh ),
mOrigin( origin ),
mExtent( extent ),
mVertScale( verticaleScale )
{
Expand Down Expand Up @@ -313,7 +323,7 @@ void QgsMesh3dGeometry::init()
// Each primitive has 3 vertives
mIndexAttribute->setCount( uint( mTriangularMesh.triangles().count() ) * 3 );

mVertexBuffer->setData( MeshPlaneVertexBufferFunctor( mTriangularMesh, mExtent, mVertScale )() );
mVertexBuffer->setData( MeshPlaneVertexBufferFunctor( mTriangularMesh, mOrigin, mExtent, mVertScale )() );
mIndexBuffer->setData( MeshPlaneIndexBufferFunctor( mTriangularMesh )() );

addAttribute( mPositionAttribute );
Expand Down
7 changes: 4 additions & 3 deletions src/3d/mesh/qgsmesh3dgeometry_p.h
Expand Up @@ -22,6 +22,8 @@
#include <Qt3DRender/qgeometry.h>
#include <QVector3D>

#include <qgsvector3d.h>

#include "qgstriangularmesh.h"

///@cond PRIVATE
Expand Down Expand Up @@ -51,12 +53,13 @@ class QgsMesh3dGeometry: public Qt3DRender::QGeometry
public:

//! Constructs a mesh layer geometry from triangular mesh.
explicit QgsMesh3dGeometry( const QgsTriangularMesh &mesh, const QgsRectangle &extent, float verticaleScale, QNode *parent );
explicit QgsMesh3dGeometry( const QgsTriangularMesh &mesh, const QgsVector3D &origin, const QgsRectangle &extent, float verticaleScale, QNode *parent );

private:
void init();

QgsTriangularMesh mTriangularMesh;
QgsVector3D mOrigin;
QgsRectangle mExtent;
float mVertScale;

Expand All @@ -66,10 +69,8 @@ class QgsMesh3dGeometry: public Qt3DRender::QGeometry
Qt3DRender::QAttribute *mIndexAttribute = nullptr;
Qt3DRender::QBuffer *mVertexBuffer = nullptr;
Qt3DRender::QBuffer *mIndexBuffer = nullptr;

};


///@endcond

#endif // QGSMESHGEOMETRY_P_H

0 comments on commit f00b056

Please sign in to comment.