18 #include <Qt3DRender/QAttribute>    19 #include <Qt3DRender/QBuffer>    20 #include <Qt3DRender/QBufferDataGenerator>    31 #if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)    32   mVertexBuffer = 
new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, 
this );
    34   mVertexBuffer = 
new Qt3DRender::QBuffer( 
this );
    38   const int stride = tmpTess.
stride();
    40   mPositionAttribute = 
new Qt3DRender::QAttribute( 
this );
    41   mPositionAttribute->setName( Qt3DRender::QAttribute::defaultPositionAttributeName() );
    42   mPositionAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
    43   mPositionAttribute->setVertexSize( 3 );
    44   mPositionAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
    45   mPositionAttribute->setBuffer( mVertexBuffer );
    46   mPositionAttribute->setByteStride( stride );
    47   addAttribute( mPositionAttribute );
    51     mNormalAttribute = 
new Qt3DRender::QAttribute( 
this );
    52     mNormalAttribute->setName( Qt3DRender::QAttribute::defaultNormalAttributeName() );
    53     mNormalAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
    54     mNormalAttribute->setVertexSize( 3 );
    55     mNormalAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
    56     mNormalAttribute->setBuffer( mVertexBuffer );
    57     mNormalAttribute->setByteStride( stride );
    58     mNormalAttribute->setByteOffset( 3 * 
sizeof( 
float ) );
    59     addAttribute( mNormalAttribute );
    65   Q_ASSERT( polygons.count() == featureIds.count() );
    66   mTriangleIndexStartingIndices.reserve( polygons.count() );
    67   mTriangleIndexFids.reserve( polygons.count() );
    69   QgsTessellator tessellator( origin.
x(), origin.
y(), mWithNormals, mInvertNormals, mAddBackFaces );
    70   for ( 
int i = 0; i < polygons.count(); ++i )
    72     Q_ASSERT( tessellator.dataVerticesCount() % 3 == 0 );
    73     uint startingTriangleIndex = 
static_cast<uint
>( tessellator.dataVerticesCount() / 3 );
    74     mTriangleIndexStartingIndices.append( startingTriangleIndex );
    75     mTriangleIndexFids.append( featureIds[i] );
    78     float extr = extrusionHeightPerPolygon.
isEmpty() ? extrusionHeight : extrusionHeightPerPolygon.at( i );
    79     tessellator.addPolygon( *polygon, extr );
    82   qDeleteAll( polygons );
    84   QByteArray data( ( 
const char * )tessellator.data().constData(), tessellator.data().count() * 
sizeof( float ) );
    85   int nVerts = data.count() / tessellator.stride();
    87   mVertexBuffer->setData( data );
    88   mPositionAttribute->setCount( nVerts );
    89   if ( mNormalAttribute )
    90     mNormalAttribute->setCount( nVerts );
    93 void QgsTessellatedPolygonGeometry::setData( 
const QByteArray &vertexBufferData, 
int vertexCount, 
const QVector<QgsFeatureId> &triangleIndexFids, 
const QVector<uint> &triangleIndexStartingIndices )
    95   mTriangleIndexStartingIndices = triangleIndexStartingIndices;
    96   mTriangleIndexFids = triangleIndexFids;
    98   mVertexBuffer->setData( vertexBufferData );
    99   mPositionAttribute->setCount( vertexCount );
   100   if ( mNormalAttribute )
   101     mNormalAttribute->setCount( vertexCount );
   106 static int binary_search( uint v, 
const uint *data, 
int count )
   109   int idx1 = count - 1;
   111   if ( v < data[0] || v >= data[count - 1] )
   114   while ( idx0 != idx1 )
   116     int idxPivot = ( idx0 + idx1 ) / 2;
   117     uint pivot = data[idxPivot];
   120       if ( data[idxPivot + 1] > v )
   134   int i = binary_search( triangleIndex, mTriangleIndexStartingIndices.constData(), mTriangleIndexStartingIndices.count() );
   135   return i != -1 ? mTriangleIndexFids[i] : 
FID_NULL;
 QgsFeatureId triangleIndexToFeatureId(uint triangleIndex) const
Returns ID of the feature to which given triangle index belongs (used for picking). 
 
A class to represent a 2D point. 
 
int stride() const
Returns size of one vertex entry in bytes. 
 
void setPolygons(const QList< QgsPolygon *> &polygons, const QList< QgsFeatureId > &featureIds, const QgsPointXY &origin, float extrusionHeight, const QList< float > &extrusionHeightPerPolygon=QList< float >())
Initializes vertex buffer from given polygons. Takes ownership of passed polygon geometries. 
 
Class that takes care of tessellation of polygons into triangles. 
 
void setData(const QByteArray &vertexBufferData, int vertexCount, const QVector< QgsFeatureId > &triangleIndexFids, const QVector< uint > &triangleIndexStartingIndices)
Initializes vertex buffer (and other members) from data that were already tessellated. 
 
QgsTessellatedPolygonGeometry(QNode *parent=nullptr)
Constructor. 
 
bool isEmpty() const override
Returns true if the geometry is empty.