fix triangles flickering for 3D mesh rendering

This commit is contained in:
vcloarec 2020-01-18 23:47:24 -04:00 committed by Nyall Dawson
parent ec59d3b801
commit f00b056023
3 changed files with 25 additions and 13 deletions

View File

@ -53,6 +53,7 @@ void QgsMesh3dEntity::buildGeometry()
} }
mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh, mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh,
mMapSettings.origin(),
mExtent, mExtent,
mSymbol.verticaleScale(), mSymbol.verticaleScale(),
mesh ) ); mesh ) );
@ -60,7 +61,7 @@ void QgsMesh3dEntity::buildGeometry()
addComponent( mesh ); addComponent( mesh );
Qt3DCore::QTransform *tform = new Qt3DCore::QTransform; 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 ); addComponent( tform );
} }
@ -93,11 +94,11 @@ void QgsMesh3dTerrainTileEntity::buildGeometry()
{ {
Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer; 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 ); addComponent( mesh );
Qt3DCore::QTransform *tform = new Qt3DCore::QTransform; 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 ); addComponent( tform );
} }

View File

@ -26,7 +26,10 @@
using namespace Qt3DRender; 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(); const int nVerts = mesh.vertices().count();
@ -49,9 +52,9 @@ static QByteArray createPlaneVertexData( const QgsTriangularMesh &mesh, const Qg
for ( int i = 0; i < nVerts; i++ ) for ( int i = 0; i < nVerts; i++ )
{ {
const QgsMeshVertex &vert = mesh.vertices().at( i ); const QgsMeshVertex &vert = mesh.vertices().at( i );
*fptr++ = float( vert.x() ); *fptr++ = float( vert.x() - origin.x() );
*fptr++ = float( vert.z() ) * vertScale ; *fptr++ = float( vert.z() - origin.z() ) * vertScale ;
*fptr++ = float( -vert.y() ); *fptr++ = float( -vert.y() + origin.y() );
*fptr++ = float( ( vert.x() - x0 ) / w ); *fptr++ = float( ( vert.x() - x0 ) / w );
*fptr++ = float( ( y0 - vert.y() ) / h ); *fptr++ = float( ( y0 - vert.y() ) / h );
@ -144,8 +147,12 @@ static QByteArray createPlaneIndexData( const QgsTriangularMesh &mesh )
class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator
{ {
public: 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 ), : mMesh( mesh ),
mOrigin( origin ),
mExtent( extent ), mExtent( extent ),
mVertScale( vertScale ) mVertScale( vertScale )
@ -153,7 +160,7 @@ class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator
QByteArray operator()() final QByteArray operator()() final
{ {
return createPlaneVertexData( mMesh, mExtent, mVertScale ); return createPlaneVertexData( mMesh, mOrigin, mExtent, mVertScale );
} }
bool operator ==( const QBufferDataGenerator &other ) const final bool operator ==( const QBufferDataGenerator &other ) const final
@ -171,6 +178,7 @@ class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator
private: private:
QgsTriangularMesh mMesh; QgsTriangularMesh mMesh;
QgsVector3D mOrigin;
QgsRectangle mExtent; QgsRectangle mExtent;
float mVertScale; float mVertScale;
@ -253,11 +261,13 @@ class MeshPlaneVertexDatasetBufferFunctor : public QBufferDataGenerator
QgsMesh3dGeometry::QgsMesh3dGeometry( QgsMesh3dGeometry::QgsMesh3dGeometry(
const QgsTriangularMesh &mesh, const QgsTriangularMesh &mesh,
const QgsVector3D &origin,
const QgsRectangle &extent, const QgsRectangle &extent,
float verticaleScale, float verticaleScale,
QgsMesh3dGeometry::QNode *parent ): QgsMesh3dGeometry::QNode *parent ):
QGeometry( parent ), QGeometry( parent ),
mTriangularMesh( mesh ), mTriangularMesh( mesh ),
mOrigin( origin ),
mExtent( extent ), mExtent( extent ),
mVertScale( verticaleScale ) mVertScale( verticaleScale )
{ {
@ -313,7 +323,7 @@ void QgsMesh3dGeometry::init()
// Each primitive has 3 vertives // Each primitive has 3 vertives
mIndexAttribute->setCount( uint( mTriangularMesh.triangles().count() ) * 3 ); mIndexAttribute->setCount( uint( mTriangularMesh.triangles().count() ) * 3 );
mVertexBuffer->setData( MeshPlaneVertexBufferFunctor( mTriangularMesh, mExtent, mVertScale )() ); mVertexBuffer->setData( MeshPlaneVertexBufferFunctor( mTriangularMesh, mOrigin, mExtent, mVertScale )() );
mIndexBuffer->setData( MeshPlaneIndexBufferFunctor( mTriangularMesh )() ); mIndexBuffer->setData( MeshPlaneIndexBufferFunctor( mTriangularMesh )() );
addAttribute( mPositionAttribute ); addAttribute( mPositionAttribute );

View File

@ -22,6 +22,8 @@
#include <Qt3DRender/qgeometry.h> #include <Qt3DRender/qgeometry.h>
#include <QVector3D> #include <QVector3D>
#include <qgsvector3d.h>
#include "qgstriangularmesh.h" #include "qgstriangularmesh.h"
///@cond PRIVATE ///@cond PRIVATE
@ -51,12 +53,13 @@ class QgsMesh3dGeometry: public Qt3DRender::QGeometry
public: public:
//! Constructs a mesh layer geometry from triangular mesh. //! 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: private:
void init(); void init();
QgsTriangularMesh mTriangularMesh; QgsTriangularMesh mTriangularMesh;
QgsVector3D mOrigin;
QgsRectangle mExtent; QgsRectangle mExtent;
float mVertScale; float mVertScale;
@ -66,10 +69,8 @@ class QgsMesh3dGeometry: public Qt3DRender::QGeometry
Qt3DRender::QAttribute *mIndexAttribute = nullptr; Qt3DRender::QAttribute *mIndexAttribute = nullptr;
Qt3DRender::QBuffer *mVertexBuffer = nullptr; Qt3DRender::QBuffer *mVertexBuffer = nullptr;
Qt3DRender::QBuffer *mIndexBuffer = nullptr; Qt3DRender::QBuffer *mIndexBuffer = nullptr;
}; };
///@endcond ///@endcond
#endif // QGSMESHGEOMETRY_P_H #endif // QGSMESHGEOMETRY_P_H