From df740b4d0bf5458a607169a3f8b984c45425056c Mon Sep 17 00:00:00 2001 From: uclaros Date: Fri, 1 Apr 2022 10:27:42 +0300 Subject: [PATCH] address review --- .../qgspointcloudlayer3drenderer.sip.in | 1 - .../3d/qgsabstractpointcloud3drenderer.sip.in | 12 -- src/3d/qgs3dutils.cpp | 30 ++--- src/3d/qgs3dutils.h | 2 +- src/3d/qgspointcloudlayer3drenderer.cpp | 4 +- src/3d/qgspointcloudlayer3drenderer.h | 3 - src/app/3d/qgspointcloud3dsymbolwidget.cpp | 8 +- src/app/qgisapp.cpp | 4 +- src/core/3d/qgsabstractpointcloud3drenderer.h | 12 -- src/core/pointcloud/qgspointcloudlayer.cpp | 37 ++++-- src/core/pointcloud/qgspointcloudlayer.h | 2 + src/ui/3d/qgspointcloud3dsymbolwidget.ui | 4 +- tests/src/3d/testqgspointcloud3drendering.cpp | 120 +++++++++--------- 13 files changed, 110 insertions(+), 129 deletions(-) diff --git a/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in b/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in index 11cd0913b4b..b718165164e 100644 --- a/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in +++ b/python/3d/auto_generated/qgspointcloudlayer3drenderer.sip.in @@ -104,7 +104,6 @@ Sets the maximum number of points to be rendered in the scene virtual bool convertFrom2DRenderer( QgsPointCloudRenderer *renderer ); - virtual bool syncedWith2DRenderer(); private: QgsPointCloudLayer3DRenderer( const QgsPointCloudLayer3DRenderer & ); diff --git a/python/core/auto_generated/3d/qgsabstractpointcloud3drenderer.sip.in b/python/core/auto_generated/3d/qgsabstractpointcloud3drenderer.sip.in index ccb23ae8fee..a42126f7cff 100644 --- a/python/core/auto_generated/3d/qgsabstractpointcloud3drenderer.sip.in +++ b/python/core/auto_generated/3d/qgsabstractpointcloud3drenderer.sip.in @@ -31,18 +31,6 @@ This class allows for functionality in 3D to be called from core. Updates the 3D renderer's symbol to match that of a given :py:class:`QgsPointCloudRenderer` :return: ``True`` on success, ``False`` otherwise -%End - - virtual void setSyncedWith2DRenderer( bool synced ) = 0; -%Docstring -Sets whether this 3D renderer should be automatically updated -with changes applied to the respective layer's 2D renderer -%End - - virtual bool syncedWith2DRenderer() = 0; -%Docstring -Returns whether this 3D renderer should be automatically updated -with changes applied to the respective layer's 2D renderer %End protected: diff --git a/src/3d/qgs3dutils.cpp b/src/3d/qgs3dutils.cpp index ff20c6b5791..294d04029f9 100644 --- a/src/3d/qgs3dutils.cpp +++ b/src/3d/qgs3dutils.cpp @@ -735,7 +735,7 @@ QVector2D Qgs3DUtils::textureToScreenCoordinates( QVector2D textureXY, QSize win return QVector2D( textureXY.x() * winSize.width(), ( 1 - textureXY.y() ) * winSize.height() ); } -std::unique_ptr Qgs3DUtils::convert2dPointCloudRendererTo3d( QgsPointCloudRenderer *renderer ) +std::unique_ptr Qgs3DUtils::convert2DPointCloudRendererTo3D( QgsPointCloudRenderer *renderer ) { if ( !renderer ) return nullptr; @@ -743,34 +743,34 @@ std::unique_ptr Qgs3DUtils::convert2dPointCloudRen std::unique_ptr< QgsPointCloud3DSymbol > symbol3D; if ( renderer->type() == QLatin1String( "ramp" ) ) { - const QgsPointCloudAttributeByRampRenderer *renderer2d = dynamic_cast< const QgsPointCloudAttributeByRampRenderer * >( renderer ); + const QgsPointCloudAttributeByRampRenderer *renderer2D = dynamic_cast< const QgsPointCloudAttributeByRampRenderer * >( renderer ); symbol3D = std::make_unique< QgsColorRampPointCloud3DSymbol >(); QgsColorRampPointCloud3DSymbol *symbol = static_cast< QgsColorRampPointCloud3DSymbol * >( symbol3D.get() ); - symbol->setAttribute( renderer2d->attribute() ); - symbol->setColorRampShaderMinMax( renderer2d->minimum(), renderer2d->maximum() ); - symbol->setColorRampShader( renderer2d->colorRampShader() ); + symbol->setAttribute( renderer2D->attribute() ); + symbol->setColorRampShaderMinMax( renderer2D->minimum(), renderer2D->maximum() ); + symbol->setColorRampShader( renderer2D->colorRampShader() ); } else if ( renderer->type() == QLatin1String( "rgb" ) ) { - const QgsPointCloudRgbRenderer *renderer2d = dynamic_cast< const QgsPointCloudRgbRenderer * >( renderer ); + const QgsPointCloudRgbRenderer *renderer2D = dynamic_cast< const QgsPointCloudRgbRenderer * >( renderer ); symbol3D = std::make_unique< QgsRgbPointCloud3DSymbol >(); QgsRgbPointCloud3DSymbol *symbol = static_cast< QgsRgbPointCloud3DSymbol * >( symbol3D.get() ); - symbol->setRedAttribute( renderer2d->redAttribute() ); - symbol->setGreenAttribute( renderer2d->greenAttribute() ); - symbol->setBlueAttribute( renderer2d->blueAttribute() ); + symbol->setRedAttribute( renderer2D->redAttribute() ); + symbol->setGreenAttribute( renderer2D->greenAttribute() ); + symbol->setBlueAttribute( renderer2D->blueAttribute() ); - symbol->setRedContrastEnhancement( renderer2d->redContrastEnhancement() ? new QgsContrastEnhancement( *renderer2d->redContrastEnhancement() ) : nullptr ); - symbol->setGreenContrastEnhancement( renderer2d->greenContrastEnhancement() ? new QgsContrastEnhancement( *renderer2d->greenContrastEnhancement() ) : nullptr ); - symbol->setBlueContrastEnhancement( renderer2d->blueContrastEnhancement() ? new QgsContrastEnhancement( *renderer2d->blueContrastEnhancement() ) : nullptr ); + symbol->setRedContrastEnhancement( renderer2D->redContrastEnhancement() ? new QgsContrastEnhancement( *renderer2D->redContrastEnhancement() ) : nullptr ); + symbol->setGreenContrastEnhancement( renderer2D->greenContrastEnhancement() ? new QgsContrastEnhancement( *renderer2D->greenContrastEnhancement() ) : nullptr ); + symbol->setBlueContrastEnhancement( renderer2D->blueContrastEnhancement() ? new QgsContrastEnhancement( *renderer2D->blueContrastEnhancement() ) : nullptr ); } else if ( renderer->type() == QLatin1String( "classified" ) ) { - const QgsPointCloudClassifiedRenderer *renderer2d = dynamic_cast< const QgsPointCloudClassifiedRenderer * >( renderer ); + const QgsPointCloudClassifiedRenderer *renderer2D = dynamic_cast< const QgsPointCloudClassifiedRenderer * >( renderer ); symbol3D = std::make_unique< QgsClassificationPointCloud3DSymbol >(); QgsClassificationPointCloud3DSymbol *symbol = static_cast< QgsClassificationPointCloud3DSymbol * >( symbol3D.get() ); - symbol->setAttribute( renderer2d->attribute() ); - symbol->setCategoriesList( renderer2d->categories() ); + symbol->setAttribute( renderer2D->attribute() ); + symbol->setCategoriesList( renderer2D->categories() ); } if ( symbol3D ) diff --git a/src/3d/qgs3dutils.h b/src/3d/qgs3dutils.h index 64f34fb3d71..11c1ef9046e 100644 --- a/src/3d/qgs3dutils.h +++ b/src/3d/qgs3dutils.h @@ -237,7 +237,7 @@ class _3D_EXPORT Qgs3DUtils * \note This function was formerly in Qgs3DAppUtils * \since QGIS 3.26 */ - static std::unique_ptr< QgsPointCloudLayer3DRenderer > convert2dPointCloudRendererTo3d( QgsPointCloudRenderer *renderer ); + static std::unique_ptr< QgsPointCloudLayer3DRenderer > convert2DPointCloudRendererTo3D( QgsPointCloudRenderer *renderer ); }; #endif // QGS3DUTILS_H diff --git a/src/3d/qgspointcloudlayer3drenderer.cpp b/src/3d/qgspointcloudlayer3drenderer.cpp index ffe5c3c28b7..09cebf248b5 100644 --- a/src/3d/qgspointcloudlayer3drenderer.cpp +++ b/src/3d/qgspointcloudlayer3drenderer.cpp @@ -156,7 +156,6 @@ void QgsPointCloudLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWri elem.setAttribute( QStringLiteral( "max-screen-error" ), maximumScreenError() ); elem.setAttribute( QStringLiteral( "show-bounding-boxes" ), showBoundingBoxes() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); elem.setAttribute( QStringLiteral( "point-budget" ), mPointBudget ); - elem.setAttribute( QStringLiteral( "synced-with-2d-renderer" ), mSyncedWith2DRenderer ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); QDomElement elemSymbol = doc.createElement( QStringLiteral( "symbol" ) ); if ( mSymbol ) @@ -177,7 +176,6 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe mShowBoundingBoxes = elem.attribute( QStringLiteral( "show-bounding-boxes" ), QStringLiteral( "0" ) ).toInt(); mMaximumScreenError = elem.attribute( QStringLiteral( "max-screen-error" ), QStringLiteral( "1.0" ) ).toDouble(); mPointBudget = elem.attribute( QStringLiteral( "point-budget" ), QStringLiteral( "1000000" ) ).toInt(); - mSyncedWith2DRenderer = elem.attribute( QStringLiteral( "synced-with-2d-renderer" ), QStringLiteral( "0" ) ).toInt(); if ( symbolType == QLatin1String( "single-color" ) ) mSymbol.reset( new QgsSingleColorPointCloud3DSymbol ); @@ -226,7 +224,7 @@ void QgsPointCloudLayer3DRenderer::setPointRenderingBudget( int budget ) bool QgsPointCloudLayer3DRenderer::convertFrom2DRenderer( QgsPointCloudRenderer *renderer ) { - std::unique_ptr< QgsPointCloudLayer3DRenderer > renderer3D = Qgs3DUtils::convert2dPointCloudRendererTo3d( renderer ); + std::unique_ptr< QgsPointCloudLayer3DRenderer > renderer3D = Qgs3DUtils::convert2DPointCloudRendererTo3D( renderer ); if ( !renderer3D ) { setSymbol( nullptr ); diff --git a/src/3d/qgspointcloudlayer3drenderer.h b/src/3d/qgspointcloudlayer3drenderer.h index 24a5673495a..04ece9d82b2 100644 --- a/src/3d/qgspointcloudlayer3drenderer.h +++ b/src/3d/qgspointcloudlayer3drenderer.h @@ -296,8 +296,6 @@ class _3D_EXPORT QgsPointCloudLayer3DRenderer : public QgsAbstractPointCloud3DRe void setPointRenderingBudget( int budget ); bool convertFrom2DRenderer( QgsPointCloudRenderer *renderer ) override; - bool syncedWith2DRenderer() override { return mSyncedWith2DRenderer; }; - void setSyncedWith2DRenderer( bool synced ) override { mSyncedWith2DRenderer = synced; }; private: QgsMapLayerRef mLayerRef; //!< Layer used to extract mesh data from @@ -305,7 +303,6 @@ class _3D_EXPORT QgsPointCloudLayer3DRenderer : public QgsAbstractPointCloud3DRe double mMaximumScreenError = 1.0; bool mShowBoundingBoxes = false; int mPointBudget = 1000000; - bool mSyncedWith2DRenderer = false; private: #ifdef SIP_RUN diff --git a/src/app/3d/qgspointcloud3dsymbolwidget.cpp b/src/app/3d/qgspointcloud3dsymbolwidget.cpp index 425a2c5cabb..47c900972ad 100644 --- a/src/app/3d/qgspointcloud3dsymbolwidget.cpp +++ b/src/app/3d/qgspointcloud3dsymbolwidget.cpp @@ -48,7 +48,7 @@ QgsPointCloud3DSymbolWidget::QgsPointCloud3DSymbolWidget( QgsPointCloudLayer *la mSingleColorBtn->setColor( QColor( 0, 0, 255 ) ); // default color mRenderingStyleComboBox->addItem( tr( "No Rendering" ), QString() ); - mRenderingStyleComboBox->addItem( tr( "Follow 2d renderer" ), QStringLiteral( "2d" ) ); + mRenderingStyleComboBox->addItem( tr( "Follow 2D Symbology" ), QStringLiteral( "2D" ) ); mRenderingStyleComboBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "styleicons/singlecolor.svg" ) ), tr( "Single Color" ), QStringLiteral( "single-color" ) ); mRenderingStyleComboBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "styleicons/singlebandpseudocolor.svg" ) ), tr( "Attribute by Ramp" ), QStringLiteral( "color-ramp" ) ); mRenderingStyleComboBox->addItem( QgsApplication::getThemeIcon( QStringLiteral( "styleicons/multibandcolor.svg" ) ), tr( "RGB" ), QStringLiteral( "rgb" ) ); @@ -229,10 +229,10 @@ QgsPointCloud3DSymbol *QgsPointCloud3DSymbolWidget::symbol() const QgsPointCloud3DSymbol *retSymb = nullptr; const QString symbolType = mRenderingStyleComboBox->currentData().toString(); - if ( symbolType == QLatin1String( "2d" ) ) + if ( symbolType == QLatin1String( "2D" ) ) { // we still need to return some symbol since it carries needed settings like the point size - // any symbol type is ok, it will be replaced with the proper one, converted from the 2d renderer + // any symbol type is ok, it will be replaced with the proper one, converted from the 2D renderer retSymb = new QgsSingleColorPointCloud3DSymbol; } else if ( symbolType == QLatin1String( "single-color" ) ) @@ -422,7 +422,7 @@ void QgsPointCloud3DSymbolWidget::onRenderingStyleChanged() const QString newSymbolType = mRenderingStyleComboBox->currentData().toString(); mLayer->setSync3DRendererTo2DRenderer( false ); - if ( newSymbolType == QLatin1String( "2d" ) ) + if ( newSymbolType == QLatin1String( "2D" ) ) { mLayer->setSync3DRendererTo2DRenderer( true ); } diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 5fd07e7ce8f..9da305048c9 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -5833,7 +5833,7 @@ void QgisApp::postProcessAddedLayer( QgsMapLayer *layer ) { QgsPointCloudLayer *pcLayer = qobject_cast< QgsPointCloudLayer * >( layer ); // for point clouds we default to a 3d renderer. it just makes sense :) - std::unique_ptr< QgsPointCloudLayer3DRenderer > renderer3D = Qgs3DUtils::convert2dPointCloudRendererTo3d( pcLayer->renderer() ); + std::unique_ptr< QgsPointCloudLayer3DRenderer > renderer3D = Qgs3DUtils::convert2DPointCloudRendererTo3D( pcLayer->renderer() ); if ( renderer3D ) layer->setRenderer3D( renderer3D.release() ); else @@ -5847,7 +5847,7 @@ void QgisApp::postProcessAddedLayer( QgsMapLayer *layer ) if ( !layerPointer || state != QgsPointCloudDataProvider::Indexed ) return; - std::unique_ptr< QgsPointCloudLayer3DRenderer > renderer3D = Qgs3DUtils::convert2dPointCloudRendererTo3d( layerPointer->renderer() ); + std::unique_ptr< QgsPointCloudLayer3DRenderer > renderer3D = Qgs3DUtils::convert2DPointCloudRendererTo3D( layerPointer->renderer() ); if ( renderer3D ) layerPointer->setRenderer3D( renderer3D.release() ); } ); diff --git a/src/core/3d/qgsabstractpointcloud3drenderer.h b/src/core/3d/qgsabstractpointcloud3drenderer.h index 95d420e578a..491666a0285 100644 --- a/src/core/3d/qgsabstractpointcloud3drenderer.h +++ b/src/core/3d/qgsabstractpointcloud3drenderer.h @@ -50,18 +50,6 @@ class CORE_EXPORT QgsAbstractPointCloud3DRenderer : public QgsAbstract3DRenderer */ virtual bool convertFrom2DRenderer( QgsPointCloudRenderer *renderer ) = 0; - /** - * Sets whether this 3D renderer should be automatically updated - * with changes applied to the respective layer's 2D renderer - */ - virtual void setSyncedWith2DRenderer( bool synced ) = 0; - - /** - * Returns whether this 3D renderer should be automatically updated - * with changes applied to the respective layer's 2D renderer - */ - virtual bool syncedWith2DRenderer() = 0; - protected: //! Default constructor QgsAbstractPointCloud3DRenderer() = default; diff --git a/src/core/pointcloud/qgspointcloudlayer.cpp b/src/core/pointcloud/qgspointcloudlayer.cpp index 74d525db5ab..c80913656ba 100644 --- a/src/core/pointcloud/qgspointcloudlayer.cpp +++ b/src/core/pointcloud/qgspointcloudlayer.cpp @@ -197,6 +197,14 @@ bool QgsPointCloudLayer::readStyle( const QDomNode &node, QString &, QgsReadWrit { bool result = true; + if ( categories.testFlag( Symbology3D ) ) + { + bool ok; + bool sync = node.attributes().namedItem( QStringLiteral( "sync3DRendererTo2DRenderer" ) ).nodeValue().toInt( &ok ); + if ( ok ) + setSync3DRendererTo2DRenderer( sync ); + } + if ( categories.testFlag( Symbology ) ) { QDomElement rendererElement = node.firstChildElement( QStringLiteral( "renderer" ) ); @@ -274,6 +282,11 @@ bool QgsPointCloudLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString { QDomElement mapLayerNode = node.toElement(); + if ( categories.testFlag( Symbology3D ) ) + { + mapLayerNode.setAttribute( QStringLiteral( "sync3DRendererTo2DRenderer" ), mSync3DRendererTo2DRenderer ? 1 : 0 ); + } + if ( categories.testFlag( Symbology ) ) { if ( mRenderer ) @@ -310,7 +323,6 @@ bool QgsPointCloudLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString mapLayerNode.setAttribute( QStringLiteral( "maxScale" ), maximumScale() ); mapLayerNode.setAttribute( QStringLiteral( "minScale" ), minimumScale() ); } - return true; } @@ -680,8 +692,7 @@ void QgsPointCloudLayer::setRenderer( QgsPointCloudRenderer *renderer ) emit rendererChanged(); emitStyleChanged(); - QgsAbstractPointCloud3DRenderer *r = static_cast( renderer3D() ); - if ( r && r->syncedWith2DRenderer() ) + if ( mSync3DRendererTo2DRenderer ) convertRenderer3DFromRenderer2D(); } @@ -717,27 +728,25 @@ QString QgsPointCloudLayer::subsetString() const bool QgsPointCloudLayer::convertRenderer3DFromRenderer2D() { + bool result = false; QgsAbstractPointCloud3DRenderer *r = static_cast( renderer3D() ); - bool result = r->convertFrom2DRenderer( renderer() ); - setRenderer3D( r ); - trigger3DUpdate(); + if ( r ) + { + result = r->convertFrom2DRenderer( renderer() ); + setRenderer3D( r ); + trigger3DUpdate(); + } return result; } bool QgsPointCloudLayer::sync3DRendererTo2DRenderer() const { - QgsAbstractPointCloud3DRenderer *r = static_cast( renderer3D() ); - if ( !r ) - return false; - return r->syncedWith2DRenderer(); + return mSync3DRendererTo2DRenderer; } void QgsPointCloudLayer::setSync3DRendererTo2DRenderer( bool sync ) { - QgsAbstractPointCloud3DRenderer *r = static_cast( renderer3D() ); - if ( !r ) - return; + mSync3DRendererTo2DRenderer = sync; if ( sync ) convertRenderer3DFromRenderer2D(); - r->setSyncedWith2DRenderer( sync ); } diff --git a/src/core/pointcloud/qgspointcloudlayer.h b/src/core/pointcloud/qgspointcloudlayer.h index 9f0bb2ae4e8..b4ce81bba5c 100644 --- a/src/core/pointcloud/qgspointcloudlayer.h +++ b/src/core/pointcloud/qgspointcloudlayer.h @@ -245,6 +245,8 @@ class CORE_EXPORT QgsPointCloudLayer : public QgsMapLayer std::unique_ptr mRenderer; QgsPointCloudLayerElevationProperties *mElevationProperties = nullptr; + + bool mSync3DRendererTo2DRenderer = false; }; diff --git a/src/ui/3d/qgspointcloud3dsymbolwidget.ui b/src/ui/3d/qgspointcloud3dsymbolwidget.ui index e4c6f67f518..99eb668ef84 100644 --- a/src/ui/3d/qgspointcloud3dsymbolwidget.ui +++ b/src/ui/3d/qgspointcloud3dsymbolwidget.ui @@ -202,7 +202,7 @@ 0 - + 0 @@ -216,7 +216,7 @@ - See 2d renderer settings + See 2D Symbology settings Qt::AlignCenter diff --git a/tests/src/3d/testqgspointcloud3drendering.cpp b/tests/src/3d/testqgspointcloud3drendering.cpp index 422439b342a..c80ecdba72b 100644 --- a/tests/src/3d/testqgspointcloud3drendering.cpp +++ b/tests/src/3d/testqgspointcloud3drendering.cpp @@ -101,7 +101,7 @@ void TestQgsPointCloud3DRendering::initTestCase() mProject->addMapLayer( mLayer ); mProject->setCrs( mLayer->crs() ); - // set a default 3d renderer + // set a default 3D renderer QgsSingleColorPointCloud3DSymbol *symbol = new QgsSingleColorPointCloud3DSymbol(); symbol->setSingleColor( QColor( 255, 0, 0 ) ); QgsPointCloudLayer3DRenderer *renderer = new QgsPointCloudLayer3DRenderer(); @@ -128,7 +128,7 @@ void TestQgsPointCloud3DRendering::cleanupTestCase() void TestQgsPointCloud3DRendering::testSync3DRendererTo2DRenderer() { - // gather different 2d renderers + // gather different 2D renderers QgsPointCloudExtentRenderer *extent2DRenderer = new QgsPointCloudExtentRenderer(); QgsPointCloudAttributeByRampRenderer *colorramp2DRenderer = new QgsPointCloudAttributeByRampRenderer(); colorramp2DRenderer->setAttribute( QStringLiteral( "Z" ) ); @@ -147,58 +147,58 @@ void TestQgsPointCloud3DRendering::testSync3DRendererTo2DRenderer() categories[5].setColor( QColor( 0, 255, 0 ) ); classification2DRenderer->setCategories( categories ); - // enable syncing, the 3d renderer should change when the 2d renderer changes + // enable syncing, the 3D renderer should change when the 2D renderer changes mLayer->setSync3DRendererTo2DRenderer( true ); { - // for the extent 2d renderer we should have a 3d renderer but no symbol + // for the extent 2D renderer we should have a 3D renderer but no symbol mLayer->setRenderer( extent2DRenderer ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - QVERIFY( !r3d->symbol() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + QVERIFY( !r3D->symbol() ); } { mLayer->setRenderer( colorramp2DRenderer ); - QgsPointCloudAttributeByRampRenderer *r2d = static_cast( mLayer->renderer() ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3d->symbol() ); + QgsPointCloudAttributeByRampRenderer *r2D = static_cast( mLayer->renderer() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3D->symbol() ); QVERIFY( s ); - QVERIFY( s->attribute() == r2d->attribute() ); - QVERIFY( s->colorRampShader() == r2d->colorRampShader() ); - QVERIFY( s->colorRampShaderMin() == r2d->minimum() ); - QVERIFY( s->colorRampShaderMax() == r2d->maximum() ); + QVERIFY( s->attribute() == r2D->attribute() ); + QVERIFY( s->colorRampShader() == r2D->colorRampShader() ); + QVERIFY( s->colorRampShaderMin() == r2D->minimum() ); + QVERIFY( s->colorRampShaderMax() == r2D->maximum() ); } { mLayer->setRenderer( rgb2DRenderer ); - QgsPointCloudRgbRenderer *r2d = static_cast( mLayer->renderer() ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - QgsRgbPointCloud3DSymbol *s = const_cast( dynamic_cast( r3d->symbol() ) ); + QgsPointCloudRgbRenderer *r2D = static_cast( mLayer->renderer() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + QgsRgbPointCloud3DSymbol *s = const_cast( dynamic_cast( r3D->symbol() ) ); QVERIFY( s ); - QVERIFY( s->redAttribute() == r2d->redAttribute() ); - QVERIFY( s->blueAttribute() == r2d->blueAttribute() ); - QVERIFY( s->greenAttribute() == r2d->greenAttribute() ); - QVERIFY( s->redContrastEnhancement() == r2d->redContrastEnhancement() ); - QVERIFY( s->greenContrastEnhancement() == r2d->greenContrastEnhancement() ); - QVERIFY( s->blueContrastEnhancement() == r2d->blueContrastEnhancement() ); + QVERIFY( s->redAttribute() == r2D->redAttribute() ); + QVERIFY( s->blueAttribute() == r2D->blueAttribute() ); + QVERIFY( s->greenAttribute() == r2D->greenAttribute() ); + QVERIFY( s->redContrastEnhancement() == r2D->redContrastEnhancement() ); + QVERIFY( s->greenContrastEnhancement() == r2D->greenContrastEnhancement() ); + QVERIFY( s->blueContrastEnhancement() == r2D->blueContrastEnhancement() ); } { mLayer->setRenderer( classification2DRenderer ); - QgsPointCloudClassifiedRenderer *r2d = static_cast( mLayer->renderer() ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - const QgsClassificationPointCloud3DSymbol *s = dynamic_cast( r3d->symbol() ); + QgsPointCloudClassifiedRenderer *r2D = static_cast( mLayer->renderer() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + const QgsClassificationPointCloud3DSymbol *s = dynamic_cast( r3D->symbol() ); QVERIFY( s ); - QVERIFY( s->attribute() == r2d->attribute() ); - QVERIFY( s->categoriesList() == r2d->categories() ); + QVERIFY( s->attribute() == r2D->attribute() ); + QVERIFY( s->categoriesList() == r2D->categories() ); } } void TestQgsPointCloud3DRendering::testDisableSync3DRendererTo2DRenderer() { - // gather different 2d renderers + // gather different 2D renderers QgsPointCloudExtentRenderer *extent2DRenderer = new QgsPointCloudExtentRenderer(); QgsPointCloudAttributeByRampRenderer *colorramp2DRenderer = new QgsPointCloudAttributeByRampRenderer(); colorramp2DRenderer->setAttribute( QStringLiteral( "Z" ) ); @@ -218,51 +218,51 @@ void TestQgsPointCloud3DRendering::testDisableSync3DRendererTo2DRenderer() classification2DRenderer->setCategories( categories ); - // enable syncing, the 3d renderer should change when the 2d renderer changes + // enable syncing, the 3D renderer should change when the 2D renderer changes mLayer->setSync3DRendererTo2DRenderer( true ); { - // for the extent 2d renderer we should have a 3d renderer but no symbol + // for the extent 2D renderer we should have a 3D renderer but no symbol mLayer->setRenderer( extent2DRenderer ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - QVERIFY( !r3d->symbol() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + QVERIFY( !r3D->symbol() ); } { mLayer->setRenderer( colorramp2DRenderer ); - QgsPointCloudAttributeByRampRenderer *r2d = static_cast( mLayer->renderer() ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3d->symbol() ); + QgsPointCloudAttributeByRampRenderer *r2D = static_cast( mLayer->renderer() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3D->symbol() ); QVERIFY( s ); - QVERIFY( s->attribute() == r2d->attribute() ); - QVERIFY( s->colorRampShader() == r2d->colorRampShader() ); - QVERIFY( s->colorRampShaderMin() == r2d->minimum() ); - QVERIFY( s->colorRampShaderMax() == r2d->maximum() ); + QVERIFY( s->attribute() == r2D->attribute() ); + QVERIFY( s->colorRampShader() == r2D->colorRampShader() ); + QVERIFY( s->colorRampShaderMin() == r2D->minimum() ); + QVERIFY( s->colorRampShaderMax() == r2D->maximum() ); } - // now disable syncing and check that the 3d renderer symbol does not change + // now disable syncing and check that the 3D renderer symbol does not change mLayer->setSync3DRendererTo2DRenderer( false ); { mLayer->setRenderer( colorramp2DRenderer ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3d->symbol() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3D ->symbol() ); QVERIFY( s ); } { mLayer->setRenderer( rgb2DRenderer ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3d->symbol() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3D ->symbol() ); QVERIFY( s ); } { mLayer->setRenderer( classification2DRenderer ); - QgsPointCloudLayer3DRenderer *r3d = static_cast( mLayer->renderer3D() ); - QVERIFY( r3d ); - const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3d->symbol() ); + QgsPointCloudLayer3DRenderer *r3D = static_cast( mLayer->renderer3D() ); + QVERIFY( r3D ); + const QgsColorRampPointCloud3DSymbol *s = dynamic_cast( r3D ->symbol() ); QVERIFY( s ); } } @@ -447,7 +447,7 @@ void TestQgsPointCloud3DRendering::testPointCloudSyncedTo2D() QgsPointCloudLayer3DRenderer *renderer = new QgsPointCloudLayer3DRenderer(); mLayer->setRenderer3D( renderer ); - // gather different 2d renderers + // gather different 2D renderers QgsPointCloudExtentRenderer *extent2DRenderer = new QgsPointCloudExtentRenderer(); QgsPointCloudAttributeByRampRenderer *colorramp2DRenderer = new QgsPointCloudAttributeByRampRenderer(); colorramp2DRenderer->setAttribute( QStringLiteral( "Z" ) ); @@ -478,14 +478,14 @@ void TestQgsPointCloud3DRendering::testPointCloudSyncedTo2D() // find a better fix in the future. scene->cameraController()->resetView( 2.5 ); - // 3D symbols should now automatically change to match the 2d renderer + // 3D symbols should now automatically change to match the 2D renderer mLayer->setSync3DRendererTo2DRenderer( true ); - // default 2d renderer is rgb for this pointcloud + // default 2D renderer is rgb for this pointcloud QImage img = Qgs3DUtils::captureSceneImage( engine, scene ); QVERIFY( renderCheck( "pointcloud_3d_rgb", img, 40 ) ); - // extent renderer should not render anythin in 3d + // extent renderer should not render anythin in 3D mLayer->setRenderer( extent2DRenderer ); QImage img2 = Qgs3DUtils::captureSceneImage( engine, scene ); QVERIFY( renderCheck( "pointcloud_3d_norenderer", img2, 40 ) ); @@ -502,7 +502,7 @@ void TestQgsPointCloud3DRendering::testPointCloudSyncedTo2D() QImage img5 = Qgs3DUtils::captureSceneImage( engine, scene ); QVERIFY( renderCheck( "pointcloud_3d_classification", img5, 40 ) ); - // Now let's stop syncing, 3d symbol should stay at the last one used + // Now let's stop syncing, 3D symbol should stay at the last one used mLayer->setSync3DRendererTo2DRenderer( false ); mLayer->setRenderer( extent2DRenderer_2 );