Skip to content

Commit f00b056

Browse files
vcloarecnyalldawson
authored andcommittedJan 20, 2020
fix triangles flickering for 3D mesh rendering
1 parent ec59d3b commit f00b056

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed
 

‎src/3d/mesh/qgsmesh3dentity_p.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,15 @@ void QgsMesh3dEntity::buildGeometry()
5353
}
5454

5555
mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh,
56+
mMapSettings.origin(),
5657
mExtent,
5758
mSymbol.verticaleScale(),
5859
mesh ) );
5960

6061
addComponent( mesh );
6162

6263
Qt3DCore::QTransform *tform = new Qt3DCore::QTransform;
63-
tform->setTranslation( QVector3D( float( -mMapSettings.origin().x() ), 0, float( mMapSettings.origin().y() ) ) );
64+
tform->setTranslation( QVector3D( 0, 0, 0 ) ) ;
6465
addComponent( tform );
6566
}
6667

@@ -93,11 +94,11 @@ void QgsMesh3dTerrainTileEntity::buildGeometry()
9394
{
9495
Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer;
9596

96-
mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh, mExtent, mSymbol.verticaleScale(), mesh ) );
97+
mesh->setGeometry( new QgsMesh3dGeometry( mTriangularMesh, mMapSettings.origin(), mExtent, mSymbol.verticaleScale(), mesh ) );
9798
addComponent( mesh );
9899

99100
Qt3DCore::QTransform *tform = new Qt3DCore::QTransform;
100-
tform->setTranslation( QVector3D( float( -mMapSettings.origin().x() ), 0, float( mMapSettings.origin().y() ) ) );
101+
tform->setTranslation( QVector3D( 0, 0, 0 ) );
101102
addComponent( tform );
102103
}
103104

‎src/3d/mesh/qgsmesh3dgeometry_p.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626

2727
using namespace Qt3DRender;
2828

29-
static QByteArray createPlaneVertexData( const QgsTriangularMesh &mesh, const QgsRectangle &extent, float vertScale )
29+
static QByteArray createPlaneVertexData( const QgsTriangularMesh &mesh,
30+
const QgsVector3D &origin,
31+
const QgsRectangle &extent,
32+
float vertScale )
3033
{
3134
const int nVerts = mesh.vertices().count();
3235

@@ -49,9 +52,9 @@ static QByteArray createPlaneVertexData( const QgsTriangularMesh &mesh, const Qg
4952
for ( int i = 0; i < nVerts; i++ )
5053
{
5154
const QgsMeshVertex &vert = mesh.vertices().at( i );
52-
*fptr++ = float( vert.x() );
53-
*fptr++ = float( vert.z() ) * vertScale ;
54-
*fptr++ = float( -vert.y() );
55+
*fptr++ = float( vert.x() - origin.x() );
56+
*fptr++ = float( vert.z() - origin.z() ) * vertScale ;
57+
*fptr++ = float( -vert.y() + origin.y() );
5558

5659
*fptr++ = float( ( vert.x() - x0 ) / w );
5760
*fptr++ = float( ( y0 - vert.y() ) / h );
@@ -144,16 +147,20 @@ static QByteArray createPlaneIndexData( const QgsTriangularMesh &mesh )
144147
class MeshPlaneVertexBufferFunctor : public QBufferDataGenerator
145148
{
146149
public:
147-
explicit MeshPlaneVertexBufferFunctor( const QgsTriangularMesh &mesh, const QgsRectangle &extent, float vertScale )
150+
explicit MeshPlaneVertexBufferFunctor( const QgsTriangularMesh &mesh,
151+
const QgsVector3D &origin,
152+
const QgsRectangle &extent,
153+
float vertScale )
148154
: mMesh( mesh ),
155+
mOrigin( origin ),
149156
mExtent( extent ),
150157
mVertScale( vertScale )
151158

152159
{}
153160

154161
QByteArray operator()() final
155162
{
156-
return createPlaneVertexData( mMesh, mExtent, mVertScale );
163+
return createPlaneVertexData( mMesh, mOrigin, mExtent, mVertScale );
157164
}
158165

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

173180
QgsTriangularMesh mMesh;
181+
QgsVector3D mOrigin;
174182
QgsRectangle mExtent;
175183
float mVertScale;
176184

@@ -253,11 +261,13 @@ class MeshPlaneVertexDatasetBufferFunctor : public QBufferDataGenerator
253261

254262
QgsMesh3dGeometry::QgsMesh3dGeometry(
255263
const QgsTriangularMesh &mesh,
264+
const QgsVector3D &origin,
256265
const QgsRectangle &extent,
257266
float verticaleScale,
258267
QgsMesh3dGeometry::QNode *parent ):
259268
QGeometry( parent ),
260269
mTriangularMesh( mesh ),
270+
mOrigin( origin ),
261271
mExtent( extent ),
262272
mVertScale( verticaleScale )
263273
{
@@ -313,7 +323,7 @@ void QgsMesh3dGeometry::init()
313323
// Each primitive has 3 vertives
314324
mIndexAttribute->setCount( uint( mTriangularMesh.triangles().count() ) * 3 );
315325

316-
mVertexBuffer->setData( MeshPlaneVertexBufferFunctor( mTriangularMesh, mExtent, mVertScale )() );
326+
mVertexBuffer->setData( MeshPlaneVertexBufferFunctor( mTriangularMesh, mOrigin, mExtent, mVertScale )() );
317327
mIndexBuffer->setData( MeshPlaneIndexBufferFunctor( mTriangularMesh )() );
318328

319329
addAttribute( mPositionAttribute );

‎src/3d/mesh/qgsmesh3dgeometry_p.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include <Qt3DRender/qgeometry.h>
2323
#include <QVector3D>
2424

25+
#include <qgsvector3d.h>
26+
2527
#include "qgstriangularmesh.h"
2628

2729
///@cond PRIVATE
@@ -51,12 +53,13 @@ class QgsMesh3dGeometry: public Qt3DRender::QGeometry
5153
public:
5254

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

5658
private:
5759
void init();
5860

5961
QgsTriangularMesh mTriangularMesh;
62+
QgsVector3D mOrigin;
6063
QgsRectangle mExtent;
6164
float mVertScale;
6265

@@ -66,10 +69,8 @@ class QgsMesh3dGeometry: public Qt3DRender::QGeometry
6669
Qt3DRender::QAttribute *mIndexAttribute = nullptr;
6770
Qt3DRender::QBuffer *mVertexBuffer = nullptr;
6871
Qt3DRender::QBuffer *mIndexBuffer = nullptr;
69-
7072
};
7173

72-
7374
///@endcond
7475

7576
#endif // QGSMESHGEOMETRY_P_H

0 commit comments

Comments
 (0)
Please sign in to comment.