diff --git a/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in b/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in index 1cc65b83bd9..b5d4918efa4 100644 --- a/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in +++ b/python/core/auto_generated/pointcloud/qgspointcloudrenderer.sip.in @@ -89,6 +89,8 @@ Returns the size of a single point record. Returns the offset for the x value in a point record. .. seealso:: :py:func:`yOffset` + +.. seealso:: :py:func:`zOffset` %End int yOffset() const; @@ -96,6 +98,17 @@ Returns the offset for the x value in a point record. Returns the offset for the y value in a point record. .. seealso:: :py:func:`xOffset` + +.. seealso:: :py:func:`zOffset` +%End + + int zOffset() const; +%Docstring +Returns the offset for the y value in a point record. + +.. seealso:: :py:func:`xOffset` + +.. seealso:: :py:func:`yOffset` %End private: diff --git a/src/core/pointcloud/qgspointcloudrenderer.cpp b/src/core/pointcloud/qgspointcloudrenderer.cpp index b0b46a87b6e..0de94ce6f2c 100644 --- a/src/core/pointcloud/qgspointcloudrenderer.cpp +++ b/src/core/pointcloud/qgspointcloudrenderer.cpp @@ -43,9 +43,10 @@ void QgsPointCloudRenderContext::setAttributes( const QgsPointCloudAttributeColl mAttributes = attributes; mPointRecordSize = mAttributes.pointRecordSize(); - // fetch offset for x/y attributes + // fetch offset for x/y/z attributes attributes.find( QStringLiteral( "X" ), mXOffset ); attributes.find( QStringLiteral( "Y" ), mYOffset ); + attributes.find( QStringLiteral( "Z" ), mZOffset ); } QgsPointCloudRenderer *QgsPointCloudRenderer::load( QDomElement &element, const QgsReadWriteContext &context ) diff --git a/src/core/pointcloud/qgspointcloudrenderer.h b/src/core/pointcloud/qgspointcloudrenderer.h index 4341d6e8431..2fb1868cf10 100644 --- a/src/core/pointcloud/qgspointcloudrenderer.h +++ b/src/core/pointcloud/qgspointcloudrenderer.h @@ -111,6 +111,7 @@ class CORE_EXPORT QgsPointCloudRenderContext * Returns the offset for the x value in a point record. * * \see yOffset() + * \see zOffset() */ int xOffset() const { return mXOffset; } @@ -118,9 +119,18 @@ class CORE_EXPORT QgsPointCloudRenderContext * Returns the offset for the y value in a point record. * * \see xOffset() + * \see zOffset() */ int yOffset() const { return mYOffset; } + /** + * Returns the offset for the y value in a point record. + * + * \see xOffset() + * \see yOffset() + */ + int zOffset() const { return mZOffset; } + private: #ifdef SIP_RUN QgsPointCloudRenderContext( const QgsPointCloudRenderContext &rh ); @@ -134,6 +144,7 @@ class CORE_EXPORT QgsPointCloudRenderContext int mPointRecordSize = 0; int mXOffset = 0; int mYOffset = 0; + int mZOffset = 0; }; diff --git a/src/core/pointcloud/qgspointcloudrgbrenderer.cpp b/src/core/pointcloud/qgspointcloudrgbrenderer.cpp index f97dcbe0a01..415b6ad1312 100644 --- a/src/core/pointcloud/qgspointcloudrgbrenderer.cpp +++ b/src/core/pointcloud/qgspointcloudrgbrenderer.cpp @@ -92,6 +92,9 @@ void QgsPointCloudRgbRenderer::renderBlock( const QgsPointCloudBlock *block, Qgs const bool useBlueContrastEnhancement = mBlueContrastEnhancement && mBlueContrastEnhancement->contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement; const bool useGreenContrastEnhancement = mGreenContrastEnhancement && mGreenContrastEnhancement->contrastEnhancementAlgorithm() != QgsContrastEnhancement::NoEnhancement; + const QgsDoubleRange zRange = context.renderContext().zRange(); + const bool considerZ = !zRange.isInfinite(); + int rendered = 0; double x = 0; double y = 0; @@ -100,6 +103,15 @@ void QgsPointCloudRgbRenderer::renderBlock( const QgsPointCloudBlock *block, Qgs const bool reproject = ct.isValid(); for ( int i = 0; i < count; ++i ) { + if ( considerZ ) + { + // z value filtering is cheapest, if we're doing it... + qint32 iz = *( qint32 * )( ptr + i * context.pointRecordSize() + context.zOffset() ); + z = context.offset().z() + context.scale().z() * iz; + if ( !zRange.contains( z ) ) + continue; + } + pointXY( context, ptr, i, x, y ); if ( visibleExtent.contains( QgsPointXY( x, y ) ) ) { @@ -307,9 +319,15 @@ void QgsPointCloudRgbRenderer::stopRender( QgsPointCloudRenderContext &context ) QgsPointCloudRenderer::stopRender( context ); } -QSet QgsPointCloudRgbRenderer::usedAttributes( const QgsPointCloudRenderContext & ) const +QSet QgsPointCloudRgbRenderer::usedAttributes( const QgsPointCloudRenderContext &context ) const { - return QSet() << mRedAttribute << mGreenAttribute << mBlueAttribute; + QSet res; + res << mRedAttribute << mGreenAttribute << mBlueAttribute; + + if ( !context.renderContext().zRange().isInfinite() ) + res << QStringLiteral( "Z" ); + + return res; } QString QgsPointCloudRgbRenderer::redAttribute() const