28 #include <QtConcurrent>
33 QgsRuleBasedChunkLoader::QgsRuleBasedChunkLoader(
const QgsRuleBasedChunkLoaderFactory *factory, QgsChunkNode *node )
34 : QgsChunkLoader( node )
36 , mContext( factory->mMap )
39 if ( node->level() < mFactory->mLeafLevel )
41 QTimer::singleShot( 0,
this, &QgsRuleBasedChunkLoader::finished );
50 mContext.setExpressionContext( exprContext );
56 mRootRule.reset( mFactory->mRootRule->clone() );
60 QSet<QString> attributeNames;
61 mRootRule->
prepare( mContext, attributeNames, mHandlers );
76 QFuture<void> future = QtConcurrent::run( [req,
this]
78 QgsEventTracing::ScopedEvent e( QStringLiteral(
"3D" ), QStringLiteral(
"RB chunk load" ) );
86 mContext.expressionContext().setFeature( f );
92 mFutureWatcher =
new QFutureWatcher<void>(
this );
93 mFutureWatcher->setFuture( future );
94 connect( mFutureWatcher, &QFutureWatcher<void>::finished,
this, &QgsChunkQueueJob::finished );
97 QgsRuleBasedChunkLoader::~QgsRuleBasedChunkLoader()
99 if ( mFutureWatcher && !mFutureWatcher->isFinished() )
101 disconnect( mFutureWatcher, &QFutureWatcher<void>::finished,
this, &QgsChunkQueueJob::finished );
102 mFutureWatcher->waitForFinished();
105 qDeleteAll( mHandlers );
109 void QgsRuleBasedChunkLoader::cancel()
114 Qt3DCore::QEntity *QgsRuleBasedChunkLoader::createEntity( Qt3DCore::QEntity *parent )
116 if ( mNode->level() < mFactory->mLeafLevel )
118 return new Qt3DCore::QEntity( parent );
121 float zMin = std::numeric_limits<float>::max();
122 float zMax = std::numeric_limits<float>::min();
124 Qt3DCore::QEntity *entity =
new Qt3DCore::QEntity( parent );
125 for ( QgsFeature3DHandler *handler : mHandlers.values() )
127 handler->finalize( entity, mContext );
128 if ( handler->zMinimum() < zMin )
129 zMin = handler->zMinimum();
130 if ( handler->zMaximum() > zMax )
131 zMax = handler->zMaximum();
135 if ( zMin != std::numeric_limits<float>::max() && zMax != std::numeric_limits<float>::min() )
140 mNode->setExactBbox( box );
153 , mRootRule( rootRule->clone() )
154 , mLeafLevel( leafLevel )
158 QgsRuleBasedChunkLoaderFactory::~QgsRuleBasedChunkLoaderFactory() =
default;
160 QgsChunkLoader *QgsRuleBasedChunkLoaderFactory::createChunkLoader( QgsChunkNode *node )
const
162 return new QgsRuleBasedChunkLoader(
this, node );
169 : QgsChunkedEntity(
Qgs3DUtils::layerToWorldExtent( vl->extent(), zMin, zMax, vl->
crs(), map.origin(), map.
crs(), map.transformContext() ),
172 tilingSettings.zoomLevelsCount() - 1,
173 new QgsRuleBasedChunkLoaderFactory( map, vl, rootRule, tilingSettings.zoomLevelsCount() - 1 ), true )
178 QgsRuleBasedChunkedEntity::~QgsRuleBasedChunkedEntity()