@@ -132,25 +132,25 @@ static QByteArray createDatasetVertexData(
132
132
return bufferBytes;
133
133
}
134
134
135
- static QByteArray createIndexData ( const QgsTriangularMesh &mesh )
135
+ static QByteArray createIndexData ( const QgsTriangularMesh &mesh, const QgsRectangle &extent )
136
136
{
137
- const int faces = mesh.triangles (). count ( );
138
- const quint32 indices = static_cast <quint32>( 3 * faces );
137
+ const QList< int > facesInExtent = mesh.faceIndexesForRectangle ( extent );
138
+ const quint32 indices = static_cast <quint32>( 3 * facesInExtent. count () );
139
139
Q_ASSERT ( indices < std::numeric_limits<quint32>::max () );
140
140
141
141
// count non void faces
142
142
int nonVoidFaces = 0 ;
143
- for ( int i = 0 ; i < faces; ++i )
144
- if ( !mesh.triangles ().at ( i ).isEmpty () )
143
+ for ( const int nativeFaceIndex : facesInExtent )
144
+ if ( !mesh.triangles ().at ( nativeFaceIndex ).isEmpty () )
145
145
nonVoidFaces++;
146
146
147
147
QByteArray indexBytes;
148
148
indexBytes.resize ( int ( nonVoidFaces * 3 * sizeof ( quint32 ) ) );
149
149
quint32 *indexPtr = reinterpret_cast <quint32 *>( indexBytes.data () );
150
150
151
- for ( int i = 0 ; i < faces; ++i )
151
+ for ( const int nativeFaceIndex : facesInExtent )
152
152
{
153
- const QgsMeshFace &face = mesh.triangles ().at ( i );
153
+ const QgsMeshFace &face = mesh.triangles ().at ( nativeFaceIndex );
154
154
if ( face.isEmpty () )
155
155
continue ;
156
156
for ( int j = 0 ; j < 3 ; ++j )
@@ -160,36 +160,34 @@ static QByteArray createIndexData( const QgsTriangularMesh &mesh )
160
160
return indexBytes;
161
161
}
162
162
163
- static QByteArray createDatasetIndexData ( const QgsTriangularMesh &mesh, const QgsMeshDataBlock &mActiveFaceFlagValues )
163
+ static QByteArray createDatasetIndexData ( const QgsTriangularMesh &mesh, const QgsMeshDataBlock &mActiveFaceFlagValues , const QgsRectangle &extent )
164
164
{
165
+ const QList<int > facesInExtent = mesh.faceIndexesForRectangle ( extent );
165
166
int activeFaceCount = 0 ;
166
167
167
168
// First we need to know about the count of active faces
168
169
if ( mActiveFaceFlagValues .active ().isEmpty () )
169
- activeFaceCount = mesh. triangles () .count ();
170
+ activeFaceCount = facesInExtent .count ();
170
171
else
171
172
{
172
- for ( int i = 0 ; i < mesh. triangles (). count (); ++i )
173
+ for ( const int nativeFaceIndex : facesInExtent )
173
174
{
174
- const int nativeIndex = mesh.trianglesToNativeFaces ()[i];
175
- if ( mActiveFaceFlagValues .active ( nativeIndex ) )
175
+ if ( mActiveFaceFlagValues .active ( nativeFaceIndex ) )
176
176
activeFaceCount++;
177
177
}
178
178
}
179
179
180
- const int trianglesCount = mesh.triangles ().count ();
181
180
const quint32 indices = static_cast <quint32>( 3 * activeFaceCount );
182
181
QByteArray indexBytes;
183
182
indexBytes.resize ( int ( indices * sizeof ( quint32 ) ) );
184
183
quint32 *indexPtr = reinterpret_cast <quint32 *>( indexBytes.data () );
185
184
186
- for ( int i = 0 ; i < trianglesCount; ++i )
185
+ for ( const int nativeFaceIndex : facesInExtent )
187
186
{
188
- const int nativeFaceIndex = mesh.trianglesToNativeFaces ()[i];
189
187
const bool isActive = mActiveFaceFlagValues .active ().isEmpty () || mActiveFaceFlagValues .active ( nativeFaceIndex );
190
188
if ( !isActive )
191
189
continue ;
192
- const QgsMeshFace &face = mesh.triangles ().at ( i );
190
+ const QgsMeshFace &face = mesh.triangles ().at ( nativeFaceIndex );
193
191
for ( int j = 0 ; j < 3 ; ++j )
194
192
*indexPtr++ = quint32 ( face.at ( j ) );
195
193
}
@@ -199,6 +197,7 @@ static QByteArray createDatasetIndexData( const QgsTriangularMesh &mesh, const Q
199
197
200
198
QgsMesh3DGeometry::QgsMesh3DGeometry ( const QgsTriangularMesh &triangularMesh,
201
199
const QgsVector3D &origin,
200
+ const QgsRectangle &extent,
202
201
double verticalScale,
203
202
Qt3DCore::QNode *parent )
204
203
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
@@ -207,6 +206,7 @@ QgsMesh3DGeometry::QgsMesh3DGeometry( const QgsTriangularMesh &triangularMesh,
207
206
: Qt3DCore::QGeometry( parent )
208
207
#endif
209
208
, mOrigin ( origin )
209
+ , mExtent ( extent )
210
210
, mVertScale ( verticalScale )
211
211
, mTriangulaMesh ( triangularMesh )
212
212
{
@@ -219,9 +219,10 @@ QgsMeshDataset3DGeometry::QgsMeshDataset3DGeometry(
219
219
QgsMeshLayer *layer,
220
220
const QgsDateTimeRange &timeRange,
221
221
const QgsVector3D &origin,
222
+ const QgsRectangle &extent,
222
223
const QgsMesh3DSymbol *symbol,
223
224
Qt3DCore::QNode *parent )
224
- : QgsMesh3DGeometry( triangularMesh, origin, symbol->verticalScale (), parent )
225
+ : QgsMesh3DGeometry( triangularMesh, origin, extent, symbol->verticalScale (), parent )
225
226
, mIsVerticalMagnitudeRelative( symbol->isVerticalMagnitudeRelative () )
226
227
, mVerticalGroupDatasetIndex( symbol->verticalDatasetGroupIndex () )
227
228
, mTimeRange( timeRange )
@@ -310,7 +311,7 @@ void QgsMeshDataset3DGeometry::prepareData()
310
311
data.activeFaceFlagValues = layer->areFacesActive ( scalarDatasetIndex, 0 , nativeMesh.faces .count () );
311
312
data.isVerticalMagnitudeRelative = mIsVerticalMagnitudeRelative ;
312
313
313
- mBuilder = new QgsMeshDataset3DGeometryBuilder ( mTriangulaMesh , nativeMesh, mOrigin , mVertScale , data, this );
314
+ mBuilder = new QgsMeshDataset3DGeometryBuilder ( mTriangulaMesh , nativeMesh, mOrigin , mExtent , mVertScale , data, this );
314
315
connect ( mBuilder , &QgsMeshDataset3DGeometryBuilder::dataIsReady, this , &QgsMeshDataset3DGeometry::getData );
315
316
316
317
mBuilder ->start ();
@@ -319,9 +320,10 @@ void QgsMeshDataset3DGeometry::prepareData()
319
320
320
321
QgsMeshTerrain3DGeometry::QgsMeshTerrain3DGeometry ( const QgsTriangularMesh &triangularMesh,
321
322
const QgsVector3D &origin,
323
+ const QgsRectangle &extent,
322
324
double verticalScale,
323
325
Qt3DCore::QNode *parent )
324
- : QgsMesh3DGeometry( triangularMesh, origin, verticalScale, parent )
326
+ : QgsMesh3DGeometry( triangularMesh, origin, extent, verticalScale, parent )
325
327
{
326
328
327
329
const int stride = ( 3 /* position*/ +
@@ -331,7 +333,7 @@ QgsMeshTerrain3DGeometry::QgsMeshTerrain3DGeometry( const QgsTriangularMesh &tri
331
333
prepareVerticesNormalAttribute ( mVertexBuffer , stride, 3 );
332
334
prepareIndexesAttribute ( mIndexBuffer );
333
335
334
- mBuilder = new QgsMesh3DGeometryBuilder ( triangularMesh, origin, mVertScale , this );
336
+ mBuilder = new QgsMesh3DGeometryBuilder ( triangularMesh, origin, extent, mVertScale , this );
335
337
connect ( mBuilder , &QgsMesh3DGeometryBuilder::dataIsReady, this , &QgsMeshTerrain3DGeometry::getData );
336
338
mBuilder ->start ();
337
339
}
@@ -416,10 +418,11 @@ void QgsMesh3DGeometry::prepareIndexesAttribute( Qt3DQBuffer *buffer )
416
418
}
417
419
418
420
419
- QgsMesh3DGeometryBuilder::QgsMesh3DGeometryBuilder ( const QgsTriangularMesh &mesh, const QgsVector3D &origin, float vertScale, QObject *parent ):
421
+ QgsMesh3DGeometryBuilder::QgsMesh3DGeometryBuilder ( const QgsTriangularMesh &mesh, const QgsVector3D &origin, const QgsRectangle &extent, float vertScale, QObject *parent ):
420
422
QObject( parent )
421
423
, mMesh( mesh )
422
424
, mOrigin( origin )
425
+ , mExtent( extent )
423
426
, mVertScale( vertScale )
424
427
{}
425
428
@@ -434,7 +437,7 @@ void QgsMesh3DGeometryBuilder::start()
434
437
435
438
mWatcherIndex = new QFutureWatcher<QByteArray>( this );
436
439
connect ( mWatcherIndex , &QFutureWatcher<int >::finished, this , &QgsMesh3DGeometryBuilder::indexFinished );
437
- mFutureIndex = QtConcurrent::run ( createIndexData, mMesh );
440
+ mFutureIndex = QtConcurrent::run ( createIndexData, mMesh , mExtent );
438
441
mWatcherIndex ->setFuture ( mFutureIndex );
439
442
}
440
443
@@ -462,10 +465,11 @@ QgsMeshDataset3DGeometryBuilder::QgsMeshDataset3DGeometryBuilder
462
465
( const QgsTriangularMesh &mesh,
463
466
const QgsMesh &nativeMesh,
464
467
const QgsVector3D &origin,
468
+ const QgsRectangle &extent,
465
469
float vertScale,
466
470
const QgsMeshDataset3DGeometry::VertexData &vertexData,
467
471
QObject *parent ):
468
- QgsMesh3DGeometryBuilder( mesh, origin, vertScale, parent )
472
+ QgsMesh3DGeometryBuilder( mesh, origin, extent, vertScale, parent )
469
473
, mNativeMesh( nativeMesh )
470
474
, mVertexData( vertexData )
471
475
{}
@@ -482,6 +486,6 @@ void QgsMeshDataset3DGeometryBuilder::start()
482
486
mWatcherIndex = new QFutureWatcher<QByteArray>( this );
483
487
connect ( mWatcherIndex , &QFutureWatcher<int >::finished, this , &QgsMeshDataset3DGeometryBuilder::indexFinished );
484
488
485
- mFutureIndex = QtConcurrent::run ( createDatasetIndexData, mMesh , mVertexData .activeFaceFlagValues );
489
+ mFutureIndex = QtConcurrent::run ( createDatasetIndexData, mMesh , mVertexData .activeFaceFlagValues , mExtent );
486
490
mWatcherIndex ->setFuture ( mFutureIndex );
487
491
}
0 commit comments