18 #include <Qt3DRender/QAttribute> 19 #include <Qt3DRender/QBuffer> 20 #include <Qt3DRender/QBufferDataGenerator> 31 mVertexBuffer =
new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer,
this );
34 const int stride = tmpTess.
stride();
36 mPositionAttribute =
new Qt3DRender::QAttribute(
this );
37 mPositionAttribute->setName( Qt3DRender::QAttribute::defaultPositionAttributeName() );
38 mPositionAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
39 mPositionAttribute->setVertexSize( 3 );
40 mPositionAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
41 mPositionAttribute->setBuffer( mVertexBuffer );
42 mPositionAttribute->setByteStride( stride );
43 addAttribute( mPositionAttribute );
47 mNormalAttribute =
new Qt3DRender::QAttribute(
this );
48 mNormalAttribute->setName( Qt3DRender::QAttribute::defaultNormalAttributeName() );
49 mNormalAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
50 mNormalAttribute->setVertexSize( 3 );
51 mNormalAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
52 mNormalAttribute->setBuffer( mVertexBuffer );
53 mNormalAttribute->setByteStride( stride );
54 mNormalAttribute->setByteOffset( 3 *
sizeof(
float ) );
55 addAttribute( mNormalAttribute );
61 Q_ASSERT( polygons.count() == featureIds.count() );
62 mTriangleIndexStartingIndices.reserve( polygons.count() );
63 mTriangleIndexFids.reserve( polygons.count() );
65 QgsTessellator tessellator( origin.
x(), origin.
y(), mWithNormals, mInvertNormals, mAddBackFaces );
66 for (
int i = 0; i < polygons.count(); ++i )
68 Q_ASSERT( tessellator.dataVerticesCount() % 3 == 0 );
69 uint startingTriangleIndex =
static_cast<uint
>( tessellator.dataVerticesCount() / 3 );
70 mTriangleIndexStartingIndices.append( startingTriangleIndex );
71 mTriangleIndexFids.append( featureIds[i] );
74 float extr = extrusionHeightPerPolygon.
isEmpty() ? extrusionHeight : extrusionHeightPerPolygon.at( i );
75 tessellator.addPolygon( *polygon, extr );
78 qDeleteAll( polygons );
80 QByteArray data( (
const char * )tessellator.data().constData(), tessellator.data().count() *
sizeof( float ) );
81 int nVerts = data.count() / tessellator.stride();
83 mVertexBuffer->setData( data );
84 mPositionAttribute->setCount( nVerts );
85 if ( mNormalAttribute )
86 mNormalAttribute->setCount( nVerts );
91 static int binary_search( uint v,
const uint *data,
int count )
99 while ( idx0 != idx1 )
101 int idxPivot = ( idx0 + idx1 ) / 2;
102 uint pivot = data[idxPivot];
105 if ( data[idxPivot + 1] > v )
119 int i = binary_search( triangleIndex, mTriangleIndexStartingIndices.constData(), mTriangleIndexStartingIndices.count() );
121 return mTriangleIndexFids[i];
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.
QgsTessellatedPolygonGeometry(QNode *parent=nullptr)
Constructor.
bool isEmpty() const override
Returns true if the geometry is empty.