mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-12 00:02:25 -04:00
fix triangles flickering for 3D mesh rendering
This commit is contained in:
parent
ec59d3b801
commit
f00b056023
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 );
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user