Navigation Menu

Skip to content

Commit

Permalink
Disble layer rendering to 3D terrain texture for 3D rendered layers (#…
Browse files Browse the repository at this point in the history
…44367)

* add optional layer rendering to 3D terrain

* remove terrainLayers from Qgs3DMapSettings

* fix tests

* switch to layer terrain rendering when no 3d renderer is set

* fix mesh tests to handle terrain being disabled
  • Loading branch information
NEDJIMAbelgacem committed Aug 11, 2021
1 parent 66bd635 commit 826c6a7
Show file tree
Hide file tree
Showing 20 changed files with 75 additions and 246 deletions.
71 changes: 0 additions & 71 deletions python/3d/auto_generated/qgs3dmapsettings.sip.in
Expand Up @@ -167,15 +167,9 @@ Sets the list of 3D map ``layers`` to be rendered in the scene.

This setting dictates which layers are to be rendered using their 3D rendering configuration, if available.

.. note::

Layers which are rendered as part of the map terrain are specified via ``setTerrainLayers``().

.. seealso:: :py:func:`layers`

.. seealso:: :py:func:`layersChanged`

.. seealso:: :py:func:`setTerrainLayers`
%End

QList<QgsMapLayer *> layers() const;
Expand All @@ -184,61 +178,11 @@ Returns the list of 3D map layers to be rendered in the scene.

This setting dictates which layers are to be rendered using their 3D rendering configuration, if available.

.. note::

Layers which are rendered as part of the map terrain are retrieved via ``terrainLayers``().

.. seealso:: :py:func:`setLayers`

.. seealso:: :py:func:`layersChanged`

.. seealso:: :py:func:`terrainLayers`
%End


void setTerrainLayers( const QList<QgsMapLayer *> &layers );
%Docstring
Sets the list of 2d map ``layers`` to be rendered in the terrain.

.. note::

Layers which are rendered as 3D layers as part of the scene are specified via ``setLayers``().

.. note::

If :py:func:`~Qgs3DMapSettings.terrainMapTheme` is set, it has a priority over the list of layers specified here.


.. seealso:: :py:func:`terrainLayers`

.. seealso:: :py:func:`terrainLayersChanged`

.. seealso:: :py:func:`setLayers`

.. versionadded:: 3.16
%End

QList<QgsMapLayer *> terrainLayers() const;
%Docstring
Returns the list of map layers to be rendered as a texture of the terrain.

.. note::

Layers which are rendered as 3D layers as part of the scene are retrieved via ``layers``().

.. note::

If :py:func:`~Qgs3DMapSettings.terrainMapTheme` is set, it has a priority over the list of layers returned here.


.. seealso:: :py:func:`setTerrainLayers`

.. seealso:: :py:func:`terrainLayersChanged`

.. seealso:: :py:func:`layers`

.. versionadded:: 3.16
%End

void setTerrainVerticalScale( double zScale );
%Docstring
Expand Down Expand Up @@ -662,21 +606,6 @@ Emitted when the list of map layers for 3d rendering has changed.
.. seealso:: :py:func:`setLayers`

.. seealso:: :py:func:`layers`

.. seealso:: :py:func:`terrainLayersChanged`
%End

void terrainLayersChanged();
%Docstring
Emitted when the list of map layers for terrain texture has changed.

.. seealso:: :py:func:`terrainLayers`

.. seealso:: :py:func:`setTerrainLayers`

.. seealso:: :py:func:`layersChanged`

.. versionadded:: 3.16
%End

void terrainGeneratorChanged();
Expand Down
7 changes: 7 additions & 0 deletions python/gui/auto_additions/qgsqueryresultwidget.py
@@ -0,0 +1,7 @@
# The following has been generated automatically from src/gui/qgsqueryresultwidget.h
# monkey patching scoped based enum
QgsQueryResultWidget.QueryWidgetMode.SqlQueryMode.__doc__ = "Defaults widget mode for SQL execution and SQL query layer creation."
QgsQueryResultWidget.QueryWidgetMode.QueryLayerUpdateMode.__doc__ = "SQL query layer update mode: the create SQL layer button is renamed to 'Update' and the SQL layer creation group box is expanded."
QgsQueryResultWidget.QueryWidgetMode.__doc__ = 'The QueryWidgetMode enum represents various modes for the widget appearance.\n\n' + '* ``SqlQueryMode``: ' + QgsQueryResultWidget.QueryWidgetMode.SqlQueryMode.__doc__ + '\n' + '* ``QueryLayerUpdateMode``: ' + QgsQueryResultWidget.QueryWidgetMode.QueryLayerUpdateMode.__doc__
# --
QgsQueryResultWidget.QueryWidgetMode.baseClass = QgsQueryResultWidget
60 changes: 0 additions & 60 deletions src/3d/qgs3dmapsettings.cpp
Expand Up @@ -58,7 +58,6 @@ Qgs3DMapSettings::Qgs3DMapSettings( const Qgs3DMapSettings &other )
, mCameraNavigationMode( other.mCameraNavigationMode )
, mCameraMovementSpeed( other.mCameraMovementSpeed )
, mLayers( other.mLayers )
, mTerrainLayers( other.mTerrainLayers )
, mRenderers() // initialized in body
, mTransformContext( other.mTransformContext )
, mPathResolver( other.mPathResolver )
Expand Down Expand Up @@ -181,23 +180,6 @@ void Qgs3DMapSettings::readXml( const QDomElement &elem, const QgsReadWriteConte
}
mLayers = mapLayers; // needs to resolve refs afterwards

QDomElement elemTerrainLayers = elemTerrain.firstChildElement( QStringLiteral( "terrainLayers" ) );
if ( elemTerrainLayers.isNull() )
{
mTerrainLayers = mLayers;
}
else
{
QDomElement elemTerrainMapLayer = elemTerrainLayers.firstChildElement( QStringLiteral( "layer" ) );
QList<QgsMapLayerRef> terrainMapLayers;
while ( !elemTerrainMapLayer.isNull() )
{
terrainMapLayers << QgsMapLayerRef( elemTerrainMapLayer.attribute( QStringLiteral( "id" ) ) );
elemTerrainMapLayer = elemTerrainMapLayer.nextSiblingElement( QStringLiteral( "layer" ) );
}
mTerrainLayers = mapLayers; // needs to resolve refs afterwards
}

QDomElement elemTerrainGenerator = elemTerrain.firstChildElement( QStringLiteral( "generator" ) );
QString terrainGenType = elemTerrainGenerator.attribute( QStringLiteral( "type" ) );
if ( terrainGenType == QLatin1String( "dem" ) )
Expand Down Expand Up @@ -364,15 +346,6 @@ QDomElement Qgs3DMapSettings::writeXml( QDomDocument &doc, const QgsReadWriteCon
}
elemTerrain.appendChild( elemMapLayers );

QDomElement elemTerrainMapLayers = doc.createElement( QStringLiteral( "terrainLayers" ) );
for ( const QgsMapLayerRef &layerRef : mTerrainLayers )
{
QDomElement elemMapLayer = doc.createElement( QStringLiteral( "layer" ) );
elemMapLayer.setAttribute( QStringLiteral( "id" ), layerRef.layerId );
elemTerrainMapLayers.appendChild( elemMapLayer );
}
elemTerrain.appendChild( elemTerrainMapLayers );

QDomElement elemTerrainGenerator = doc.createElement( QStringLiteral( "generator" ) );
elemTerrainGenerator.setAttribute( QStringLiteral( "type" ), QgsTerrainGenerator::typeToString( mTerrainGenerator->type() ) );
mTerrainGenerator->writeXml( elemTerrainGenerator );
Expand Down Expand Up @@ -436,11 +409,6 @@ void Qgs3DMapSettings::resolveReferences( const QgsProject &project )
QgsMapLayerRef &layerRef = mLayers[i];
layerRef.setLayer( project.mapLayer( layerRef.layerId ) );
}
for ( int i = 0; i < mTerrainLayers.count(); ++i )
{
QgsMapLayerRef &layerRef = mTerrainLayers[i];
layerRef.setLayer( project.mapLayer( layerRef.layerId ) );
}

mTerrainGenerator->resolveReferences( project );

Expand Down Expand Up @@ -546,34 +514,6 @@ QList<QgsMapLayer *> Qgs3DMapSettings::layers() const
return lst;
}

void Qgs3DMapSettings::setTerrainLayers( const QList<QgsMapLayer *> &layers )
{
QList<QgsMapLayerRef> lst;
lst.reserve( layers.count() );
for ( QgsMapLayer *layer : layers )
{
lst.append( layer );
}

if ( mTerrainLayers == lst )
return;

mTerrainLayers = lst;
emit terrainLayersChanged();
}

QList<QgsMapLayer *> Qgs3DMapSettings::terrainLayers() const
{
QList<QgsMapLayer *> lst;
lst.reserve( mTerrainLayers.count() );
for ( const QgsMapLayerRef &layerRef : mTerrainLayers )
{
if ( layerRef.layer )
lst.append( layerRef.layer );
}
return lst;
}

void Qgs3DMapSettings::setMapTileResolution( int res )
{
if ( mMapTileResolution == res )
Expand Down
47 changes: 0 additions & 47 deletions src/3d/qgs3dmapsettings.h
Expand Up @@ -163,11 +163,8 @@ class _3D_EXPORT Qgs3DMapSettings : public QObject, public QgsTemporalRangeObjec
*
* This setting dictates which layers are to be rendered using their 3D rendering configuration, if available.
*
* \note Layers which are rendered as part of the map terrain are specified via \a setTerrainLayers().
*
* \see layers()
* \see layersChanged()
* \see setTerrainLayers()
*/
void setLayers( const QList<QgsMapLayer *> &layers );

Expand All @@ -176,46 +173,15 @@ class _3D_EXPORT Qgs3DMapSettings : public QObject, public QgsTemporalRangeObjec
*
* This setting dictates which layers are to be rendered using their 3D rendering configuration, if available.
*
* \note Layers which are rendered as part of the map terrain are retrieved via \a terrainLayers().
*
* \see setLayers()
* \see layersChanged()
* \see terrainLayers()
*/
QList<QgsMapLayer *> layers() const;

//
// terrain related config
//

/**
* Sets the list of 2d map \a layers to be rendered in the terrain.
*
* \note Layers which are rendered as 3D layers as part of the scene are specified via \a setLayers().
*
* \note If terrainMapTheme() is set, it has a priority over the list of layers specified here.
*
* \see terrainLayers()
* \see terrainLayersChanged()
* \see setLayers()
* \since QGIS 3.16
*/
void setTerrainLayers( const QList<QgsMapLayer *> &layers );

/**
* Returns the list of map layers to be rendered as a texture of the terrain.
*
* \note Layers which are rendered as 3D layers as part of the scene are retrieved via \a layers().
*
* \note If terrainMapTheme() is set, it has a priority over the list of layers returned here.
*
* \see setTerrainLayers()
* \see terrainLayersChanged()
* \see layers()
* \since QGIS 3.16
*/
QList<QgsMapLayer *> terrainLayers() const;

/**
* Sets vertical scale (exaggeration) of terrain
* (1 = true scale, > 1 = hills get more pronounced)
Expand Down Expand Up @@ -601,21 +567,9 @@ class _3D_EXPORT Qgs3DMapSettings : public QObject, public QgsTemporalRangeObjec
*
* \see setLayers()
* \see layers()
* \see terrainLayersChanged()
*/
void layersChanged();

/**
* Emitted when the list of map layers for terrain texture has changed.
*
* \see terrainLayers()
* \see setTerrainLayers()
* \see layersChanged()
*
* \since QGIS 3.16
*/
void terrainLayersChanged();

//! Emitted when the terrain generator has changed
void terrainGeneratorChanged();
//! Emitted when the vertical scale of the terrain has changed
Expand Down Expand Up @@ -787,7 +741,6 @@ class _3D_EXPORT Qgs3DMapSettings : public QObject, public QgsTemporalRangeObjec
QgsCameraController::NavigationMode mCameraNavigationMode = QgsCameraController::NavigationMode::TerrainBasedNavigation;
double mCameraMovementSpeed = 5.0;
QList<QgsMapLayerRef> mLayers; //!< Layers to be rendered
QList<QgsMapLayerRef> mTerrainLayers; //!< Terrain layers to be rendered
QList<QgsAbstract3DRenderer *> mRenderers; //!< Extra stuff to render as 3D object
//! Coordinate transform context
QgsCoordinateTransformContext mTransformContext;
Expand Down
2 changes: 1 addition & 1 deletion src/3d/terrain/qgsdemterraintileloader_p.cpp
Expand Up @@ -111,7 +111,7 @@ Qt3DCore::QEntity *QgsDemTerrainTileLoader::createEntity( Qt3DCore::QEntity *par

// create material

createTextureComponent( entity, map.isTerrainShadingEnabled(), map.terrainShadingMaterial(), !map.terrainLayers().empty() );
createTextureComponent( entity, map.isTerrainShadingEnabled(), map.terrainShadingMaterial(), !map.layers().empty() );

// create transform

Expand Down
2 changes: 1 addition & 1 deletion src/3d/terrain/qgsflatterraingenerator.cpp
Expand Up @@ -53,7 +53,7 @@ Qt3DCore::QEntity *FlatTerrainChunkLoader::createEntity( Qt3DCore::QEntity *pare
// create material

const Qgs3DMapSettings &map = terrain()->map3D();
createTextureComponent( entity, map.isTerrainShadingEnabled(), map.terrainShadingMaterial(), !map.terrainLayers().empty() );
createTextureComponent( entity, map.isTerrainShadingEnabled(), map.terrainShadingMaterial(), !map.layers().empty() );

// create transform

Expand Down
4 changes: 2 additions & 2 deletions src/3d/terrain/qgsterrainentity_p.cpp
Expand Up @@ -67,7 +67,7 @@ QgsTerrainEntity::QgsTerrainEntity( const Qgs3DMapSettings &map, Qt3DCore::QNode
connect( &map, &Qgs3DMapSettings::showTerrainBoundingBoxesChanged, this, &QgsTerrainEntity::onShowBoundingBoxesChanged );
connect( &map, &Qgs3DMapSettings::showTerrainTilesInfoChanged, this, &QgsTerrainEntity::invalidateMapImages );
connect( &map, &Qgs3DMapSettings::showLabelsChanged, this, &QgsTerrainEntity::invalidateMapImages );
connect( &map, &Qgs3DMapSettings::terrainLayersChanged, this, &QgsTerrainEntity::onLayersChanged );
connect( &map, &Qgs3DMapSettings::layersChanged, this, &QgsTerrainEntity::onLayersChanged );
connect( &map, &Qgs3DMapSettings::backgroundColorChanged, this, &QgsTerrainEntity::invalidateMapImages );
connect( &map, &Qgs3DMapSettings::terrainMapThemeChanged, this, &QgsTerrainEntity::invalidateMapImages );
connect( &map, &Qgs3DMapSettings::terrainElevationOffsetChanged, this, &QgsTerrainEntity::onTerrainElevationOffsetChanged );
Expand Down Expand Up @@ -180,7 +180,7 @@ void QgsTerrainEntity::connectToLayersRepaintRequest()
disconnect( layer, &QgsMapLayer::repaintRequested, this, &QgsTerrainEntity::invalidateMapImages );
}

mLayers = mMap.terrainLayers();
mLayers = mMap.layers();

for ( QgsMapLayer *layer : std::as_const( mLayers ) )
{
Expand Down
11 changes: 10 additions & 1 deletion src/3d/terrain/qgsterraintexturegenerator_p.cpp
Expand Up @@ -39,6 +39,15 @@ int QgsTerrainTextureGenerator::render( const QgsRectangle &extent, QgsChunkNode
QgsMapSettings mapSettings( baseMapSettings() );
mapSettings.setExtent( extent );

QList<QgsMapLayer *> layers = mMap.layers();
QList<QgsMapLayer *> toBeRenderedLayers;
for ( QgsMapLayer *l : layers )
{
if ( l->renderer3D() == nullptr )
toBeRenderedLayers.push_back( l );
}
mapSettings.setLayers( toBeRenderedLayers );

QgsEventTracing::addEvent( QgsEventTracing::AsyncBegin, QStringLiteral( "3D" ), QStringLiteral( "Texture" ), tileId.text() );

QgsMapRendererSequentialJob *job = new QgsMapRendererSequentialJob( mapSettings );
Expand Down Expand Up @@ -155,7 +164,7 @@ QgsMapSettings QgsTerrainTextureGenerator::baseMapSettings()
QString mapThemeName = mMap.terrainMapTheme();
if ( mapThemeName.isEmpty() || !mapThemes || !mapThemes->hasMapTheme( mapThemeName ) )
{
mapSettings.setLayers( mMap.terrainLayers() );
mapSettings.setLayers( mMap.layers() );
}
else
{
Expand Down
1 change: 0 additions & 1 deletion src/app/3d/qgs3dmapcanvasdockwidget.cpp
Expand Up @@ -403,7 +403,6 @@ void Qgs3DMapCanvasDockWidget::exportScene()
void Qgs3DMapCanvasDockWidget::onMainCanvasLayersChanged()
{
mCanvas->map()->setLayers( mMainCanvas->layers() );
mCanvas->map()->setTerrainLayers( mMainCanvas->layers() );
}

void Qgs3DMapCanvasDockWidget::onMainCanvasColorChanged()
Expand Down
3 changes: 1 addition & 2 deletions src/app/3d/qgspointcloud3dsymbolwidget.cpp
Expand Up @@ -627,7 +627,7 @@ void QgsPointCloud3DSymbolWidget::setPointCloudSize( int size )
mPointCloudSizeLabel->setText( QStringLiteral( "%1 points" ).arg( size ) );
}

double QgsPointCloud3DSymbolWidget::showBoundingBoxes() const
bool QgsPointCloud3DSymbolWidget::showBoundingBoxes() const
{
return mShowBoundingBoxesCheckBox->isChecked();
}
Expand All @@ -636,4 +636,3 @@ void QgsPointCloud3DSymbolWidget::connectChildPanels( QgsPanelWidget *parent )
{
parent->connectChildPanel( mClassifiedRendererWidget );
}

2 changes: 1 addition & 1 deletion src/app/3d/qgspointcloud3dsymbolwidget.h
Expand Up @@ -40,7 +40,7 @@ class QgsPointCloud3DSymbolWidget : public QWidget, private Ui::QgsPointCloud3DS
double maximumScreenError() const;

void setShowBoundingBoxes( bool showBoundingBoxes );
double showBoundingBoxes() const;
bool showBoundingBoxes() const;

void setPointBudget( double budget );
double pointBudget() const;
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgisapp.cpp
Expand Up @@ -13473,7 +13473,7 @@ void QgisApp::new3DMapCanvas()
map->setSelectionColor( mMapCanvas->selectionColor() );
map->setBackgroundColor( mMapCanvas->canvasColor() );
map->setLayers( mMapCanvas->layers() );
map->setTerrainLayers( mMapCanvas->layers() );
// map->setTerrainLayers( mMapCanvas->layers() );
map->setTemporalRange( mMapCanvas->temporalRange() );

const QgsCameraController::NavigationMode defaultNavMode = settings.enumValue( QStringLiteral( "map3d/defaultNavigation" ), QgsCameraController::TerrainBasedNavigation, QgsSettings::App );
Expand Down

0 comments on commit 826c6a7

Please sign in to comment.