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,
mMapSettings.origin(),
mExtent,
mSymbol.verticaleScale(),
mesh ) );
@ -60,7 +61,7 @@ void QgsMesh3dEntity::buildGeometry()
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 );
}
@ -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 );
}

View File

@ -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();
@ -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 );
@ -144,8 +147,12 @@ 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 )
@ -153,7 +160,7 @@ class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator
QByteArray operator()() final
{
return createPlaneVertexData( mMesh, mExtent, mVertScale );
return createPlaneVertexData( mMesh, mOrigin, mExtent, mVertScale );
}
bool operator ==( const QBufferDataGenerator &other ) const final
@ -171,6 +178,7 @@ class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator
private:
QgsTriangularMesh mMesh;
QgsVector3D mOrigin;
QgsRectangle mExtent;
float mVertScale;
@ -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 )
{
@ -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 );

View File

@ -22,6 +22,8 @@
#include <Qt3DRender/qgeometry.h>
#include <QVector3D>
#include <qgsvector3d.h>
#include "qgstriangularmesh.h"
///@cond PRIVATE
@ -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;
@ -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