21#include "qgsmeshterraingenerator.h"
35#include <QDomDocument>
46 connectChangedSignalsToSettingsChanged();
52 , mOrigin( other.mOrigin )
54 , mBackgroundColor( other.mBackgroundColor )
55 , mSelectionColor( other.mSelectionColor )
56 , mTerrainVerticalScale( other.mTerrainVerticalScale )
57 , mTerrainGenerator( other.mTerrainGenerator ? other.mTerrainGenerator->clone() : nullptr )
58 , mMapTileResolution( other.mMapTileResolution )
59 , mMaxTerrainScreenError( other.mMaxTerrainScreenError )
60 , mMaxTerrainGroundError( other.mMaxTerrainGroundError )
61 , mTerrainElevationOffset( other.mTerrainElevationOffset )
62 , mTerrainShadingEnabled( other.mTerrainShadingEnabled )
63 , mTerrainShadingMaterial( other.mTerrainShadingMaterial )
64 , mTerrainMapTheme( other.mTerrainMapTheme )
65 , mShowTerrainBoundingBoxes( other.mShowTerrainBoundingBoxes )
66 , mShowTerrainTileInfo( other.mShowTerrainTileInfo )
67 , mShowCameraViewCenter( other.mShowCameraViewCenter )
68 , mShowCameraRotationCenter( other.mShowCameraRotationCenter )
69 , mShowLightSources( other.mShowLightSources )
70 , mShowLabels( other.mShowLabels )
71 , mFieldOfView( other.mFieldOfView )
72 , mProjectionType( other.mProjectionType )
73 , mCameraNavigationMode( other.mCameraNavigationMode )
74 , mCameraMovementSpeed( other.mCameraMovementSpeed )
75 , mLayers( other.mLayers )
77 , mTransformContext( other.mTransformContext )
78 , mPathResolver( other.mPathResolver )
79 , mMapThemes( other.mMapThemes )
81 , mIsFpsCounterEnabled( other.mIsFpsCounterEnabled )
82 , mIsSkyboxEnabled( other.mIsSkyboxEnabled )
83 , mSkyboxSettings( other.mSkyboxSettings )
84 , mShadowSettings( other.mShadowSettings )
85 , mAmbientOcclusionSettings( other.mAmbientOcclusionSettings )
86 , mEyeDomeLightingEnabled( other.mEyeDomeLightingEnabled )
87 , mEyeDomeLightingStrength( other.mEyeDomeLightingStrength )
88 , mEyeDomeLightingDistance( other.mEyeDomeLightingDistance )
89 , mViewSyncMode( other.mViewSyncMode )
90 , mVisualizeViewFrustum( other.mVisualizeViewFrustum )
91 , mDebugShadowMapEnabled( other.mDebugShadowMapEnabled )
92 , mDebugShadowMapCorner( other.mDebugShadowMapCorner )
93 , mDebugShadowMapSize( other.mDebugShadowMapSize )
94 , mDebugDepthMapEnabled( other.mDebugDepthMapEnabled )
95 , mDebugDepthMapCorner( other.mDebugDepthMapCorner )
96 , mDebugDepthMapSize( other.mDebugDepthMapSize )
97 , mTerrainRenderingEnabled( other.mTerrainRenderingEnabled )
98 , mRendererUsage( other.mRendererUsage )
99 , m3dAxisSettings( other.m3dAxisSettings )
100 , mIsDebugOverlayEnabled( other.mIsDebugOverlayEnabled )
101 , mExtent( other.mExtent )
105 mRenderers << renderer->clone();
108 for (
QgsLightSource *source : std::as_const( other.mLightSources ) )
111 mLightSources << source->clone();
118 connectChangedSignalsToSettingsChanged();
123 qDeleteAll( mRenderers );
124 qDeleteAll( mLightSources );
130 QDomElement elemOrigin = elem.firstChildElement( QStringLiteral(
"origin" ) );
132 elemOrigin.attribute( QStringLiteral(
"x" ) ).toDouble(),
133 elemOrigin.attribute( QStringLiteral(
"y" ) ).toDouble(),
134 elemOrigin.attribute( QStringLiteral(
"z" ) ).toDouble() );
136 QDomElement elemExtent = elem.firstChildElement( QStringLiteral(
"extent" ) );
137 if ( !elemExtent.isNull() )
140 elemExtent.attribute( QStringLiteral(
"xMin" ) ).toDouble(),
141 elemExtent.attribute( QStringLiteral(
"yMin" ) ).toDouble(),
142 elemExtent.attribute( QStringLiteral(
"xMax" ) ).toDouble(),
143 elemExtent.attribute( QStringLiteral(
"yMax" ) ).toDouble() );
150 QDomElement elemCamera = elem.firstChildElement( QStringLiteral(
"camera" ) );
151 if ( !elemCamera.isNull() )
153 mFieldOfView = elemCamera.attribute( QStringLiteral(
"field-of-view" ), QStringLiteral(
"45" ) ).toFloat();
154 mProjectionType =
static_cast< Qt3DRender::QCameraLens::ProjectionType
>( elemCamera.attribute( QStringLiteral(
"projection-type" ), QStringLiteral(
"1" ) ).toInt() );
155 QString
cameraNavigationMode = elemCamera.attribute( QStringLiteral(
"camera-navigation-mode" ), QStringLiteral(
"basic-navigation" ) );
160 mCameraMovementSpeed = elemCamera.attribute( QStringLiteral(
"camera-movement-speed" ), QStringLiteral(
"5.0" ) ).toDouble();
163 QDomElement elemColor = elem.firstChildElement( QStringLiteral(
"color" ) );
164 if ( !elemColor.isNull() )
170 QDomElement elemCrs = elem.firstChildElement( QStringLiteral(
"crs" ) );
173 QDomElement elemTerrain = elem.firstChildElement( QStringLiteral(
"terrain" ) );
174 mTerrainRenderingEnabled = elemTerrain.attribute( QStringLiteral(
"terrain-rendering-enabled" ), QStringLiteral(
"1" ) ).toInt();
175 mTerrainVerticalScale = elemTerrain.attribute( QStringLiteral(
"exaggeration" ), QStringLiteral(
"1" ) ).toFloat();
176 mMapTileResolution = elemTerrain.attribute( QStringLiteral(
"texture-size" ), QStringLiteral(
"512" ) ).toInt();
177 mMaxTerrainScreenError = elemTerrain.attribute( QStringLiteral(
"max-terrain-error" ), QStringLiteral(
"3" ) ).toFloat();
178 mMaxTerrainGroundError = elemTerrain.attribute( QStringLiteral(
"max-ground-error" ), QStringLiteral(
"1" ) ).toFloat();
179 mTerrainShadingEnabled = elemTerrain.attribute( QStringLiteral(
"shading-enabled" ), QStringLiteral(
"0" ) ).toInt();
180 mTerrainElevationOffset = elemTerrain.attribute( QStringLiteral(
"elevation-offset" ), QStringLiteral(
"0.0" ) ).toFloat();
182 QDomElement elemTerrainShadingMaterial = elemTerrain.firstChildElement( QStringLiteral(
"shading-material" ) );
183 if ( !elemTerrainShadingMaterial.isNull() )
184 mTerrainShadingMaterial.
readXml( elemTerrainShadingMaterial, context );
185 mTerrainMapTheme = elemTerrain.attribute( QStringLiteral(
"map-theme" ) );
186 mShowLabels = elemTerrain.attribute( QStringLiteral(
"show-labels" ), QStringLiteral(
"0" ) ).toInt();
188 qDeleteAll( mLightSources );
189 mLightSources.clear();
190 const QDomElement lightsElem = elem.firstChildElement( QStringLiteral(
"lights" ) );
191 if ( !lightsElem.isNull() )
193 const QDomNodeList lightNodes = lightsElem.childNodes();
194 for (
int i = 0; i < lightNodes.size(); ++i )
196 const QDomElement lightElement = lightNodes.at( i ).toElement();
198 mLightSources << light;
204 QDomElement elemPointLights = elem.firstChildElement( QStringLiteral(
"point-lights" ) );
205 if ( !elemPointLights.isNull() )
207 QDomElement elemPointLight = elemPointLights.firstChildElement( QStringLiteral(
"point-light" ) );
208 while ( !elemPointLight.isNull() )
210 std::unique_ptr< QgsPointLightSettings > pointLight = std::make_unique< QgsPointLightSettings >();
211 pointLight->readXml( elemPointLight, context );
212 mLightSources << pointLight.release();
213 elemPointLight = elemPointLight.nextSiblingElement( QStringLiteral(
"point-light" ) );
219 std::unique_ptr< QgsPointLightSettings > defaultLight = std::make_unique< QgsPointLightSettings >();
220 defaultLight->setPosition(
QgsVector3D( 0, 1000, 0 ) );
221 mLightSources << defaultLight.release();
224 QDomElement elemDirectionalLights = elem.firstChildElement( QStringLiteral(
"directional-lights" ) );
225 if ( !elemDirectionalLights.isNull() )
227 QDomElement elemDirectionalLight = elemDirectionalLights.firstChildElement( QStringLiteral(
"directional-light" ) );
228 while ( !elemDirectionalLight.isNull() )
230 std::unique_ptr< QgsDirectionalLightSettings > directionalLight = std::make_unique< QgsDirectionalLightSettings >();
231 directionalLight->readXml( elemDirectionalLight, context );
232 mLightSources << directionalLight.release();
233 elemDirectionalLight = elemDirectionalLight.nextSiblingElement( QStringLiteral(
"directional-light" ) );
238 QDomElement elemMapLayers = elemTerrain.firstChildElement( QStringLiteral(
"layers" ) );
239 QDomElement elemMapLayer = elemMapLayers.firstChildElement( QStringLiteral(
"layer" ) );
240 QList<QgsMapLayerRef> mapLayers;
241 while ( !elemMapLayer.isNull() )
243 mapLayers <<
QgsMapLayerRef( elemMapLayer.attribute( QStringLiteral(
"id" ) ) );
244 elemMapLayer = elemMapLayer.nextSiblingElement( QStringLiteral(
"layer" ) );
248 QDomElement elemTerrainGenerator = elemTerrain.firstChildElement( QStringLiteral(
"generator" ) );
249 QString terrainGenType = elemTerrainGenerator.attribute( QStringLiteral(
"type" ) );
250 if ( terrainGenType == QLatin1String(
"dem" ) )
253 demTerrainGenerator->
setCrs( mCrs, mTransformContext );
256 else if ( terrainGenType == QLatin1String(
"online" ) )
259 onlineTerrainGenerator->
setCrs( mCrs, mTransformContext );
262 else if ( terrainGenType == QLatin1String(
"mesh" ) )
264 QgsMeshTerrainGenerator *meshTerrainGenerator =
new QgsMeshTerrainGenerator;
265 meshTerrainGenerator->setCrs( mCrs, mTransformContext );
274 mTerrainGenerator->readXml( elemTerrainGenerator );
276 qDeleteAll( mRenderers );
279 QDomElement elemRenderers = elem.firstChildElement( QStringLiteral(
"renderers" ) );
280 QDomElement elemRenderer = elemRenderers.firstChildElement( QStringLiteral(
"renderer" ) );
281 while ( !elemRenderer.isNull() )
284 QString type = elemRenderer.attribute( QStringLiteral(
"type" ) );
285 if ( type == QLatin1String(
"vector" ) )
289 else if ( type == QLatin1String(
"mesh" ) )
293 else if ( type == QLatin1String(
"pointcloud" ) )
300 renderer->
readXml( elemRenderer, context );
301 mRenderers.append( renderer );
303 elemRenderer = elemRenderer.nextSiblingElement( QStringLiteral(
"renderer" ) );
306 QDomElement elemSkybox = elem.firstChildElement( QStringLiteral(
"skybox" ) );
307 mIsSkyboxEnabled = elemSkybox.attribute( QStringLiteral(
"skybox-enabled" ) ).toInt();
308 mSkyboxSettings.
readXml( elemSkybox, context );
310 QDomElement elemShadows = elem.firstChildElement( QStringLiteral(
"shadow-rendering" ) );
311 mShadowSettings.
readXml( elemShadows, context );
313 QDomElement elemAmbientOcclusion = elem.firstChildElement( QStringLiteral(
"screen-space-ambient-occlusion" ) );
314 mAmbientOcclusionSettings.
readXml( elemAmbientOcclusion, context );
316 QDomElement elemEyeDomeLighting = elem.firstChildElement( QStringLiteral(
"eye-dome-lighting" ) );
317 mEyeDomeLightingEnabled = elemEyeDomeLighting.attribute(
"enabled", QStringLiteral(
"0" ) ).toInt();
318 mEyeDomeLightingStrength = elemEyeDomeLighting.attribute(
"eye-dome-lighting-strength", QStringLiteral(
"1000.0" ) ).toDouble();
319 mEyeDomeLightingDistance = elemEyeDomeLighting.attribute(
"eye-dome-lighting-distance", QStringLiteral(
"1" ) ).toInt();
321 QDomElement elemNavigationSync = elem.firstChildElement( QStringLiteral(
"navigation-sync" ) );
322 mViewSyncMode = ( Qgis::ViewSyncModeFlags )( elemNavigationSync.attribute( QStringLiteral(
"view-sync-mode" ), QStringLiteral(
"0" ) ).toInt() );
323 mVisualizeViewFrustum = elemNavigationSync.attribute( QStringLiteral(
"view-frustum-visualization-enabled" ), QStringLiteral(
"0" ) ).toInt();
325 QDomElement elemDebugSettings = elem.firstChildElement( QStringLiteral(
"debug-settings" ) );
326 mDebugShadowMapEnabled = elemDebugSettings.attribute( QStringLiteral(
"shadowmap-enabled" ), QStringLiteral(
"0" ) ).toInt();
327 mDebugShadowMapCorner =
static_cast<Qt::Corner
>( elemDebugSettings.attribute( QStringLiteral(
"shadowmap-corner" ),
"0" ).toInt() );
328 mDebugShadowMapSize = elemDebugSettings.attribute( QStringLiteral(
"shadowmap-size" ), QStringLiteral(
"0.2" ) ).toDouble();
330 mDebugDepthMapEnabled = elemDebugSettings.attribute( QStringLiteral(
"depthmap-enabled" ), QStringLiteral(
"0" ) ).toInt();
331 mDebugDepthMapCorner =
static_cast<Qt::Corner
>( elemDebugSettings.attribute( QStringLiteral(
"depthmap-corner" ), QStringLiteral(
"1" ) ).toInt() );
332 mDebugDepthMapSize = elemDebugSettings.attribute( QStringLiteral(
"depthmap-size" ), QStringLiteral(
"0.2" ) ).toDouble();
334 QDomElement elemDebug = elem.firstChildElement( QStringLiteral(
"debug" ) );
335 mShowTerrainBoundingBoxes = elemDebug.attribute( QStringLiteral(
"bounding-boxes" ), QStringLiteral(
"0" ) ).toInt();
336 mShowTerrainTileInfo = elemDebug.attribute( QStringLiteral(
"terrain-tile-info" ), QStringLiteral(
"0" ) ).toInt();
337 mShowCameraViewCenter = elemDebug.attribute( QStringLiteral(
"camera-view-center" ), QStringLiteral(
"0" ) ).toInt();
338 mShowCameraRotationCenter = elemDebug.attribute( QStringLiteral(
"camera-rotation-center" ), QStringLiteral(
"0" ) ).toInt();
339 mShowLightSources = elemDebug.attribute( QStringLiteral(
"show-light-sources" ), QStringLiteral(
"0" ) ).toInt();
340 mIsFpsCounterEnabled = elemDebug.attribute( QStringLiteral(
"show-fps-counter" ), QStringLiteral(
"0" ) ).toInt();
342 QDomElement elemTemporalRange = elem.firstChildElement( QStringLiteral(
"temporal-range" ) );
343 QDateTime start = QDateTime::fromString( elemTemporalRange.attribute( QStringLiteral(
"start" ) ), Qt::ISODate );
344 QDateTime end = QDateTime::fromString( elemTemporalRange.attribute( QStringLiteral(
"end" ) ), Qt::ISODate );
347 QDomElement elem3dAxis = elem.firstChildElement( QStringLiteral(
"axis3d" ) );
348 m3dAxisSettings.
readXml( elem3dAxis, context );
354 QDomElement elem = doc.createElement( QStringLiteral(
"qgis3d" ) );
356 QDomElement elemOrigin = doc.createElement( QStringLiteral(
"origin" ) );
357 elemOrigin.setAttribute( QStringLiteral(
"x" ), QString::number( mOrigin.
x() ) );
358 elemOrigin.setAttribute( QStringLiteral(
"y" ), QString::number( mOrigin.
y() ) );
359 elemOrigin.setAttribute( QStringLiteral(
"z" ), QString::number( mOrigin.
z() ) );
360 elem.appendChild( elemOrigin );
362 QDomElement elemExtent = doc.createElement( QStringLiteral(
"extent" ) );
363 elemExtent.setAttribute( QStringLiteral(
"xMin" ), mExtent.
xMinimum() );
364 elemExtent.setAttribute( QStringLiteral(
"yMin" ), mExtent.
yMinimum() );
365 elemExtent.setAttribute( QStringLiteral(
"xMax" ), mExtent.
xMaximum() );
366 elemExtent.setAttribute( QStringLiteral(
"yMax" ), mExtent.
yMaximum() );
367 elem.appendChild( elemExtent );
369 QDomElement elemCamera = doc.createElement( QStringLiteral(
"camera" ) );
370 elemCamera.setAttribute( QStringLiteral(
"field-of-view" ), mFieldOfView );
371 elemCamera.setAttribute( QStringLiteral(
"projection-type" ),
static_cast< int >( mProjectionType ) );
372 switch ( mCameraNavigationMode )
375 elemCamera.setAttribute( QStringLiteral(
"camera-navigation-mode" ), QStringLiteral(
"terrain-based-navigation" ) );
378 elemCamera.setAttribute( QStringLiteral(
"camera-navigation-mode" ), QStringLiteral(
"walk-navigation" ) );
381 elemCamera.setAttribute( QStringLiteral(
"camera-movement-speed" ), mCameraMovementSpeed );
382 elem.appendChild( elemCamera );
384 QDomElement elemColor = doc.createElement( QStringLiteral(
"color" ) );
387 elem.appendChild( elemColor );
389 QDomElement elemCrs = doc.createElement( QStringLiteral(
"crs" ) );
391 elem.appendChild( elemCrs );
393 QDomElement elemTerrain = doc.createElement( QStringLiteral(
"terrain" ) );
394 elemTerrain.setAttribute( QStringLiteral(
"terrain-rendering-enabled" ), mTerrainRenderingEnabled ? 1 : 0 );
395 elemTerrain.setAttribute( QStringLiteral(
"exaggeration" ), QString::number( mTerrainVerticalScale ) );
396 elemTerrain.setAttribute( QStringLiteral(
"texture-size" ), mMapTileResolution );
397 elemTerrain.setAttribute( QStringLiteral(
"max-terrain-error" ), QString::number( mMaxTerrainScreenError ) );
398 elemTerrain.setAttribute( QStringLiteral(
"max-ground-error" ), QString::number( mMaxTerrainGroundError ) );
399 elemTerrain.setAttribute( QStringLiteral(
"shading-enabled" ), mTerrainShadingEnabled ? 1 : 0 );
400 elemTerrain.setAttribute( QStringLiteral(
"elevation-offset" ), mTerrainElevationOffset );
402 QDomElement elemTerrainShadingMaterial = doc.createElement( QStringLiteral(
"shading-material" ) );
403 mTerrainShadingMaterial.
writeXml( elemTerrainShadingMaterial, context );
404 elemTerrain.appendChild( elemTerrainShadingMaterial );
405 elemTerrain.setAttribute( QStringLiteral(
"map-theme" ), mTerrainMapTheme );
406 elemTerrain.setAttribute( QStringLiteral(
"show-labels" ), mShowLabels ? 1 : 0 );
409 QDomElement elemLights = doc.createElement( QStringLiteral(
"lights" ) );
412 const QDomElement elemLight = light->writeXml( doc, context );
413 elemLights.appendChild( elemLight );
415 elem.appendChild( elemLights );
418 QDomElement elemMapLayers = doc.createElement( QStringLiteral(
"layers" ) );
421 QDomElement elemMapLayer = doc.createElement( QStringLiteral(
"layer" ) );
422 elemMapLayer.setAttribute( QStringLiteral(
"id" ), layerRef.layerId );
423 elemMapLayers.appendChild( elemMapLayer );
425 elemTerrain.appendChild( elemMapLayers );
427 QDomElement elemTerrainGenerator = doc.createElement( QStringLiteral(
"generator" ) );
429 mTerrainGenerator->writeXml( elemTerrainGenerator );
430 elemTerrain.appendChild( elemTerrainGenerator );
431 elem.appendChild( elemTerrain );
433 QDomElement elemRenderers = doc.createElement( QStringLiteral(
"renderers" ) );
436 QDomElement elemRenderer = doc.createElement( QStringLiteral(
"renderer" ) );
437 elemRenderer.setAttribute( QStringLiteral(
"type" ), renderer->type() );
438 renderer->writeXml( elemRenderer, context );
439 elemRenderers.appendChild( elemRenderer );
441 elem.appendChild( elemRenderers );
443 QDomElement elemSkybox = doc.createElement( QStringLiteral(
"skybox" ) );
444 elemSkybox.setAttribute( QStringLiteral(
"skybox-enabled" ), mIsSkyboxEnabled );
445 mSkyboxSettings.
writeXml( elemSkybox, context );
446 elem.appendChild( elemSkybox );
448 QDomElement elemShadows = doc.createElement( QStringLiteral(
"shadow-rendering" ) );
449 mShadowSettings.
writeXml( elemShadows, context );
450 elem.appendChild( elemShadows );
452 QDomElement elemAmbientOcclusion = doc.createElement( QStringLiteral(
"screen-space-ambient-occlusion" ) );
453 mAmbientOcclusionSettings.
writeXml( elemAmbientOcclusion, context );
454 elem.appendChild( elemAmbientOcclusion );
456 QDomElement elemDebug = doc.createElement( QStringLiteral(
"debug" ) );
457 elemDebug.setAttribute( QStringLiteral(
"bounding-boxes" ), mShowTerrainBoundingBoxes ? 1 : 0 );
458 elemDebug.setAttribute( QStringLiteral(
"terrain-tile-info" ), mShowTerrainTileInfo ? 1 : 0 );
459 elemDebug.setAttribute( QStringLiteral(
"camera-view-center" ), mShowCameraViewCenter ? 1 : 0 );
460 elemDebug.setAttribute( QStringLiteral(
"camera-rotation-center" ), mShowCameraRotationCenter ? 1 : 0 );
461 elemDebug.setAttribute( QStringLiteral(
"show-light-sources" ), mShowLightSources ? 1 : 0 );
462 elemDebug.setAttribute( QStringLiteral(
"show-fps-counter" ), mIsFpsCounterEnabled ? 1 : 0 );
463 elem.appendChild( elemDebug );
465 QDomElement elemEyeDomeLighting = doc.createElement( QStringLiteral(
"eye-dome-lighting" ) );
466 elemEyeDomeLighting.setAttribute( QStringLiteral(
"enabled" ), mEyeDomeLightingEnabled ? 1 : 0 );
467 elemEyeDomeLighting.setAttribute( QStringLiteral(
"eye-dome-lighting-strength" ), mEyeDomeLightingStrength );
468 elemEyeDomeLighting.setAttribute( QStringLiteral(
"eye-dome-lighting-distance" ), mEyeDomeLightingDistance );
469 elem.appendChild( elemEyeDomeLighting );
471 QDomElement elemNavigationSync = doc.createElement( QStringLiteral(
"navigation-sync" ) );
472 elemNavigationSync.setAttribute( QStringLiteral(
"view-sync-mode" ), (
int )mViewSyncMode );
473 elemNavigationSync.setAttribute( QStringLiteral(
"view-frustum-visualization-enabled" ), mVisualizeViewFrustum ? 1 : 0 );
474 elem.appendChild( elemNavigationSync );
476 QDomElement elemDebugSettings = doc.createElement( QStringLiteral(
"debug-settings" ) );
477 elemDebugSettings.setAttribute( QStringLiteral(
"shadowmap-enabled" ), mDebugShadowMapEnabled );
478 elemDebugSettings.setAttribute( QStringLiteral(
"shadowmap-corner" ), mDebugShadowMapCorner );
479 elemDebugSettings.setAttribute( QStringLiteral(
"shadowmap-size" ), mDebugShadowMapSize );
480 elemDebugSettings.setAttribute( QStringLiteral(
"depthmap-enabled" ), mDebugDepthMapEnabled );
481 elemDebugSettings.setAttribute( QStringLiteral(
"depthmap-corner" ), mDebugDepthMapCorner );
482 elemDebugSettings.setAttribute( QStringLiteral(
"depthmap-size" ), mDebugDepthMapSize );
483 elem.appendChild( elemDebugSettings );
485 QDomElement elemTemporalRange = doc.createElement( QStringLiteral(
"temporal-range" ) );
486 elemTemporalRange.setAttribute( QStringLiteral(
"start" ),
temporalRange().begin().toString( Qt::ISODate ) );
487 elemTemporalRange.setAttribute( QStringLiteral(
"end" ),
temporalRange().end().toString( Qt::ISODate ) );
489 QDomElement elem3dAxis = doc.createElement( QStringLiteral(
"axis3d" ) );
490 m3dAxisSettings.
writeXml( elem3dAxis, context );
491 elem.appendChild( elem3dAxis );
498 for (
int i = 0; i < mLayers.count(); ++i )
504 mTerrainGenerator->resolveReferences( project );
506 for (
int i = 0; i < mRenderers.count(); ++i )
521 if ( mTerrainGenerator )
524 if ( mCrs != mTerrainGenerator->crs() )
534 QgsDebugMsg( QStringLiteral(
"Transformation of map extent to terrain crs failed." ) );
537 mTerrainGenerator->setExtent( terrainExtent );
559 return mTransformContext;
564 mTransformContext = context;
569 if ( color == mBackgroundColor )
572 mBackgroundColor = color;
578 return mBackgroundColor;
583 if ( color == mSelectionColor )
586 mSelectionColor = color;
592 return mSelectionColor;
597 if ( zScale == mTerrainVerticalScale )
600 mTerrainVerticalScale = zScale;
606 return mTerrainVerticalScale;
611 QList<QgsMapLayerRef> lst;
612 lst.reserve(
layers.count() );
618 if ( mLayers == lst )
627 QList<QgsMapLayer *> lst;
628 lst.reserve( mLayers.count() );
631 if ( layerRef.layer )
632 lst.append( layerRef.layer );
664 QgsMeshTerrainGenerator *newTerrainGenerator =
new QgsMeshTerrainGenerator;
666 newTerrainGenerator->setLayer( meshProvider->
layer() );
667 std::unique_ptr< QgsMesh3DSymbol > symbol( newTerrainGenerator->symbol()->clone() );
669 newTerrainGenerator->setSymbol( symbol.release() );
685 if ( mMapTileResolution == res )
688 mMapTileResolution = res;
694 return mMapTileResolution;
699 if ( mMaxTerrainScreenError == error )
702 mMaxTerrainScreenError = error;
708 return mMaxTerrainScreenError;
713 if ( mMaxTerrainGroundError == error )
716 mMaxTerrainGroundError = error;
722 if ( mTerrainElevationOffset == offset )
724 mTerrainElevationOffset = offset;
730 return mMaxTerrainGroundError;
735 if ( mTerrainGenerator )
741 if ( mCrs != gen->
crs() )
751 QgsDebugMsg( QStringLiteral(
"Transformation of map extent to terrain crs failed." ) );
755 mTerrainGenerator.reset( gen );
763 if ( mTerrainShadingEnabled == enabled )
766 mTerrainShadingEnabled = enabled;
772 if ( mTerrainShadingMaterial == material )
775 mTerrainShadingMaterial = material;
781 if ( mTerrainMapTheme == theme )
784 mTerrainMapTheme = theme;
790 qDeleteAll( mRenderers );
799 if ( mShowTerrainBoundingBoxes == enabled )
802 mShowTerrainBoundingBoxes = enabled;
808 if ( mShowTerrainTileInfo == enabled )
811 mShowTerrainTileInfo = enabled;
817 if ( mShowCameraViewCenter == enabled )
820 mShowCameraViewCenter = enabled;
826 if ( mShowCameraRotationCenter == enabled )
829 mShowCameraRotationCenter = enabled;
836 if ( mShowLightSources == enabled )
839 mShowLightSources = enabled;
845 if ( mShowLabels == enabled )
848 mShowLabels = enabled;
854 if ( mEyeDomeLightingEnabled == enabled )
856 mEyeDomeLightingEnabled = enabled;
862 if ( mEyeDomeLightingStrength == strength )
864 mEyeDomeLightingStrength = strength;
870 if ( mEyeDomeLightingDistance == distance )
872 mEyeDomeLightingDistance = distance;
878 return mLightSources;
883 qDeleteAll( mLightSources );
884 mLightSources = lights;
911 if ( mCameraNavigationMode == navigationMode )
914 mCameraNavigationMode = navigationMode;
920 if ( mCameraMovementSpeed == movementSpeed )
923 mCameraMovementSpeed = movementSpeed;
947 mDebugShadowMapEnabled = enabled;
948 mDebugShadowMapCorner = corner;
949 mDebugShadowMapSize = size;
955 mDebugDepthMapEnabled = enabled;
956 mDebugDepthMapCorner = corner;
957 mDebugDepthMapSize = size;
963 if ( fpsCounterEnabled == mIsFpsCounterEnabled )
965 mIsFpsCounterEnabled = fpsCounterEnabled;
979 return mRendererUsage;
989 mViewSyncMode = mode;
994 if ( mVisualizeViewFrustum != enabled )
996 mVisualizeViewFrustum = enabled;
1003 if ( debugOverlayEnabled == mIsDebugOverlayEnabled )
1006 mIsDebugOverlayEnabled = debugOverlayEnabled;
1011void Qgs3DMapSettings::connectChangedSignalsToSettingsChanged()
1050 if ( axisSettings == m3dAxisSettings )
1062 m3dAxisSettings = axisSettings;
NavigationMode
The navigation mode used by 3D cameras.
@ 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.
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.
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.
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,...
void setRenderers(const QList< QgsAbstract3DRenderer * > &renderers)
Sets list of extra 3D renderers to use in the scene. Takes ownership of the objects.
Qt3DRender::QCameraLens::ProjectionType projectionType() const
Returns the camera lens' projection type.
void setEyeDomeLightingEnabled(bool enabled)
Sets whether eye dome lighting will be used.
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.
Qgis::NavigationMode cameraNavigationMode() const
Returns the navigation mode used by the camera.
void backgroundColorChanged()
Emitted when the background color has changed.
void showTerrainBoundingBoxesChanged()
Emitted when the flag whether terrain's bounding boxes are shown has changed.
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.
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.
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 project's CRS, while also setting the scene's origin to the extent's...
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 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.
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.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets coordinate reference system used in the 3D scene.
void setEyeDomeLightingDistance(int distance)
Sets the eye dome lighting distance value (contributes to the contrast of the image.
void setShowLightSourceOrigins(bool enabled)
Sets whether to show light source origins as a sphere (for debugging)
QList< QgsAbstract3DRenderer * > renderers() const
Returns list of extra 3D renderers.
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 project's CRS.
void setTerrainShadingEnabled(bool enabled)
Sets whether terrain shading is enabled.
void setDebugShadowMapSettings(bool enabled, Qt::Corner corner, double size)
Sets the debugging settings of the shadow map.
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.
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()
QgsVector3D worldToMapCoordinates(const QgsVector3D &worldCoords) const
Converts 3D world coordinates to map coordinates (applies offset and turns (x,y,z) into (x,...
~Qgs3DMapSettings() override
void showLabelsChanged()
Emitted when the flag whether labels are displayed on terrain tiles has changed.
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.
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.
Qgs3DMapSettings()
Constructor for Qgs3DMapSettings.
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.
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.
void cameraMovementSpeedChanged()
Emitted when the camera movement speed was changed.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used in the 3D scene.
void setRendererUsage(Qgis::RendererUsage rendererUsage)
Sets the renderer usage.
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.
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.
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...
static QgsVector3D worldToMapCoordinates(const QgsVector3D &worldCoords, const QgsVector3D &origin)
Converts 3D world coordinates to map coordinates (applies offset and turns (x,y,z) into (x,...
static QgsVector3D mapToWorldCoordinates(const QgsVector3D &mapCoords, const QgsVector3D &origin)
Converts map coordinates to 3D world coordinates (applies offset and turns (x,y,z) into (x,...
Base class for all renderers that may to participate in 3D view.
virtual void readXml(const QDomElement &elem, const QgsReadWriteContext &context)=0
Reads renderer's properties from given XML element.
virtual void resolveReferences(const QgsProject &project)
Resolves references to other objects - second phase of loading - after readXml()
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.
This class represents a coordinate reference system (CRS).
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.
Custom exception class for Coordinate Reference System related exceptions.
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.
Base class for all map layer types.
3D renderer that renders all mesh triangles of a mesh layer.
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.
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.
3D renderer that renders all points from a point cloud layer
A class to represent a 2D point.
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,...
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 yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
QgsPointXY center() const SIP_HOLDGIL
Returns the center point of the rectangle.
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.
static QColor decodeColor(const QString &str)
static QString encodeColor(const QColor &color)
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.
void terrainChanged()
Emitted when the terrain changed (for example, raster DEM or mesh have data changed)
QgsCoordinateReferenceSystem crs() const
Returns CRS of the terrain.
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.
double y() const
Returns Y coordinate.
double z() const
Returns Z coordinate.
double x() const
Returns X coordinate.
3D renderer that renders all features of a vector layer with the same 3D symbol.
_LayerRef< QgsMapLayer > QgsMapLayerRef
const QgsCoordinateReferenceSystem & crs
void setLayer(TYPE *l)
Sets the reference to point to a specified layer.
QString layerId
Original layer ID.