QGIS API Documentation 3.41.0-Master (d5b93354e9c)
Loading...
Searching...
No Matches
qgs3dmapsettings.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgs3dmapsettings.cpp
3 --------------------------------------
4 Date : July 2017
5 Copyright : (C) 2017 by Martin Dobias
6 Email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#include "qgs3dmapsettings.h"
17#include "moc_qgs3dmapsettings.cpp"
18
19#include "qgs3dutils.h"
22#include "qgsmeshterraingenerator.h"
27#include "qgsterrainprovider.h"
28#include "qgslightsource.h"
29#include "qgscolorutils.h"
30#include "qgsrasterlayer.h"
33#include "qgs3drendercontext.h"
34#include "qgsthreadingutils.h"
36
37#include <QDomDocument>
38#include <QDomElement>
39
40
42 : QObject( nullptr )
43{
44 connect( this, &Qgs3DMapSettings::settingsChanged, [&]()
45 {
47 } );
48 connectChangedSignalsToSettingsChanged();
49}
50
52 : QObject( nullptr )
53 , QgsTemporalRangeObject( other )
54 , mOrigin( other.mOrigin )
55 , mCrs( other.mCrs )
56 , mBackgroundColor( other.mBackgroundColor )
57 , mSelectionColor( other.mSelectionColor )
58 , mTerrainVerticalScale( other.mTerrainVerticalScale )
59 , mTerrainGenerator( other.mTerrainGenerator ? other.mTerrainGenerator->clone() : nullptr )
60 , mMapTileResolution( other.mMapTileResolution )
61 , mMaxTerrainScreenError( other.mMaxTerrainScreenError )
62 , mMaxTerrainGroundError( other.mMaxTerrainGroundError )
63 , mTerrainElevationOffset( other.mTerrainElevationOffset )
64 , mTerrainShadingEnabled( other.mTerrainShadingEnabled )
65 , mTerrainShadingMaterial( other.mTerrainShadingMaterial )
66 , mTerrainMapTheme( other.mTerrainMapTheme )
67 , mShowTerrainBoundingBoxes( other.mShowTerrainBoundingBoxes )
68 , mShowTerrainTileInfo( other.mShowTerrainTileInfo )
69 , mShowCameraViewCenter( other.mShowCameraViewCenter )
70 , mShowCameraRotationCenter( other.mShowCameraRotationCenter )
71 , mShowLightSources( other.mShowLightSources )
72 , mShowLabels( other.mShowLabels )
73 , mStopUpdates( other.mStopUpdates )
74 , mShowDebugPanel( other.mShowDebugPanel )
75 , mFieldOfView( other.mFieldOfView )
76 , mProjectionType( other.mProjectionType )
77 , mCameraNavigationMode( other.mCameraNavigationMode )
78 , mCameraMovementSpeed( other.mCameraMovementSpeed )
79 , mLayers( other.mLayers )
80 , mTransformContext( other.mTransformContext )
81 , mPathResolver( other.mPathResolver )
82 , mMapThemes( other.mMapThemes )
83 , mDpi( other.mDpi )
84 , mIsFpsCounterEnabled( other.mIsFpsCounterEnabled )
85 , mIsSkyboxEnabled( other.mIsSkyboxEnabled )
86 , mSkyboxSettings( other.mSkyboxSettings )
87 , mShadowSettings( other.mShadowSettings )
88 , mAmbientOcclusionSettings( other.mAmbientOcclusionSettings )
89 , mEyeDomeLightingEnabled( other.mEyeDomeLightingEnabled )
90 , mEyeDomeLightingStrength( other.mEyeDomeLightingStrength )
91 , mEyeDomeLightingDistance( other.mEyeDomeLightingDistance )
92 , mViewSyncMode( other.mViewSyncMode )
93 , mVisualizeViewFrustum( other.mVisualizeViewFrustum )
94 , mDebugShadowMapEnabled( other.mDebugShadowMapEnabled )
95 , mDebugShadowMapCorner( other.mDebugShadowMapCorner )
96 , mDebugShadowMapSize( other.mDebugShadowMapSize )
97 , mDebugDepthMapEnabled( other.mDebugDepthMapEnabled )
98 , mDebugDepthMapCorner( other.mDebugDepthMapCorner )
99 , mDebugDepthMapSize( other.mDebugDepthMapSize )
100 , mTerrainRenderingEnabled( other.mTerrainRenderingEnabled )
101 , mRendererUsage( other.mRendererUsage )
102 , m3dAxisSettings( other.m3dAxisSettings )
103 , mIsDebugOverlayEnabled( other.mIsDebugOverlayEnabled )
104 , mExtent( other.mExtent )
105 , mShowExtentIn2DView( other.mShowExtentIn2DView )
106{
107 for ( QgsLightSource *source : std::as_const( other.mLightSources ) )
108 {
109 if ( source )
110 mLightSources << source->clone();
111 }
112
113 connect( this, &Qgs3DMapSettings::settingsChanged, [&]()
114 {
116 } );
117 connectChangedSignalsToSettingsChanged();
118}
119
121{
122 qDeleteAll( mLightSources );
123}
124
125void Qgs3DMapSettings::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
126{
128
130 QDomElement elemOrigin = elem.firstChildElement( QStringLiteral( "origin" ) );
131 mOrigin = QgsVector3D(
132 elemOrigin.attribute( QStringLiteral( "x" ) ).toDouble(),
133 elemOrigin.attribute( QStringLiteral( "y" ) ).toDouble(),
134 elemOrigin.attribute( QStringLiteral( "z" ) ).toDouble() );
135
136 QDomElement elemExtent = elem.firstChildElement( QStringLiteral( "extent" ) );
137 if ( !elemExtent.isNull() )
138 {
139 mExtent = QgsRectangle(
140 elemExtent.attribute( QStringLiteral( "xMin" ) ).toDouble(),
141 elemExtent.attribute( QStringLiteral( "yMin" ) ).toDouble(),
142 elemExtent.attribute( QStringLiteral( "xMax" ) ).toDouble(),
143 elemExtent.attribute( QStringLiteral( "yMax" ) ).toDouble() );
144
145 mShowExtentIn2DView = elemExtent.attribute( QStringLiteral( "showIn2dView" ), QStringLiteral( "0" ) ).toInt();
146 }
147 else
148 {
150 }
151
152 QDomElement elemCamera = elem.firstChildElement( QStringLiteral( "camera" ) );
153 if ( !elemCamera.isNull() )
154 {
155 mFieldOfView = elemCamera.attribute( QStringLiteral( "field-of-view" ), QStringLiteral( "45" ) ).toFloat();
156 mProjectionType = static_cast< Qt3DRender::QCameraLens::ProjectionType >( elemCamera.attribute( QStringLiteral( "projection-type" ), QStringLiteral( "1" ) ).toInt() );
157 QString cameraNavigationMode = elemCamera.attribute( QStringLiteral( "camera-navigation-mode" ), QStringLiteral( "basic-navigation" ) );
158 if ( cameraNavigationMode == QLatin1String( "terrain-based-navigation" ) )
159 mCameraNavigationMode = Qgis::NavigationMode::TerrainBased;
160 else if ( cameraNavigationMode == QLatin1String( "walk-navigation" ) )
161 mCameraNavigationMode = Qgis::NavigationMode::Walk;
162 mCameraMovementSpeed = elemCamera.attribute( QStringLiteral( "camera-movement-speed" ), QStringLiteral( "5.0" ) ).toDouble();
163 }
164
165 QDomElement elemColor = elem.firstChildElement( QStringLiteral( "color" ) );
166 if ( !elemColor.isNull() )
167 {
168 mBackgroundColor = QgsColorUtils::colorFromString( elemColor.attribute( QStringLiteral( "background" ) ) );
169 mSelectionColor = QgsColorUtils::colorFromString( elemColor.attribute( QStringLiteral( "selection" ) ) );
170 }
171
172 QDomElement elemCrs = elem.firstChildElement( QStringLiteral( "crs" ) );
173 mCrs.readXml( elemCrs );
174
175 QDomElement elemTerrain = elem.firstChildElement( QStringLiteral( "terrain" ) );
176 mTerrainRenderingEnabled = elemTerrain.attribute( QStringLiteral( "terrain-rendering-enabled" ), QStringLiteral( "1" ) ).toInt();
177 mTerrainVerticalScale = elemTerrain.attribute( QStringLiteral( "exaggeration" ), QStringLiteral( "1" ) ).toFloat();
178 mMapTileResolution = elemTerrain.attribute( QStringLiteral( "texture-size" ), QStringLiteral( "512" ) ).toInt();
179 mMaxTerrainScreenError = elemTerrain.attribute( QStringLiteral( "max-terrain-error" ), QStringLiteral( "3" ) ).toFloat();
180 mMaxTerrainGroundError = elemTerrain.attribute( QStringLiteral( "max-ground-error" ), QStringLiteral( "1" ) ).toFloat();
181 mTerrainShadingEnabled = elemTerrain.attribute( QStringLiteral( "shading-enabled" ), QStringLiteral( "0" ) ).toInt();
182 mTerrainElevationOffset = elemTerrain.attribute( QStringLiteral( "elevation-offset" ), QStringLiteral( "0.0" ) ).toFloat();
183
184 QDomElement elemTerrainShadingMaterial = elemTerrain.firstChildElement( QStringLiteral( "shading-material" ) );
185 if ( !elemTerrainShadingMaterial.isNull() )
186 mTerrainShadingMaterial.readXml( elemTerrainShadingMaterial, context );
187 mTerrainMapTheme = elemTerrain.attribute( QStringLiteral( "map-theme" ) );
188 mShowLabels = elemTerrain.attribute( QStringLiteral( "show-labels" ), QStringLiteral( "0" ) ).toInt();
189
190 qDeleteAll( mLightSources );
191 mLightSources.clear();
192 const QDomElement lightsElem = elem.firstChildElement( QStringLiteral( "lights" ) );
193 if ( !lightsElem.isNull() )
194 {
195 const QDomNodeList lightNodes = lightsElem.childNodes();
196 for ( int i = 0; i < lightNodes.size(); ++i )
197 {
198 const QDomElement lightElement = lightNodes.at( i ).toElement();
199 if ( QgsLightSource *light = QgsLightSource::createFromXml( lightElement, context ) )
200 mLightSources << light;
201 }
202 }
203 else
204 {
205 // older project format
206 QDomElement elemPointLights = elem.firstChildElement( QStringLiteral( "point-lights" ) );
207 if ( !elemPointLights.isNull() )
208 {
209 QDomElement elemPointLight = elemPointLights.firstChildElement( QStringLiteral( "point-light" ) );
210 while ( !elemPointLight.isNull() )
211 {
212 std::unique_ptr< QgsPointLightSettings > pointLight = std::make_unique< QgsPointLightSettings >();
213 pointLight->readXml( elemPointLight, context );
214 mLightSources << pointLight.release();
215 elemPointLight = elemPointLight.nextSiblingElement( QStringLiteral( "point-light" ) );
216 }
217 }
218 else
219 {
220 // QGIS <= 3.4 did not have light configuration
221 std::unique_ptr< QgsPointLightSettings > defaultLight = std::make_unique< QgsPointLightSettings >();
222 defaultLight->setPosition( QgsVector3D( 0, 1000, 0 ) );
223 mLightSources << defaultLight.release();
224 }
225
226 QDomElement elemDirectionalLights = elem.firstChildElement( QStringLiteral( "directional-lights" ) );
227 if ( !elemDirectionalLights.isNull() )
228 {
229 QDomElement elemDirectionalLight = elemDirectionalLights.firstChildElement( QStringLiteral( "directional-light" ) );
230 while ( !elemDirectionalLight.isNull() )
231 {
232 std::unique_ptr< QgsDirectionalLightSettings > directionalLight = std::make_unique< QgsDirectionalLightSettings >();
233 directionalLight->readXml( elemDirectionalLight, context );
234 mLightSources << directionalLight.release();
235 elemDirectionalLight = elemDirectionalLight.nextSiblingElement( QStringLiteral( "directional-light" ) );
236 }
237 }
238 }
239
240 QDomElement elemMapLayers = elemTerrain.firstChildElement( QStringLiteral( "layers" ) );
241 QDomElement elemMapLayer = elemMapLayers.firstChildElement( QStringLiteral( "layer" ) );
242 QList<QgsMapLayerRef> mapLayers;
243 while ( !elemMapLayer.isNull() )
244 {
245 mapLayers << QgsMapLayerRef( elemMapLayer.attribute( QStringLiteral( "id" ) ) );
246 elemMapLayer = elemMapLayer.nextSiblingElement( QStringLiteral( "layer" ) );
247 }
248 mLayers = mapLayers; // needs to resolve refs afterwards
249
250 QDomElement elemTerrainGenerator = elemTerrain.firstChildElement( QStringLiteral( "generator" ) );
251 QString terrainGenType = elemTerrainGenerator.attribute( QStringLiteral( "type" ) );
252 if ( terrainGenType == QLatin1String( "dem" ) )
253 {
254 QgsDemTerrainGenerator *demTerrainGenerator = new QgsDemTerrainGenerator;
255 demTerrainGenerator->setCrs( mCrs, mTransformContext );
256 setTerrainGenerator( demTerrainGenerator );
257 }
258 else if ( terrainGenType == QLatin1String( "online" ) )
259 {
260 QgsOnlineTerrainGenerator *onlineTerrainGenerator = new QgsOnlineTerrainGenerator;
261 onlineTerrainGenerator->setCrs( mCrs, mTransformContext );
262 setTerrainGenerator( onlineTerrainGenerator );
263 }
264 else if ( terrainGenType == QLatin1String( "mesh" ) )
265 {
266 QgsMeshTerrainGenerator *meshTerrainGenerator = new QgsMeshTerrainGenerator;
267 meshTerrainGenerator->setCrs( mCrs, mTransformContext );
268 setTerrainGenerator( meshTerrainGenerator );
269 }
270 else if ( terrainGenType == QLatin1String( "quantizedmesh" ) )
271 {
273 setTerrainGenerator( qmTerrainGenerator );
274 }
275 else // "flat"
276 {
278 flatGen->setCrs( mCrs );
279 setTerrainGenerator( flatGen );
280 }
281 mTerrainGenerator->readXml( elemTerrainGenerator );
282
283 QDomElement elemSkybox = elem.firstChildElement( QStringLiteral( "skybox" ) );
284 mIsSkyboxEnabled = elemSkybox.attribute( QStringLiteral( "skybox-enabled" ) ).toInt();
285 mSkyboxSettings.readXml( elemSkybox, context );
286
287 QDomElement elemShadows = elem.firstChildElement( QStringLiteral( "shadow-rendering" ) );
288 mShadowSettings.readXml( elemShadows, context );
289
290 QDomElement elemAmbientOcclusion = elem.firstChildElement( QStringLiteral( "screen-space-ambient-occlusion" ) );
291 mAmbientOcclusionSettings.readXml( elemAmbientOcclusion, context );
292
293 QDomElement elemEyeDomeLighting = elem.firstChildElement( QStringLiteral( "eye-dome-lighting" ) );
294 mEyeDomeLightingEnabled = elemEyeDomeLighting.attribute( "enabled", QStringLiteral( "0" ) ).toInt();
295 mEyeDomeLightingStrength = elemEyeDomeLighting.attribute( "eye-dome-lighting-strength", QStringLiteral( "1000.0" ) ).toDouble();
296 mEyeDomeLightingDistance = elemEyeDomeLighting.attribute( "eye-dome-lighting-distance", QStringLiteral( "1" ) ).toInt();
297
298 QDomElement elemNavigationSync = elem.firstChildElement( QStringLiteral( "navigation-sync" ) );
299 mViewSyncMode = ( Qgis::ViewSyncModeFlags )( elemNavigationSync.attribute( QStringLiteral( "view-sync-mode" ), QStringLiteral( "0" ) ).toInt() );
300 mVisualizeViewFrustum = elemNavigationSync.attribute( QStringLiteral( "view-frustum-visualization-enabled" ), QStringLiteral( "0" ) ).toInt();
301
302 QDomElement elemDebugSettings = elem.firstChildElement( QStringLiteral( "debug-settings" ) );
303 mDebugShadowMapEnabled = elemDebugSettings.attribute( QStringLiteral( "shadowmap-enabled" ), QStringLiteral( "0" ) ).toInt();
304 mDebugShadowMapCorner = static_cast<Qt::Corner>( elemDebugSettings.attribute( QStringLiteral( "shadowmap-corner" ), "0" ).toInt() );
305 mDebugShadowMapSize = elemDebugSettings.attribute( QStringLiteral( "shadowmap-size" ), QStringLiteral( "0.2" ) ).toDouble();
306
307 mDebugDepthMapEnabled = elemDebugSettings.attribute( QStringLiteral( "depthmap-enabled" ), QStringLiteral( "0" ) ).toInt();
308 mDebugDepthMapCorner = static_cast<Qt::Corner>( elemDebugSettings.attribute( QStringLiteral( "depthmap-corner" ), QStringLiteral( "1" ) ).toInt() );
309 mDebugDepthMapSize = elemDebugSettings.attribute( QStringLiteral( "depthmap-size" ), QStringLiteral( "0.2" ) ).toDouble();
310
311 QDomElement elemDebug = elem.firstChildElement( QStringLiteral( "debug" ) );
312 mShowTerrainBoundingBoxes = elemDebug.attribute( QStringLiteral( "bounding-boxes" ), QStringLiteral( "0" ) ).toInt();
313 mShowTerrainTileInfo = elemDebug.attribute( QStringLiteral( "terrain-tile-info" ), QStringLiteral( "0" ) ).toInt();
314 mShowCameraViewCenter = elemDebug.attribute( QStringLiteral( "camera-view-center" ), QStringLiteral( "0" ) ).toInt();
315 mShowCameraRotationCenter = elemDebug.attribute( QStringLiteral( "camera-rotation-center" ), QStringLiteral( "0" ) ).toInt();
316 mShowLightSources = elemDebug.attribute( QStringLiteral( "show-light-sources" ), QStringLiteral( "0" ) ).toInt();
317 mIsFpsCounterEnabled = elemDebug.attribute( QStringLiteral( "show-fps-counter" ), QStringLiteral( "0" ) ).toInt();
318 mStopUpdates = elemDebug.attribute( QStringLiteral( "stop-updates" ), QStringLiteral( "0" ) ).toInt();
319 mShowDebugPanel = elemDebug.attribute( QStringLiteral( "debug-panel" ), QStringLiteral( "0" ) ).toInt();
320
321 QDomElement elemTemporalRange = elem.firstChildElement( QStringLiteral( "temporal-range" ) );
322 QDateTime start = QDateTime::fromString( elemTemporalRange.attribute( QStringLiteral( "start" ) ), Qt::ISODate );
323 QDateTime end = QDateTime::fromString( elemTemporalRange.attribute( QStringLiteral( "end" ) ), Qt::ISODate );
324 setTemporalRange( QgsDateTimeRange( start, end ) );
325
326 QDomElement elem3dAxis = elem.firstChildElement( QStringLiteral( "axis3d" ) );
327 m3dAxisSettings.readXml( elem3dAxis, context );
328
329}
330
331QDomElement Qgs3DMapSettings::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
332{
334
335 QDomElement elem = doc.createElement( QStringLiteral( "qgis3d" ) );
336
337 QDomElement elemOrigin = doc.createElement( QStringLiteral( "origin" ) );
338 elemOrigin.setAttribute( QStringLiteral( "x" ), QString::number( mOrigin.x() ) );
339 elemOrigin.setAttribute( QStringLiteral( "y" ), QString::number( mOrigin.y() ) );
340 elemOrigin.setAttribute( QStringLiteral( "z" ), QString::number( mOrigin.z() ) );
341 elem.appendChild( elemOrigin );
342
343 QDomElement elemExtent = doc.createElement( QStringLiteral( "extent" ) );
344 elemExtent.setAttribute( QStringLiteral( "xMin" ), mExtent.xMinimum() );
345 elemExtent.setAttribute( QStringLiteral( "yMin" ), mExtent.yMinimum() );
346 elemExtent.setAttribute( QStringLiteral( "xMax" ), mExtent.xMaximum() );
347 elemExtent.setAttribute( QStringLiteral( "yMax" ), mExtent.yMaximum() );
348 elemExtent.setAttribute( QStringLiteral( "showIn2dView" ), mShowExtentIn2DView );
349 elem.appendChild( elemExtent );
350
351 QDomElement elemCamera = doc.createElement( QStringLiteral( "camera" ) );
352 elemCamera.setAttribute( QStringLiteral( "field-of-view" ), mFieldOfView );
353 elemCamera.setAttribute( QStringLiteral( "projection-type" ), static_cast< int >( mProjectionType ) );
354 switch ( mCameraNavigationMode )
355 {
357 elemCamera.setAttribute( QStringLiteral( "camera-navigation-mode" ), QStringLiteral( "terrain-based-navigation" ) );
358 break;
360 elemCamera.setAttribute( QStringLiteral( "camera-navigation-mode" ), QStringLiteral( "walk-navigation" ) );
361 break;
362 }
363 elemCamera.setAttribute( QStringLiteral( "camera-movement-speed" ), mCameraMovementSpeed );
364 elem.appendChild( elemCamera );
365
366 QDomElement elemColor = doc.createElement( QStringLiteral( "color" ) );
367 elemColor.setAttribute( QStringLiteral( "background" ), QgsColorUtils::colorToString( mBackgroundColor ) );
368 elemColor.setAttribute( QStringLiteral( "selection" ), QgsColorUtils::colorToString( mSelectionColor ) );
369 elem.appendChild( elemColor );
370
371 QDomElement elemCrs = doc.createElement( QStringLiteral( "crs" ) );
372 mCrs.writeXml( elemCrs, doc );
373 elem.appendChild( elemCrs );
374
375 QDomElement elemTerrain = doc.createElement( QStringLiteral( "terrain" ) );
376 elemTerrain.setAttribute( QStringLiteral( "terrain-rendering-enabled" ), mTerrainRenderingEnabled ? 1 : 0 );
377 elemTerrain.setAttribute( QStringLiteral( "exaggeration" ), QString::number( mTerrainVerticalScale ) );
378 elemTerrain.setAttribute( QStringLiteral( "texture-size" ), mMapTileResolution );
379 elemTerrain.setAttribute( QStringLiteral( "max-terrain-error" ), QString::number( mMaxTerrainScreenError ) );
380 elemTerrain.setAttribute( QStringLiteral( "max-ground-error" ), QString::number( mMaxTerrainGroundError ) );
381 elemTerrain.setAttribute( QStringLiteral( "shading-enabled" ), mTerrainShadingEnabled ? 1 : 0 );
382 elemTerrain.setAttribute( QStringLiteral( "elevation-offset" ), mTerrainElevationOffset );
383
384 QDomElement elemTerrainShadingMaterial = doc.createElement( QStringLiteral( "shading-material" ) );
385 mTerrainShadingMaterial.writeXml( elemTerrainShadingMaterial, context );
386 elemTerrain.appendChild( elemTerrainShadingMaterial );
387 elemTerrain.setAttribute( QStringLiteral( "map-theme" ), mTerrainMapTheme );
388 elemTerrain.setAttribute( QStringLiteral( "show-labels" ), mShowLabels ? 1 : 0 );
389
390 {
391 QDomElement elemLights = doc.createElement( QStringLiteral( "lights" ) );
392 for ( const QgsLightSource *light : mLightSources )
393 {
394 const QDomElement elemLight = light->writeXml( doc, context );
395 elemLights.appendChild( elemLight );
396 }
397 elem.appendChild( elemLights );
398 }
399
400 QDomElement elemMapLayers = doc.createElement( QStringLiteral( "layers" ) );
401 for ( const QgsMapLayerRef &layerRef : mLayers )
402 {
403 QDomElement elemMapLayer = doc.createElement( QStringLiteral( "layer" ) );
404 elemMapLayer.setAttribute( QStringLiteral( "id" ), layerRef.layerId );
405 elemMapLayers.appendChild( elemMapLayer );
406 }
407 elemTerrain.appendChild( elemMapLayers );
408
409 QDomElement elemTerrainGenerator = doc.createElement( QStringLiteral( "generator" ) );
410 elemTerrainGenerator.setAttribute( QStringLiteral( "type" ), QgsTerrainGenerator::typeToString( mTerrainGenerator->type() ) );
411 mTerrainGenerator->writeXml( elemTerrainGenerator );
412 elemTerrain.appendChild( elemTerrainGenerator );
413 elem.appendChild( elemTerrain );
414
415 QDomElement elemSkybox = doc.createElement( QStringLiteral( "skybox" ) );
416 elemSkybox.setAttribute( QStringLiteral( "skybox-enabled" ), mIsSkyboxEnabled );
417 mSkyboxSettings.writeXml( elemSkybox, context );
418 elem.appendChild( elemSkybox );
419
420 QDomElement elemShadows = doc.createElement( QStringLiteral( "shadow-rendering" ) );
421 mShadowSettings.writeXml( elemShadows, context );
422 elem.appendChild( elemShadows );
423
424 QDomElement elemAmbientOcclusion = doc.createElement( QStringLiteral( "screen-space-ambient-occlusion" ) );
425 mAmbientOcclusionSettings.writeXml( elemAmbientOcclusion, context );
426 elem.appendChild( elemAmbientOcclusion );
427
428 QDomElement elemDebug = doc.createElement( QStringLiteral( "debug" ) );
429 elemDebug.setAttribute( QStringLiteral( "bounding-boxes" ), mShowTerrainBoundingBoxes ? 1 : 0 );
430 elemDebug.setAttribute( QStringLiteral( "terrain-tile-info" ), mShowTerrainTileInfo ? 1 : 0 );
431 elemDebug.setAttribute( QStringLiteral( "camera-view-center" ), mShowCameraViewCenter ? 1 : 0 );
432 elemDebug.setAttribute( QStringLiteral( "camera-rotation-center" ), mShowCameraRotationCenter ? 1 : 0 );
433 elemDebug.setAttribute( QStringLiteral( "show-light-sources" ), mShowLightSources ? 1 : 0 );
434 elemDebug.setAttribute( QStringLiteral( "show-fps-counter" ), mIsFpsCounterEnabled ? 1 : 0 );
435 elemDebug.setAttribute( QStringLiteral( "stop-updates" ), mStopUpdates ? 1 : 0 );
436 elemDebug.setAttribute( QStringLiteral( "debug-panel" ), mShowDebugPanel ? 1 : 0 );
437 elem.appendChild( elemDebug );
438
439 QDomElement elemEyeDomeLighting = doc.createElement( QStringLiteral( "eye-dome-lighting" ) );
440 elemEyeDomeLighting.setAttribute( QStringLiteral( "enabled" ), mEyeDomeLightingEnabled ? 1 : 0 );
441 elemEyeDomeLighting.setAttribute( QStringLiteral( "eye-dome-lighting-strength" ), mEyeDomeLightingStrength );
442 elemEyeDomeLighting.setAttribute( QStringLiteral( "eye-dome-lighting-distance" ), mEyeDomeLightingDistance );
443 elem.appendChild( elemEyeDomeLighting );
444
445 QDomElement elemNavigationSync = doc.createElement( QStringLiteral( "navigation-sync" ) );
446 elemNavigationSync.setAttribute( QStringLiteral( "view-sync-mode" ), ( int )mViewSyncMode );
447 elemNavigationSync.setAttribute( QStringLiteral( "view-frustum-visualization-enabled" ), mVisualizeViewFrustum ? 1 : 0 );
448 elem.appendChild( elemNavigationSync );
449
450 QDomElement elemDebugSettings = doc.createElement( QStringLiteral( "debug-settings" ) );
451 elemDebugSettings.setAttribute( QStringLiteral( "shadowmap-enabled" ), mDebugShadowMapEnabled );
452 elemDebugSettings.setAttribute( QStringLiteral( "shadowmap-corner" ), mDebugShadowMapCorner );
453 elemDebugSettings.setAttribute( QStringLiteral( "shadowmap-size" ), mDebugShadowMapSize );
454 elemDebugSettings.setAttribute( QStringLiteral( "depthmap-enabled" ), mDebugDepthMapEnabled );
455 elemDebugSettings.setAttribute( QStringLiteral( "depthmap-corner" ), mDebugDepthMapCorner );
456 elemDebugSettings.setAttribute( QStringLiteral( "depthmap-size" ), mDebugDepthMapSize );
457 elem.appendChild( elemDebugSettings );
458
459 QDomElement elemTemporalRange = doc.createElement( QStringLiteral( "temporal-range" ) );
460 elemTemporalRange.setAttribute( QStringLiteral( "start" ), temporalRange().begin().toString( Qt::ISODate ) );
461 elemTemporalRange.setAttribute( QStringLiteral( "end" ), temporalRange().end().toString( Qt::ISODate ) );
462
463 QDomElement elem3dAxis = doc.createElement( QStringLiteral( "axis3d" ) );
464 m3dAxisSettings.writeXml( elem3dAxis, context );
465 elem.appendChild( elem3dAxis );
466
467 return elem;
468}
469
471{
473
474 for ( int i = 0; i < mLayers.count(); ++i )
475 {
476 QgsMapLayerRef &layerRef = mLayers[i];
477 layerRef.setLayer( project.mapLayer( layerRef.layerId ) );
478 }
479
480 mTerrainGenerator->resolveReferences( project );
481
482 // Set extent now that layer-based generators actually have a chance to know their CRS
483 QgsRectangle terrainExtent = Qgs3DUtils::tryReprojectExtent2D( mExtent, mCrs, mTerrainGenerator->crs(), mTransformContext );
484 mTerrainGenerator->setExtent( terrainExtent );
485}
486
493
495{
497
498 if ( extent == mExtent )
499 return;
500
501 mExtent = extent;
502 const QgsPointXY center = mExtent.center();
503 setOrigin( QgsVector3D( center.x(), center.y(), 0 ) );
504 if ( mTerrainGenerator )
505 {
506 QgsRectangle terrainExtent = Qgs3DUtils::tryReprojectExtent2D( mExtent, mCrs, mTerrainGenerator->crs(), mTransformContext );
507 mTerrainGenerator->setExtent( terrainExtent );
508 }
509 emit extentChanged();
510}
511
513{
515
516 if ( origin == mOrigin )
517 return;
518
519 mOrigin = origin;
520 emit originChanged();
521}
522
524{
526
527 return mOrigin;
528}
529
536
543
550
557
564
566{
568
569 mTransformContext = context;
570}
571
573{
575
576 return mPathResolver;
577}
578
580{
582
583 mPathResolver = resolver;
584}
585
592
594{
596
597 mMapThemes = mapThemes;
598}
599
600void Qgs3DMapSettings::setBackgroundColor( const QColor &color )
601{
603
604 if ( color == mBackgroundColor )
605 return;
606
607 mBackgroundColor = color;
609}
610
612{
614
615 return mBackgroundColor;
616}
617
618void Qgs3DMapSettings::setSelectionColor( const QColor &color )
619{
621
622 if ( color == mSelectionColor )
623 return;
624
625 mSelectionColor = color;
627}
628
630{
632
633 return mSelectionColor;
634}
635
637{
639
640 if ( zScale == mTerrainVerticalScale )
641 return;
642
643 mTerrainVerticalScale = zScale;
645}
646
648{
650
651 return mTerrainVerticalScale;
652}
653
654void Qgs3DMapSettings::setLayers( const QList<QgsMapLayer *> &layers )
655{
657
658 const QList<QgsMapLayer *> raw = _qgis_listRefToRaw( mLayers );
659
660 if ( layers == raw )
661 return;
662
663 mLayers = _qgis_listRawToRef( layers );
664 emit layersChanged();
665}
666
667QList<QgsMapLayer *> Qgs3DMapSettings::layers() const
668{
670
671 QList<QgsMapLayer *> lst;
672 lst.reserve( mLayers.count() );
673 for ( const QgsMapLayerRef &layerRef : mLayers )
674 {
675 if ( layerRef.layer )
676 lst.append( layerRef.layer );
677 }
678 return lst;
679}
680
682{
684
685 setExtent( fullExtent );
686 if ( properties->terrainProvider()->type() == QLatin1String( "flat" ) )
687 {
689 flatTerrain->setCrs( crs() );
690 setTerrainGenerator( flatTerrain );
691
693 }
694 else if ( properties->terrainProvider()->type() == QLatin1String( "raster" ) )
695 {
696 QgsRasterDemTerrainProvider *rasterProvider = qgis::down_cast< QgsRasterDemTerrainProvider * >( properties->terrainProvider() );
697
699 demTerrainGen->setCrs( crs(), QgsProject::instance()->transformContext() );
700 demTerrainGen->setLayer( rasterProvider->layer() );
701 setTerrainGenerator( demTerrainGen );
702
705 }
706 else if ( properties->terrainProvider()->type() == QLatin1String( "mesh" ) )
707 {
708 QgsMeshTerrainProvider *meshProvider = qgis::down_cast< QgsMeshTerrainProvider * >( properties->terrainProvider() );
709
710 QgsMeshTerrainGenerator *newTerrainGenerator = new QgsMeshTerrainGenerator;
711 newTerrainGenerator->setCrs( crs(), QgsProject::instance()->transformContext() );
712 newTerrainGenerator->setLayer( meshProvider->layer() );
713 std::unique_ptr< QgsMesh3DSymbol > symbol( newTerrainGenerator->symbol()->clone() );
714 symbol->setVerticalScale( properties->terrainProvider()->scale() );
715 newTerrainGenerator->setSymbol( symbol.release() );
716 setTerrainGenerator( newTerrainGenerator );
717
720 }
721 else
722 {
724 flatTerrain->setCrs( crs() );
725 setTerrainGenerator( flatTerrain );
726 }
727}
728
730{
732
733 if ( mMapTileResolution == res )
734 return;
735
736 mMapTileResolution = res;
738}
739
741{
743
744 return mMapTileResolution;
745}
746
748{
750
751 if ( mMaxTerrainScreenError == error )
752 return;
753
754 mMaxTerrainScreenError = error;
756}
757
759{
761
762 return mMaxTerrainScreenError;
763}
764
766{
768
769 if ( mMaxTerrainGroundError == error )
770 return;
771
772 mMaxTerrainGroundError = error;
774}
775
777{
779
780 if ( mTerrainElevationOffset == offset )
781 return;
782 mTerrainElevationOffset = offset;
783 emit terrainElevationOffsetChanged( mTerrainElevationOffset );
784}
785
787{
789
790 return mTerrainElevationOffset;
791}
792
794{
796
797 return mMaxTerrainGroundError;
798}
799
801{
803
804 if ( mTerrainGenerator )
805 {
806 disconnect( mTerrainGenerator.get(), &QgsTerrainGenerator::terrainChanged, this, &Qgs3DMapSettings::terrainGeneratorChanged );
807 }
808
809 if ( gen->crs().isValid() ) // Don't bother setting an extent rect in the wrong CRS
810 {
811 QgsRectangle terrainExtent = Qgs3DUtils::tryReprojectExtent2D( mExtent, mCrs, gen->crs(), mTransformContext );
812 gen->setExtent( terrainExtent );
813 }
814 mTerrainGenerator.reset( gen );
815 connect( mTerrainGenerator.get(), &QgsTerrainGenerator::terrainChanged, this, &Qgs3DMapSettings::terrainGeneratorChanged );
816
818}
819
821{
823
824 return mTerrainGenerator.get();
825}
826
828{
830
831 if ( mTerrainShadingEnabled == enabled )
832 return;
833
834 mTerrainShadingEnabled = enabled;
836}
837
839{
841
842 return mTerrainShadingEnabled;
843}
844
846{
848
849 if ( mTerrainShadingMaterial == material )
850 return;
851
852 mTerrainShadingMaterial = material;
854}
855
862
863void Qgs3DMapSettings::setTerrainMapTheme( const QString &theme )
864{
866
867 if ( mTerrainMapTheme == theme )
868 return;
869
870 mTerrainMapTheme = theme;
872}
873
875{
877
878 return mTerrainMapTheme;
879}
880
882{
884
885 if ( mShowTerrainBoundingBoxes == enabled )
886 return;
887
888 mShowTerrainBoundingBoxes = enabled;
890}
891
893{
895
896 return mShowTerrainBoundingBoxes;
897}
898
899
901{
903
904 if ( mShowTerrainTileInfo == enabled )
905 return;
906
907 mShowTerrainTileInfo = enabled;
909}
910
912{
914
915 return mShowTerrainTileInfo;
916}
917
919{
921
922 if ( mShowCameraViewCenter == enabled )
923 return;
924
925 mShowCameraViewCenter = enabled;
927}
928
930{
932
933 return mShowCameraViewCenter;
934}
935
937{
939
940 if ( mShowCameraRotationCenter == enabled )
941 return;
942
943 mShowCameraRotationCenter = enabled;
945}
946
948{
950
951 return mShowCameraRotationCenter;
952}
953
955{
957
958 if ( mShowLightSources == enabled )
959 return;
960
961 mShowLightSources = enabled;
963}
964
966{
968
969 return mShowLightSources;
970}
971
973{
975
976 if ( mShowLabels == enabled )
977 return;
978
979 mShowLabels = enabled;
980 emit showLabelsChanged();
981}
982
984{
986
987 return mShowLabels;
988}
989
991{
993
994 if ( mStopUpdates == enabled )
995 return;
996
997 mStopUpdates = enabled;
998 emit stopUpdatesChanged();
999}
1000
1002{
1004
1005 return mStopUpdates;
1006}
1007
1009{
1011
1012 if ( mEyeDomeLightingEnabled == enabled )
1013 return;
1014 mEyeDomeLightingEnabled = enabled;
1016}
1017
1019{
1021
1022 return mEyeDomeLightingEnabled;
1023}
1024
1026{
1028
1029 if ( mEyeDomeLightingStrength == strength )
1030 return;
1031 mEyeDomeLightingStrength = strength;
1033}
1034
1036{
1038
1039 return mEyeDomeLightingStrength;
1040}
1041
1043{
1045
1046 if ( mEyeDomeLightingDistance == distance )
1047 return;
1048 mEyeDomeLightingDistance = distance;
1050}
1051
1053{
1055
1056 return mEyeDomeLightingDistance;
1057}
1058
1059QList<QgsLightSource *> Qgs3DMapSettings::lightSources() const
1060{
1062
1063 return mLightSources;
1064}
1065
1066void Qgs3DMapSettings::setLightSources( const QList<QgsLightSource *> &lights )
1067{
1069
1070 // have lights actually changed?
1071 if ( mLightSources.count() == lights.count() )
1072 {
1073 bool same = true;
1074 for ( int i = 0; i < mLightSources.count(); ++i )
1075 {
1076 if ( mLightSources[i]->type() == lights[i]->type() )
1077 {
1078 switch ( mLightSources[i]->type() )
1079 {
1081 if ( *static_cast< QgsPointLightSettings * >( mLightSources[i] ) == *static_cast< QgsPointLightSettings * >( lights[i] ) )
1082 continue;
1083 break;
1085 if ( *static_cast< QgsDirectionalLightSettings * >( mLightSources[i] ) == *static_cast< QgsDirectionalLightSettings * >( lights[i] ) )
1086 continue;
1087 break;
1088 }
1089 }
1090 same = false;
1091 break;
1092 }
1093 if ( same )
1094 {
1095 qDeleteAll( lights );
1096 return;
1097 }
1098 }
1099
1100 qDeleteAll( mLightSources );
1101 mLightSources = lights;
1102
1104 emit pointLightsChanged();
1105 emit lightSourcesChanged();
1106}
1107
1109{
1111
1112 return mFieldOfView;
1113}
1114
1115void Qgs3DMapSettings::setFieldOfView( const float fieldOfView )
1116{
1118
1119 if ( mFieldOfView == fieldOfView )
1120 return;
1121
1122 mFieldOfView = fieldOfView;
1123 emit fieldOfViewChanged();
1124}
1125
1126Qt3DRender::QCameraLens::ProjectionType Qgs3DMapSettings::projectionType() const
1127{
1129
1130 return mProjectionType;
1131}
1132
1133void Qgs3DMapSettings::setProjectionType( const Qt3DRender::QCameraLens::ProjectionType projectionType )
1134{
1136
1137 if ( mProjectionType == projectionType )
1138 return;
1139
1140 mProjectionType = projectionType;
1141 emit projectionTypeChanged();
1142}
1143
1145{
1147
1148 return mCameraNavigationMode;
1149}
1150
1152{
1154
1155 if ( mCameraNavigationMode == navigationMode )
1156 return;
1157
1158 mCameraNavigationMode = navigationMode;
1160}
1161
1163{
1165
1166 return mCameraMovementSpeed;
1167}
1168
1170{
1172
1173 if ( mCameraMovementSpeed == movementSpeed )
1174 return;
1175
1176 mCameraMovementSpeed = movementSpeed;
1178}
1179
1180void Qgs3DMapSettings::setOutputDpi( const double dpi )
1181{
1183
1184 mDpi = dpi;
1185}
1186
1188{
1190
1191 return mDpi;
1192}
1193
1195{
1197
1198 return mSkyboxSettings;
1199}
1200
1202{
1204
1205 return mShadowSettings;
1206}
1207
1209{
1211
1212 return mAmbientOcclusionSettings;
1213}
1214
1216{
1218
1219 mSkyboxSettings = skyboxSettings;
1220 emit skyboxSettingsChanged();
1221}
1222
1224{
1226
1227 mShadowSettings = shadowSettings;
1228 emit shadowSettingsChanged();
1229}
1230
1232{
1234
1235 mAmbientOcclusionSettings = ambientOcclusionSettings;
1237}
1238
1240{
1242
1243 return mIsSkyboxEnabled;
1244}
1245
1247{
1249
1250 mIsSkyboxEnabled = enabled;
1251}
1252
1254{
1256
1257 return mIsFpsCounterEnabled;
1258}
1259
1260void Qgs3DMapSettings::setShowDebugPanel( const bool enabled )
1261{
1263
1264 if ( mShowDebugPanel == enabled )
1265 return;
1266
1267 mShowDebugPanel = enabled;
1268 emit showDebugPanelChanged( enabled );
1269}
1270
1272{
1274
1275 return mShowDebugPanel;
1276}
1277
1278void Qgs3DMapSettings::setDebugShadowMapSettings( bool enabled, Qt::Corner corner, double size )
1279{
1281
1282 mDebugShadowMapEnabled = enabled;
1283 mDebugShadowMapCorner = corner;
1284 mDebugShadowMapSize = size;
1286}
1287
1289{
1291
1292 return mDebugShadowMapEnabled;
1293}
1294
1296{
1298
1299 return mDebugShadowMapCorner;
1300}
1301
1303{
1305
1306 return mDebugShadowMapSize;
1307}
1308
1309void Qgs3DMapSettings::setDebugDepthMapSettings( bool enabled, Qt::Corner corner, double size )
1310{
1312
1313 mDebugDepthMapEnabled = enabled;
1314 mDebugDepthMapCorner = corner;
1315 mDebugDepthMapSize = size;
1317}
1318
1320{
1322
1323 return mDebugDepthMapEnabled;
1324}
1325
1327{
1329
1330 return mDebugDepthMapCorner;
1331}
1332
1334{
1336
1337 return mDebugDepthMapSize;
1338}
1339
1340void Qgs3DMapSettings::setIsFpsCounterEnabled( bool fpsCounterEnabled )
1341{
1343
1344 if ( fpsCounterEnabled == mIsFpsCounterEnabled )
1345 return;
1346 mIsFpsCounterEnabled = fpsCounterEnabled;
1347 emit fpsCounterEnabledChanged( mIsFpsCounterEnabled );
1348}
1349
1351{
1353
1354 return mTerrainRenderingEnabled;
1355}
1356
1357void Qgs3DMapSettings::setTerrainRenderingEnabled( bool terrainRenderingEnabled )
1358{
1360
1361 if ( terrainRenderingEnabled == mTerrainRenderingEnabled )
1362 return;
1363 mTerrainRenderingEnabled = terrainRenderingEnabled;
1365}
1366
1368{
1370
1371 return mRendererUsage;
1372}
1373
1375{
1377
1378 mRendererUsage = rendererUsage;
1379}
1380
1387
1389{
1391
1392 mViewSyncMode = mode;
1393}
1394
1396{
1398
1399 return mVisualizeViewFrustum;
1400}
1401
1403{
1405
1406 if ( mVisualizeViewFrustum != enabled )
1407 {
1408 mVisualizeViewFrustum = enabled;
1410 }
1411}
1412
1414{
1416
1417 return m3dAxisSettings;
1418}
1419
1420void Qgs3DMapSettings::setIsDebugOverlayEnabled( bool debugOverlayEnabled )
1421{
1423
1424 if ( debugOverlayEnabled == mIsDebugOverlayEnabled )
1425 return;
1426
1427 mIsDebugOverlayEnabled = debugOverlayEnabled;
1428 emit debugOverlayEnabledChanged( mIsDebugOverlayEnabled );
1429}
1430
1432{
1434
1435 return mShowExtentIn2DView;
1436}
1437
1438void Qgs3DMapSettings::connectChangedSignalsToSettingsChanged()
1439{
1441
1477}
1478
1479
1480void Qgs3DMapSettings::set3DAxisSettings( const Qgs3DAxisSettings &axisSettings, bool force )
1481{
1483
1484 if ( axisSettings == m3dAxisSettings )
1485 {
1486 if ( force )
1487 {
1488 // ie. refresh. We need to disconnect and to reconnect to avoid 'dirty' project
1490 emit axisSettingsChanged();
1492 }
1493 }
1494 else
1495 {
1496 m3dAxisSettings = axisSettings;
1497 emit axisSettingsChanged();
1498 }
1499}
1500
1502{
1504
1505 return mIsDebugOverlayEnabled;
1506}
1507
1509{
1511
1512 if ( show == mShowExtentIn2DView )
1513 return;
1514
1515 mShowExtentIn2DView = show;
1517}
QFlags< ViewSyncModeFlag > ViewSyncModeFlags
Definition qgis.h:3278
NavigationMode
The navigation mode used by 3D cameras.
Definition qgis.h:3917
@ TerrainBased
The default navigation based on the terrain.
@ Walk
Uses WASD keys or arrows to navigate in walking (first person) manner.
RendererUsage
Usage of the renderer.
Definition qgis.h:3241
@ Point
Point light source.
@ Directional
Directional light source.
Contains the configuration of a 3d axis.
void readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads settings from a DOM element.
void writeXml(QDomElement &element, const QgsReadWriteContext &context) const
Writes settings to a DOM element.
void extentChanged()
Emitted when the 3d view's 2d extent has changed.
void setEyeDomeLightingStrength(double strength)
Sets the eye dome lighting strength value.
void mapTileResolutionChanged()
Emitted when the map tile resoulution has changed.
void terrainVerticalScaleChanged()
Emitted when the vertical scale of the terrain has changed.
bool isDebugOverlayEnabled() const
Returns whether debug overlay is enabled.
Qt::Corner debugDepthMapCorner() const
Returns the corner where the shadow map preview is displayed.
void originChanged()
Emitted when the world's origin point has been shifted.
void setTransformContext(const QgsCoordinateTransformContext &context)
Sets the coordinate transform context, which stores various information regarding which datum transfo...
void settingsChanged()
Emitted when one of the configuration settings has changed.
void renderersChanged()
Emitted when the list of map's extra renderers have been modified.
void eyeDomeLightingDistanceChanged()
Emitted when the eye dome lighting distance has changed.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads configuration from a DOM element previously written by writeXml()
void terrainShadingChanged()
Emitted when terrain shading enabled flag or terrain shading material has changed.
const QgsPathResolver & pathResolver() const
Returns the path resolver for conversion between relative and absolute paths during rendering operati...
void setAmbientOcclusionSettings(const QgsAmbientOcclusionSettings &ambientOcclusionSettings)
Sets the current configuration of screen space ambient occlusion.
void setShowTerrainTilesInfo(bool enabled)
Sets whether to display extra tile info on top of terrain tiles (for debugging)
QgsVector3D mapToWorldCoordinates(const QgsVector3D &mapCoords) const
Converts map coordinates to 3D world coordinates (applies offset and turns (x,y,z) into (x,...
bool showExtentIn2DView() const
Returns whether the extent is displayed on the main 2D map canvas.
double cameraMovementSpeed() const
Returns the camera movement speed.
Qt3DRender::QCameraLens::ProjectionType projectionType() const
Returns the camera lens' projection type.
void setEyeDomeLightingEnabled(bool enabled)
Sets whether eye dome lighting will be used.
void showDebugPanelChanged(bool shown)
Emitted when the Show debug panel checkbox changes value.
bool debugDepthMapEnabled() const
Returns whether the shadow map debugging is enabled.
bool isSkyboxEnabled() const
Returns whether the skybox is enabled.
void setFieldOfView(const float fieldOfView)
Sets the camera lens' field of view.
void debugDepthMapSettingsChanged()
Emitted when depth map debugging has changed.
void setLightSources(const QList< QgsLightSource * > &lights)
Sets the list of light sources defined in the scene.
double outputDpi() const
Returns DPI used for conversion between real world units (e.g.
Qgis::NavigationMode cameraNavigationMode() const
Returns the navigation mode used by the camera.
double eyeDomeLightingStrength() const
Returns the eye dome lighting strength value.
void backgroundColorChanged()
Emitted when the background color has changed.
void showTerrainBoundingBoxesChanged()
Emitted when the flag whether terrain's bounding boxes are shown has changed.
Qt::Corner debugShadowMapCorner() const
Returns the corner where the shadow map preview is displayed.
void setMapThemeCollection(QgsMapThemeCollection *mapThemes)
Sets pointer to the collection of map themes.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Writes configuration to a DOM element, to be used later with readXml()
void setDebugDepthMapSettings(bool enabled, Qt::Corner corner, double size)
Sets the debugging settings of the depth map.
bool showCameraViewCenter() const
Returns whether to show camera's view center as a sphere (for debugging)
void showCameraRotationCenterChanged()
Emitted when the flag whether camera's rotation center is shown has changed.
QColor selectionColor() const
Returns color used for selected features.
void directionalLightsChanged()
Emitted when the list of directional lights changes.
void setTerrainShadingMaterial(const QgsPhongMaterialSettings &material)
Sets terrain shading material.
void cameraNavigationModeChanged()
Emitted when the camera navigation mode was changed.
void shadowSettingsChanged()
Emitted when shadow rendering settings are changed.
bool stopUpdates() const
Returns whether the scene updates on camera movement.
void setViewFrustumVisualizationEnabled(bool enabled)
Sets whether the camera's view frustum is visualized on the 2D map canvas.
void setShowCameraRotationCenter(bool enabled)
Sets whether to show camera's rotation center as a sphere (for debugging)
float maxTerrainGroundError() const
Returns maximum ground error of terrain tiles in world units.
void setExtent(const QgsRectangle &extent)
Sets the 3D scene's 2D extent in the 3D scene's CRS, while also setting the scene's origin to the ext...
void eyeDomeLightingEnabledChanged()
Emitted when the flag whether eye dome lighting is used has changed.
void setTerrainVerticalScale(double zScale)
Sets vertical scale (exaggeration) of terrain (1 = true scale, > 1 = hills get more pronounced)
void debugOverlayEnabledChanged(bool debugOverlayEnabled)
Emitted when the debug overaly is enabled or disabled.
void setOutputDpi(const double dpi)
Sets DPI used for conversion between real world units (e.g.
void setIsSkyboxEnabled(bool enabled)
Sets whether the skybox is enabled.
void setShowLabels(bool enabled)
Sets whether to display labels on terrain tiles.
double terrainVerticalScale() const
Returns vertical scale (exaggeration) of terrain.
void setViewSyncMode(Qgis::ViewSyncModeFlags mode)
Sets the view sync mode (used to synchronize the 2D main map canvas and the 3D camera navigation)
void setOrigin(const QgsVector3D &origin)
Sets coordinates in map CRS at which our 3D world has origin (0,0,0)
void setMaxTerrainGroundError(float error)
Returns maximum ground error of terrain tiles in world units.
void setSkyboxSettings(const QgsSkyboxSettings &skyboxSettings)
Sets the current configuration of the skybox.
void skyboxSettingsChanged()
Emitted when skybox settings are changed.
void setMapTileResolution(int res)
Sets resolution (in pixels) of the texture of a terrain tile.
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of 3D map layers to be rendered in the scene.
void setShowDebugPanel(bool enabled)
Sets whether the debug side panel is shown.
QgsShadowSettings shadowSettings() const
Returns the current configuration of shadows.
void terrainMapThemeChanged()
Emitted when terrain's map theme has changed.
void setShadowSettings(const QgsShadowSettings &shadowSettings)
Sets the current configuration of shadow rendering.
void setIsDebugOverlayEnabled(bool debugOverlayEnabled)
Sets whether debug overlay is enabled The debug overlay displays some debugging and profiling informa...
void pointLightsChanged()
Emitted when the list of point lights changes.
void setTerrainElevationOffset(float offset)
Sets the terrain elevation offset (used to move the terrain up or down)
QList< QgsLightSource * > lightSources() const
Returns list of directional light sources defined in the scene.
double debugDepthMapSize() const
Returns the size of the shadow map preview.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets coordinate reference system used in the 3D scene.
Qgs3DAxisSettings get3DAxisSettings() const
Returns the current configuration of 3d axis.
void setEyeDomeLightingDistance(int distance)
Sets the eye dome lighting distance value (contributes to the contrast of the image.
bool viewFrustumVisualizationEnabled() const
Returns whether the camera's view frustum is visualized on the 2D map canvas.
void setShowLightSourceOrigins(bool enabled)
Sets whether to show light source origins as a sphere (for debugging)
bool showDebugPanel() const
Returns whether the debug side panel is shown.
void setShowExtentIn2DView(bool show)
Sets whether the extent is displayed on the main 2D map canvas.
void projectionTypeChanged()
Emitted when the camera lens projection type changes.
float fieldOfView() const
Returns the camera lens' field of view.
void selectionColorChanged()
Emitted when the selection color has changed.
QgsAmbientOcclusionSettings ambientOcclusionSettings() const
Returns the current configuration of screen space ambient occlusion.
QgsRectangle extent() const
Returns the 3D scene's 2D extent in the 3D scene's CRS.
void setTerrainShadingEnabled(bool enabled)
Sets whether terrain shading is enabled.
Qgis::ViewSyncModeFlags viewSyncMode() const
Returns the view sync mode (used to synchronize the 2D main map canvas and the 3D camera navigation)
void stopUpdatesChanged()
Emitted when the flag whether to keep updating scene has changed.
void setDebugShadowMapSettings(bool enabled, Qt::Corner corner, double size)
Sets the debugging settings of the shadow map.
float terrainElevationOffset() const
Returns the elevation offset of the terrain (used to move the terrain up or down)
int eyeDomeLightingDistance() const
Returns the eye dome lighting distance value (contributes to the contrast of the image)
void setSelectionColor(const QColor &color)
Sets color used for selected features.
void lightSourcesChanged()
Emitted when any of the light source settings in the map changes.
void showLightSourceOriginsChanged()
Emitted when the flag whether light source origins are shown has changed.
QgsTerrainGenerator * terrainGenerator() const
Returns the terrain generator.
void setCameraNavigationMode(Qgis::NavigationMode navigationMode)
Sets the navigation mode for the camera.
QColor backgroundColor() const
Returns background color of the 3D map view.
void resolveReferences(const QgsProject &project)
Resolves references to other objects (map layers) after the call to readXml()
double debugShadowMapSize() const
Returns the size of the shadow map preview.
void setPathResolver(const QgsPathResolver &resolver)
Sets the path resolver for conversion between relative and absolute paths during rendering operations...
QgsVector3D worldToMapCoordinates(const QgsVector3D &worldCoords) const
Converts 3D world coordinates to map coordinates (applies offset and turns (x,y,z) into (x,...
bool showTerrainBoundingBoxes() const
Returns whether to display bounding boxes of terrain tiles (for debugging)
void showLabelsChanged()
Emitted when the flag whether labels are displayed on terrain tiles has changed.
void setStopUpdates(bool enabled)
Sets whether scene updates on camera movement should be enabled.
void maxTerrainScreenErrorChanged()
Emitted when the maximum terrain screen error has changed.
void setShowCameraViewCenter(bool enabled)
Sets whether to show camera's view center as a sphere (for debugging)
int mapTileResolution() const
Returns resolution (in pixels) of the texture of a terrain tile.
bool showLabels() const
Returns whether to display labels on terrain tiles.
void set3DAxisSettings(const Qgs3DAxisSettings &axisSettings, bool force=false)
Sets the current configuration of 3d axis.
void setCameraMovementSpeed(double movementSpeed)
Sets the camera movement speed.
void terrainElevationOffsetChanged(float newElevation)
Emitted when the terrain elevation offset is changed.
void setTerrainRenderingEnabled(bool terrainRenderingEnabled)
Sets whether the 2D terrain surface will be rendered in.
bool debugShadowMapEnabled() const
Returns whether the shadow map debugging is enabled.
void setBackgroundColor(const QColor &color)
Sets background color of the 3D map view.
bool terrainRenderingEnabled() const
Returns whether the 2D terrain surface will be rendered.
void fpsCounterEnabledChanged(bool fpsCounterEnabled)
Emitted when the FPS counter is enabled or disabled.
void axisSettingsChanged()
Emitted when 3d axis rendering settings are changed.
void viewFrustumVisualizationEnabledChanged()
Emitted when the camera's view frustum visualization on the main 2D map canvas is enabled or disabled...
void setProjectionType(const Qt3DRender::QCameraLens::ProjectionType projectionType)
Sets the camera lens' projection type.
void ambientOcclusionSettingsChanged()
Emitted when ambient occlusion rendering settings are changed.
bool showTerrainTilesInfo() const
Returns whether to display extra tile info on top of terrain tiles (for debugging)
void showExtentIn2DViewChanged()
Emitted when the parameter to display 3d view's extent in the 2D canvas has changed.
void configureTerrainFromProject(QgsProjectElevationProperties *properties, const QgsRectangle &fullExtent)
Configures the map's terrain settings directly from a project's elevation properties.
void layersChanged()
Emitted when the list of map layers for 3d rendering has changed.
void showTerrainTilesInfoChanged()
Emitted when the flag whether terrain's tile info is shown has changed.
void eyeDomeLightingStrengthChanged()
Emitted when the eye dome lighting strength has changed.
QgsSkyboxSettings skyboxSettings() const
Returns the current configuration of the skybox.
void setMaxTerrainScreenError(float error)
Sets maximum allowed screen error of terrain tiles in pixels.
bool isTerrainShadingEnabled() const
Returns whether terrain shading is enabled.
void cameraMovementSpeedChanged()
Emitted when the camera movement speed was changed.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used in the 3D scene.
bool eyeDomeLightingEnabled() const
Returns whether eye dome lighting is used.
QgsPhongMaterialSettings terrainShadingMaterial() const
Returns terrain shading material.
void setRendererUsage(Qgis::RendererUsage rendererUsage)
Sets the renderer usage.
bool isFpsCounterEnabled() const
Returns whether FPS counter label is enabled.
QString terrainMapTheme() const
Returns name of the map theme (from the active project) that will be used for terrain's texture.
float maxTerrainScreenError() const
Returns maximum allowed screen error of terrain tiles in pixels.
void setShowTerrainBoundingBoxes(bool enabled)
Sets whether to display bounding boxes of terrain tiles (for debugging)
void fieldOfViewChanged()
Emitted when the camera lens field of view changes.
Qgis::RendererUsage rendererUsage() const
Returns the renderer usage.
void setIsFpsCounterEnabled(bool fpsCounterEnabled)
Sets whether FPS counter label is enabled.
QgsMapThemeCollection * mapThemeCollection() const
Returns pointer to the collection of map themes.
QList< QgsMapLayer * > layers() const
Returns the list of 3D map layers to be rendered in the scene.
void setTerrainMapTheme(const QString &theme)
Sets name of the map theme.
void terrainGeneratorChanged()
Emitted when the terrain generator has changed.
bool showLightSourceOrigins() const
Returns whether to show light source origins as a sphere (for debugging)
void setTerrainGenerator(QgsTerrainGenerator *gen)
Sets terrain generator and sets extent() as the generator's extent.
void debugShadowMapSettingsChanged()
Emitted when shadow map debugging has changed.
void showCameraViewCenterChanged()
Emitted when the flag whether camera's view center is shown has changed.
void maxTerrainGroundErrorChanged()
Emitted when the maximum terrain ground error has changed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
QgsVector3D origin() const
Returns coordinates in map CRS at which 3D scene has origin (0,0,0).
bool showCameraRotationCenter() const
Returns whether to show camera's rotation center as a sphere (for debugging)
static QgsRectangle tryReprojectExtent2D(const QgsRectangle &extent, const QgsCoordinateReferenceSystem &crs1, const QgsCoordinateReferenceSystem &crs2, const QgsCoordinateTransformContext &context)
Reprojects extent from crs1 to crs2 coordinate reference system with context context.
static QgsVector3D worldToMapCoordinates(const QgsVector3D &worldCoords, const QgsVector3D &origin)
Converts 3D world coordinates to map coordinates (applies offset)
static QgsVector3D mapToWorldCoordinates(const QgsVector3D &mapCoords, const QgsVector3D &origin)
Converts map coordinates to 3D world coordinates (applies offset)
virtual QString type() const =0
Returns the unique type ID string for the provider.
double offset() const
Returns the vertical offset value, used for adjusting the heights from the terrain provider.
double scale() const
Returns the vertical scale factor, which can be used to exaggerate vertical heights.
class containing the configuration of ambient occlusion rendering 3
void writeXml(QDomElement &element, const QgsReadWriteContext &context) const
Writes settings to a DOM element.
void readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads settings from a DOM element.
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
bool writeXml(QDomNode &node, QDomDocument &doc) const
Stores state to the given Dom node in the given document.
Contains information about the context in which a coordinate transform is executed.
void setCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets CRS of the terrain.
void setLayer(QgsRasterLayer *layer)
Sets raster layer with elevation model to be used for terrain generation.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets CRS of the terrain.
static QgsLightSource * createFromXml(const QDomElement &element, const QgsReadWriteContext &context)
Creates a new light source from an XML element.
Container class that allows storage of map themes consisting of visible map layers and layer styles.
A terrain provider that uses the Z values of a mesh layer to build a terrain surface.
QgsMeshLayer * layer() const
Returns the mesh layer to be used as the terrain source.
void setCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets CRS of the terrain.
Resolves relative paths into absolute paths and vice versa.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
Writes settings to a DOM element.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads settings from a DOM element.
A class to represent a 2D point.
Definition qgspointxy.h:60
double y
Definition qgspointxy.h:64
double x
Definition qgspointxy.h:63
Temporarily blocks QgsProject "dirtying" for the lifetime of the object.
Contains elevation properties for a QgsProject.
QgsAbstractTerrainProvider * terrainProvider()
Returns the project's terrain provider.
QgsReferencedRectangle fullExtent() const
Returns the full extent of the project, which represents the maximal limits of the project.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:107
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
void setDirty(bool b=true)
Flag the project as dirty (modified).
const QgsProjectViewSettings * viewSettings() const
Returns the project's view settings, which contains settings and properties relating to how a QgsProj...
A terrain provider where the terrain source is a raster DEM layer.
QgsRasterLayer * layer() const
Returns the raster layer with elevation model to be used as the terrain source.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
double xMinimum
double yMinimum
double xMaximum
double yMaximum
QgsPointXY center
class containing the configuration of shadows rendering 3
void writeXml(QDomElement &element, const QgsReadWriteContext &context) const
Writes settings to a DOM element.
void readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads settings from a DOM element.
Contains the configuration of a skybox entity.
void readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads settings from a DOM element.
void writeXml(QDomElement &element, const QgsReadWriteContext &context) const
Writes settings to a DOM element.
Base class for objects with an associated (optional) temporal range.
const QgsDateTimeRange & temporalRange() const
Returns the datetime range for the object.
void setTemporalRange(const QgsDateTimeRange &range)
Sets the temporal range for the object.
T begin() const
Returns the beginning of the range.
Definition qgsrange.h:444
T end() const
Returns the upper bound of the range.
Definition qgsrange.h:451
void terrainChanged()
Emitted when the terrain changed (for example, raster DEM or mesh have data changed)
virtual void setExtent(const QgsRectangle &extent)
sets the extent of the terrain in terrain's CRS
static QString typeToString(Type type)
Converts terrain generator type enumeration into a string.
virtual QgsCoordinateReferenceSystem crs() const
Returns CRS of the terrain.
Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double precisi...
Definition qgsvector3d.h:31
double y() const
Returns Y coordinate.
Definition qgsvector3d.h:50
double z() const
Returns Z coordinate.
Definition qgsvector3d.h:52
double x() const
Returns X coordinate.
Definition qgsvector3d.h:48
_LayerRef< QgsMapLayer > QgsMapLayerRef
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
Definition qgsrange.h:742
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
const QgsCoordinateReferenceSystem & crs
void setLayer(TYPE *l)
Sets the reference to point to a specified layer.
QString layerId
Original layer ID.