Skip to content

Commit 2dae033

Browse files
uclaroswonder-sk
authored andcommittedApr 13, 2023
handle virtual point clouds rendering
disable preview rendering
1 parent f896513 commit 2dae033

File tree

5 files changed

+86
-6
lines changed

5 files changed

+86
-6
lines changed
 

‎src/core/pointcloud/qgspointcloudlayer.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgspointcloudlayer.h"
1919
#include "qgspointcloudlayerrenderer.h"
2020
#include "qgspointcloudindex.h"
21+
#include "qgspointcloudsubindex.h"
2122
#include "qgsrectangle.h"
2223
#include "qgspointclouddataprovider.h"
2324
#include "qgsproviderregistry.h"
@@ -108,6 +109,9 @@ QgsMapLayerRenderer *QgsPointCloudLayer::createMapRenderer( QgsRenderContext &re
108109
{
109110
QGIS_PROTECT_QOBJECT_THREAD_ACCESS
110111

112+
if ( mRenderer->type() != QLatin1String( "extent" ) )
113+
loadIndexesForRenderContext( rendererContext );
114+
111115
return new QgsPointCloudLayerRenderer( this, rendererContext );
112116
}
113117

@@ -949,3 +953,25 @@ void QgsPointCloudLayer::resetRenderer()
949953

950954
emit rendererChanged();
951955
}
956+
957+
void QgsPointCloudLayer::loadIndexesForRenderContext( QgsRenderContext &rendererContext ) const
958+
{
959+
if ( mDataProvider->capabilities() & QgsPointCloudDataProvider::ContainSubIndexes )
960+
{
961+
const QgsRectangle renderExtent = rendererContext.coordinateTransform().transformBoundingBox( rendererContext.mapExtent(), Qgis::TransformDirection::Reverse );
962+
QVector<QgsPointCloudSubIndex> subIndex = mDataProvider->subIndexes();
963+
for ( int i = 0; i < subIndex.size(); ++i )
964+
{
965+
// no need to load as it's there
966+
if ( subIndex.at( i ).index )
967+
continue;
968+
969+
const QgsRectangle intersection = subIndex.at( i ).extent.intersect( renderExtent );
970+
if ( !intersection.isEmpty() &&
971+
renderExtent.width() < subIndex.at( i ).extent.width() )
972+
{
973+
mDataProvider->loadIndex( i );
974+
}
975+
}
976+
}
977+
}

‎src/core/pointcloud/qgspointcloudlayer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,8 @@ class CORE_EXPORT QgsPointCloudLayer : public QgsMapLayer, public QgsAbstractPro
279279

280280
void resetRenderer();
281281

282+
void loadIndexesForRenderContext( QgsRenderContext &rendererContext ) const;
283+
282284
#ifdef SIP_RUN
283285
QgsPointCloudLayer( const QgsPointCloudLayer &rhs );
284286
#endif

‎src/core/pointcloud/qgspointcloudlayerrenderer.cpp

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ QgsPointCloudLayerRenderer::QgsPointCloudLayerRenderer( QgsPointCloudLayer *laye
4646
return;
4747

4848
mRenderer.reset( mLayer->renderer()->clone() );
49+
mSubExtentsRenderer.reset( new QgsPointCloudExtentRenderer() );
4950

5051
if ( mLayer->dataProvider()->index() )
5152
{
@@ -94,9 +95,12 @@ bool QgsPointCloudLayerRenderer::render()
9495
return true;
9596
}
9697

98+
const bool hasMultipleIndexes = mLayer->dataProvider()->capabilities() & QgsPointCloudDataProvider::ContainSubIndexes;
99+
97100
// TODO cache!?
98101
QgsPointCloudIndex *pc = mLayer->dataProvider()->index();
99-
if ( !pc || !pc->isValid() )
102+
if ( !hasMultipleIndexes &&
103+
( !pc || !pc->isValid() ) )
100104
{
101105
mReadyToCompose = true;
102106
return false;
@@ -140,7 +144,55 @@ bool QgsPointCloudLayerRenderer::render()
140144
mAttributes.push_back( mLayerAttributes.at( layerIndex ) );
141145
}
142146

143-
QgsPointCloudDataBounds db;
147+
const QgsRectangle renderExtent = renderContext()->coordinateTransform().transformBoundingBox( renderContext()->mapExtent(), Qgis::TransformDirection::Reverse );
148+
bool canceled = false;
149+
if ( !hasMultipleIndexes )
150+
{
151+
canceled = !renderIndex( pc );
152+
}
153+
else
154+
{
155+
const auto subLayers = mLayer->dataProvider()->subIndexes();
156+
for ( const auto &sl : subLayers )
157+
{
158+
if ( canceled )
159+
break;
160+
161+
QgsPointCloudIndex *pc = sl.index.get();
162+
163+
const auto commonExtent = renderExtent.intersect( sl.extent );
164+
if ( commonExtent.isEmpty() )
165+
continue;
166+
167+
if ( !pc || !pc->isValid() || renderExtent.width() > sl.extent.width() )
168+
{
169+
// when dealing with virtual point clouds, we want to render the individual extents when zoomed out
170+
// and only use the selected renderer when zoomed in
171+
mSubExtentsRenderer->startRender( context );
172+
mSubExtentsRenderer->renderExtent( sl.geometry, context );
173+
mSubExtentsRenderer->stopRender( context );
174+
}
175+
else
176+
{
177+
canceled = !renderIndex( pc );
178+
}
179+
}
180+
}
181+
182+
mRenderer->stopRender( context );
183+
mReadyToCompose = true;
184+
return !canceled;
185+
}
186+
187+
bool QgsPointCloudLayerRenderer::renderIndex( QgsPointCloudIndex *pc )
188+
{
189+
QgsPointCloudRenderContext context( *renderContext(),
190+
pc->scale(),
191+
pc->offset(),
192+
mZScale,
193+
mZOffset,
194+
mFeedback.get() );
195+
144196

145197
#ifdef QGISDEBUG
146198
QElapsedTimer t;
@@ -178,7 +230,6 @@ bool QgsPointCloudLayerRenderer::render()
178230
if ( ( rootErrorInMapCoordinates < 0.0 ) || ( mapUnitsPerPixel < 0.0 ) || ( maximumError < 0.0 ) )
179231
{
180232
QgsDebugMsg( QStringLiteral( "invalid screen error" ) );
181-
mReadyToCompose = true;
182233
return false;
183234
}
184235
double rootErrorPixels = rootErrorInMapCoordinates / mapUnitsPerPixel; // in pixels
@@ -225,9 +276,6 @@ bool QgsPointCloudLayerRenderer::render()
225276
( void )nodesDrawn;
226277
#endif
227278

228-
mRenderer->stopRender( context );
229-
230-
mReadyToCompose = true;
231279
return !canceled;
232280
}
233281

‎src/core/pointcloud/qgspointcloudlayerrenderer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "qgspointcloudindex.h"
3030
#include "qgsidentifycontext.h"
3131
#include "qgspointcloudrenderer.h"
32+
#include "qgspointcloudextentrenderer.h"
3233
#include "qgsmapclippingregion.h"
3334
#include "qgsrasterinterface.h"
3435

@@ -73,10 +74,12 @@ class CORE_EXPORT QgsPointCloudLayerRenderer: public QgsMapLayerRenderer
7374
int renderNodesSync( const QVector<IndexedPointCloudNode> &nodes, QgsPointCloudIndex *pc, QgsPointCloudRenderContext &context, QgsPointCloudRequest &request, bool &canceled );
7475
int renderNodesAsync( const QVector<IndexedPointCloudNode> &nodes, QgsPointCloudIndex *pc, QgsPointCloudRenderContext &context, QgsPointCloudRequest &request, bool &canceled );
7576
int renderNodesSorted( const QVector<IndexedPointCloudNode> &nodes, QgsPointCloudIndex *pc, QgsPointCloudRenderContext &context, QgsPointCloudRequest &request, bool &canceled, Qgis::PointCloudDrawOrder order );
77+
bool renderIndex( QgsPointCloudIndex *pc );
7678

7779
QgsPointCloudLayer *mLayer = nullptr;
7880

7981
std::unique_ptr< QgsPointCloudRenderer > mRenderer;
82+
std::unique_ptr< QgsPointCloudExtentRenderer > mSubExtentsRenderer;
8083

8184
QgsVector3D mScale;
8285
QgsVector3D mOffset;

‎src/core/providers/vpc/qgsvirtualpointcloudprovider.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class QgsVirtualPointCloudProvider: public QgsPointCloudDataProvider
5858
void loadIndex( int i ) override;
5959
bool setSubsetString( const QString &subset, bool updateFeatureCount = false ) override;
6060
QgsPointCloudRenderer *createRenderer( const QVariantMap &configuration = QVariantMap() ) const override SIP_FACTORY;
61+
bool renderInPreview( const QgsDataProvider::PreviewContext & ) override { return false; }
6162

6263
private:
6364
void parseFile();

0 commit comments

Comments
 (0)