21 #include "qgsmeshterraingenerator.h" 
   27 #include <QDomDocument> 
   28 #include <QDomElement> 
   36   , mOrigin( other.mOrigin )
 
   38   , mBackgroundColor( other.mBackgroundColor )
 
   39   , mSelectionColor( other.mSelectionColor )
 
   40   , mTerrainVerticalScale( other.mTerrainVerticalScale )
 
   41   , mTerrainGenerator( other.mTerrainGenerator ? other.mTerrainGenerator->clone() : nullptr )
 
   42   , mMapTileResolution( other.mMapTileResolution )
 
   43   , mMaxTerrainScreenError( other.mMaxTerrainScreenError )
 
   44   , mMaxTerrainGroundError( other.mMaxTerrainGroundError )
 
   45   , mTerrainElevationOffset( other.mTerrainElevationOffset )
 
   46   , mTerrainShadingEnabled( other.mTerrainShadingEnabled )
 
   47   , mTerrainShadingMaterial( other.mTerrainShadingMaterial )
 
   48   , mTerrainMapTheme( other.mTerrainMapTheme )
 
   49   , mShowTerrainBoundingBoxes( other.mShowTerrainBoundingBoxes )
 
   50   , mShowTerrainTileInfo( other.mShowTerrainTileInfo )
 
   51   , mShowCameraViewCenter( other.mShowCameraViewCenter )
 
   52   , mShowLightSources( other.mShowLightSources )
 
   53   , mShowLabels( other.mShowLabels )
 
   54   , mPointLights( other.mPointLights )
 
   55   , mDirectionalLights( other.mDirectionalLights )
 
   56   , mFieldOfView( other.mFieldOfView )
 
   57   , mProjectionType( other.mProjectionType )
 
   58   , mCameraNavigationMode( other.mCameraNavigationMode )
 
   59   , mCameraMovementSpeed( other.mCameraMovementSpeed )
 
   60   , mLayers( other.mLayers )
 
   61   , mTerrainLayers( other.mTerrainLayers )
 
   63   , mTransformContext( other.mTransformContext )
 
   64   , mPathResolver( other.mPathResolver )
 
   65   , mMapThemes( other.mMapThemes )
 
   67   , mIsFpsCounterEnabled( other.mIsFpsCounterEnabled )
 
   68   , mIsSkyboxEnabled( other.mIsSkyboxEnabled )
 
   69   , mSkyboxSettings( other.mSkyboxSettings )
 
   70   , mShadowSettings( other.mShadowSettings )
 
   71   , mEyeDomeLightingEnabled( other.mEyeDomeLightingEnabled )
 
   72   , mEyeDomeLightingStrength( other.mEyeDomeLightingStrength )
 
   73   , mEyeDomeLightingDistance( other.mEyeDomeLightingDistance )
 
   74   , mDebugShadowMapEnabled( other.mDebugShadowMapEnabled )
 
   75   , mDebugShadowMapCorner( other.mDebugShadowMapCorner )
 
   76   , mDebugShadowMapSize( other.mDebugShadowMapSize )
 
   77   , mDebugDepthMapEnabled( other.mDebugDepthMapEnabled )
 
   78   , mDebugDepthMapCorner( other.mDebugDepthMapCorner )
 
   79   , mDebugDepthMapSize( other.mDebugDepthMapSize )
 
   83     mRenderers << renderer->clone();
 
   89   qDeleteAll( mRenderers );
 
   94   QDomElement elemOrigin = elem.firstChildElement( QStringLiteral( 
"origin" ) );
 
   96               elemOrigin.attribute( QStringLiteral( 
"x" ) ).toDouble(),
 
   97               elemOrigin.attribute( QStringLiteral( 
"y" ) ).toDouble(),
 
   98               elemOrigin.attribute( QStringLiteral( 
"z" ) ).toDouble() );
 
  100   QDomElement elemCamera = elem.firstChildElement( QStringLiteral( 
"camera" ) );
 
  101   if ( !elemCamera.isNull() )
 
  103     mFieldOfView = elemCamera.attribute( QStringLiteral( 
"field-of-view" ), QStringLiteral( 
"45" ) ).toFloat();
 
  104     mProjectionType = 
static_cast< Qt3DRender::QCameraLens::ProjectionType 
>( elemCamera.attribute( QStringLiteral( 
"projection-type" ), QStringLiteral( 
"1" ) ).toInt() );
 
  105     QString 
cameraNavigationMode = elemCamera.attribute( QStringLiteral( 
"camera-navigation-mode" ), QStringLiteral( 
"basic-navigation" ) );
 
  107       mCameraNavigationMode = QgsCameraController::NavigationMode::TerrainBasedNavigation;
 
  109       mCameraNavigationMode = QgsCameraController::NavigationMode::WalkNavigation;
 
  110     mCameraMovementSpeed = elemCamera.attribute( QStringLiteral( 
"camera-movement-speed" ), QStringLiteral( 
"5.0" ) ).toDouble();
 
  113   QDomElement elemColor = elem.firstChildElement( QStringLiteral( 
"color" ) );
 
  114   if ( !elemColor.isNull() )
 
  120   QDomElement elemCrs = elem.firstChildElement( QStringLiteral( 
"crs" ) );
 
  123   QDomElement elemTerrain = elem.firstChildElement( QStringLiteral( 
"terrain" ) );
 
  124   mTerrainVerticalScale = elemTerrain.attribute( QStringLiteral( 
"exaggeration" ), QStringLiteral( 
"1" ) ).toFloat();
 
  125   mMapTileResolution = elemTerrain.attribute( QStringLiteral( 
"texture-size" ), QStringLiteral( 
"512" ) ).toInt();
 
  126   mMaxTerrainScreenError = elemTerrain.attribute( QStringLiteral( 
"max-terrain-error" ), QStringLiteral( 
"3" ) ).toFloat();
 
  127   mMaxTerrainGroundError = elemTerrain.attribute( QStringLiteral( 
"max-ground-error" ), QStringLiteral( 
"1" ) ).toFloat();
 
  128   mTerrainShadingEnabled = elemTerrain.attribute( QStringLiteral( 
"shading-enabled" ), QStringLiteral( 
"0" ) ).toInt();
 
  129   mTerrainElevationOffset = elemTerrain.attribute( QStringLiteral( 
"elevation-offset" ), QStringLiteral( 
"0.0" ) ).toFloat();
 
  131   QDomElement elemTerrainShadingMaterial = elemTerrain.firstChildElement( QStringLiteral( 
"shading-material" ) );
 
  132   if ( !elemTerrainShadingMaterial.isNull() )
 
  133     mTerrainShadingMaterial.
readXml( elemTerrainShadingMaterial, context );
 
  134   mTerrainMapTheme = elemTerrain.attribute( QStringLiteral( 
"map-theme" ) );
 
  135   mShowLabels = elemTerrain.attribute( QStringLiteral( 
"show-labels" ), QStringLiteral( 
"0" ) ).toInt();
 
  137   mPointLights.clear();
 
  138   QDomElement elemPointLights = elem.firstChildElement( QStringLiteral( 
"point-lights" ) );
 
  139   if ( !elemPointLights.isNull() )
 
  141     QDomElement elemPointLight = elemPointLights.firstChildElement( QStringLiteral( 
"point-light" ) );
 
  142     while ( !elemPointLight.isNull() )
 
  145       pointLight.
readXml( elemPointLight );
 
  146       mPointLights << pointLight;
 
  147       elemPointLight = elemPointLight.nextSiblingElement( QStringLiteral( 
"point-light" ) );
 
  155     mPointLights << defaultLight;
 
  158   mDirectionalLights.clear();
 
  159   QDomElement elemDirectionalLights = elem.firstChildElement( QStringLiteral( 
"directional-lights" ) );
 
  160   if ( !elemDirectionalLights.isNull() )
 
  162     QDomElement elemDirectionalLight = elemDirectionalLights.firstChildElement( QStringLiteral( 
"directional-light" ) );
 
  163     while ( !elemDirectionalLight.isNull() )
 
  166       directionalLight.
readXml( elemDirectionalLight );
 
  167       mDirectionalLights << directionalLight;
 
  168       elemDirectionalLight = elemDirectionalLight.nextSiblingElement( QStringLiteral( 
"directional-light" ) );
 
  172   QDomElement elemMapLayers = elemTerrain.firstChildElement( QStringLiteral( 
"layers" ) );
 
  173   QDomElement elemMapLayer = elemMapLayers.firstChildElement( QStringLiteral( 
"layer" ) );
 
  174   QList<QgsMapLayerRef> mapLayers;
 
  175   while ( !elemMapLayer.isNull() )
 
  177     mapLayers << 
QgsMapLayerRef( elemMapLayer.attribute( QStringLiteral( 
"id" ) ) );
 
  178     elemMapLayer = elemMapLayer.nextSiblingElement( QStringLiteral( 
"layer" ) );
 
  182   QDomElement elemTerrainLayers = elemTerrain.firstChildElement( QStringLiteral( 
"terrainLayers" ) );
 
  183   if ( elemTerrainLayers.isNull() )
 
  185     mTerrainLayers = mLayers;
 
  189     QDomElement elemTerrainMapLayer = elemTerrainLayers.firstChildElement( QStringLiteral( 
"layer" ) );
 
  190     QList<QgsMapLayerRef> terrainMapLayers;
 
  191     while ( !elemTerrainMapLayer.isNull() )
 
  193       terrainMapLayers << 
QgsMapLayerRef( elemTerrainMapLayer.attribute( QStringLiteral( 
"id" ) ) );
 
  194       elemTerrainMapLayer = elemTerrainMapLayer.nextSiblingElement( QStringLiteral( 
"layer" ) );
 
  196     mTerrainLayers = mapLayers;  
 
  199   QDomElement elemTerrainGenerator = elemTerrain.firstChildElement( QStringLiteral( 
"generator" ) );
 
  200   QString terrainGenType = elemTerrainGenerator.attribute( QStringLiteral( 
"type" ) );
 
  201   if ( terrainGenType == QLatin1String( 
"dem" ) )
 
  204     demTerrainGenerator->
setCrs( mCrs, mTransformContext );
 
  205     mTerrainGenerator.reset( demTerrainGenerator );
 
  207   else if ( terrainGenType == QLatin1String( 
"online" ) )
 
  210     onlineTerrainGenerator->
setCrs( mCrs, mTransformContext );
 
  211     mTerrainGenerator.reset( onlineTerrainGenerator );
 
  213   else if ( terrainGenType == QLatin1String( 
"mesh" ) )
 
  215     QgsMeshTerrainGenerator *meshTerrainGenerator = 
new QgsMeshTerrainGenerator;
 
  216     meshTerrainGenerator->setCrs( mCrs, mTransformContext );
 
  217     mTerrainGenerator.reset( meshTerrainGenerator );
 
  223     mTerrainGenerator.reset( flatGen );
 
  225   mTerrainGenerator->readXml( elemTerrainGenerator );
 
  227   qDeleteAll( mRenderers );
 
  230   QDomElement elemRenderers = elem.firstChildElement( QStringLiteral( 
"renderers" ) );
 
  231   QDomElement elemRenderer = elemRenderers.firstChildElement( QStringLiteral( 
"renderer" ) );
 
  232   while ( !elemRenderer.isNull() )
 
  235     QString type = elemRenderer.attribute( QStringLiteral( 
"type" ) );
 
  236     if ( type == QLatin1String( 
"vector" ) )
 
  240     else if ( type == QLatin1String( 
"mesh" ) )
 
  244     else if ( type == QLatin1String( 
"pointcloud" ) )
 
  251       renderer->
readXml( elemRenderer, context );
 
  252       mRenderers.append( renderer );
 
  254     elemRenderer = elemRenderer.nextSiblingElement( QStringLiteral( 
"renderer" ) );
 
  257   QDomElement elemSkybox = elem.firstChildElement( QStringLiteral( 
"skybox" ) );
 
  258   mIsSkyboxEnabled = elemSkybox.attribute( QStringLiteral( 
"skybox-enabled" ) ).toInt();
 
  259   mSkyboxSettings.
readXml( elemSkybox, context );
 
  261   QDomElement elemShadows = elem.firstChildElement( QStringLiteral( 
"shadow-rendering" ) );
 
  262   mShadowSettings.
readXml( elemShadows, context );
 
  264   QDomElement elemEyeDomeLighting = elem.firstChildElement( QStringLiteral( 
"eye-dome-lighting" ) );
 
  265   mEyeDomeLightingEnabled = elemEyeDomeLighting.attribute( 
"enabled", QStringLiteral( 
"0" ) ).toInt();
 
  266   mEyeDomeLightingStrength = elemEyeDomeLighting.attribute( 
"eye-dome-lighting-strength", QStringLiteral( 
"1000.0" ) ).toDouble();
 
  267   mEyeDomeLightingDistance = elemEyeDomeLighting.attribute( 
"eye-dome-lighting-distance", QStringLiteral( 
"1" ) ).toInt();
 
  269   QDomElement elemDebugSettings = elem.firstChildElement( QStringLiteral( 
"debug-settings" ) );
 
  270   mDebugShadowMapEnabled = elemDebugSettings.attribute( QStringLiteral( 
"shadowmap-enabled" ), QStringLiteral( 
"0" ) ).toInt();
 
  271   mDebugShadowMapCorner = 
static_cast<Qt::Corner
>( elemDebugSettings.attribute( QStringLiteral( 
"shadowmap-corner" ), 
"0" ).toInt() );
 
  272   mDebugShadowMapSize = elemDebugSettings.attribute( QStringLiteral( 
"shadowmap-size" ), QStringLiteral( 
"0.2" ) ).toDouble();
 
  274   mDebugDepthMapEnabled = elemDebugSettings.attribute( QStringLiteral( 
"depthmap-enabled" ), QStringLiteral( 
"0" ) ).toInt();
 
  275   mDebugDepthMapCorner = 
static_cast<Qt::Corner
>( elemDebugSettings.attribute( QStringLiteral( 
"depthmap-corner" ), QStringLiteral( 
"1" ) ).toInt() );
 
  276   mDebugDepthMapSize = elemDebugSettings.attribute( QStringLiteral( 
"depthmap-size" ), QStringLiteral( 
"0.2" ) ).toDouble();
 
  278   QDomElement elemDebug = elem.firstChildElement( QStringLiteral( 
"debug" ) );
 
  279   mShowTerrainBoundingBoxes = elemDebug.attribute( QStringLiteral( 
"bounding-boxes" ), QStringLiteral( 
"0" ) ).toInt();
 
  280   mShowTerrainTileInfo = elemDebug.attribute( QStringLiteral( 
"terrain-tile-info" ), QStringLiteral( 
"0" ) ).toInt();
 
  281   mShowCameraViewCenter = elemDebug.attribute( QStringLiteral( 
"camera-view-center" ), QStringLiteral( 
"0" ) ).toInt();
 
  282   mShowLightSources = elemDebug.attribute( QStringLiteral( 
"show-light-sources" ), QStringLiteral( 
"0" ) ).toInt();
 
  283   mIsFpsCounterEnabled = elemDebug.attribute( QStringLiteral( 
"show-fps-counter" ), QStringLiteral( 
"0" ) ).toInt();
 
  285   QDomElement elemTemporalRange = elem.firstChildElement( QStringLiteral( 
"temporal-range" ) );
 
  286   QDateTime start = QDateTime::fromString( elemTemporalRange.attribute( QStringLiteral( 
"start" ) ), Qt::ISODate );
 
  287   QDateTime end = QDateTime::fromString( elemTemporalRange.attribute( QStringLiteral( 
"end" ) ), Qt::ISODate );
 
  293   QDomElement elem = doc.createElement( QStringLiteral( 
"qgis3d" ) );
 
  295   QDomElement elemOrigin = doc.createElement( QStringLiteral( 
"origin" ) );
 
  296   elemOrigin.setAttribute( QStringLiteral( 
"x" ), QString::number( mOrigin.
x() ) );
 
  297   elemOrigin.setAttribute( QStringLiteral( 
"y" ), QString::number( mOrigin.
y() ) );
 
  298   elemOrigin.setAttribute( QStringLiteral( 
"z" ), QString::number( mOrigin.
z() ) );
 
  299   elem.appendChild( elemOrigin );
 
  301   QDomElement elemCamera = doc.createElement( QStringLiteral( 
"camera" ) );
 
  302   elemCamera.setAttribute( QStringLiteral( 
"field-of-view" ), mFieldOfView );
 
  303   elemCamera.setAttribute( QStringLiteral( 
"projection-type" ), 
static_cast< int >( mProjectionType ) );
 
  304   switch ( mCameraNavigationMode )
 
  307       elemCamera.setAttribute( QStringLiteral( 
"camera-navigation-mode" ), QStringLiteral( 
"terrain-based-navigation" ) );
 
  310       elemCamera.setAttribute( QStringLiteral( 
"camera-navigation-mode" ), QStringLiteral( 
"walk-navigation" ) );
 
  313   elemCamera.setAttribute( QStringLiteral( 
"camera-movement-speed" ), mCameraMovementSpeed );
 
  314   elem.appendChild( elemCamera );
 
  316   QDomElement elemColor = doc.createElement( QStringLiteral( 
"color" ) );
 
  319   elem.appendChild( elemColor );
 
  321   QDomElement elemCrs = doc.createElement( QStringLiteral( 
"crs" ) );
 
  323   elem.appendChild( elemCrs );
 
  325   QDomElement elemTerrain = doc.createElement( QStringLiteral( 
"terrain" ) );
 
  326   elemTerrain.setAttribute( QStringLiteral( 
"exaggeration" ), QString::number( mTerrainVerticalScale ) );
 
  327   elemTerrain.setAttribute( QStringLiteral( 
"texture-size" ), mMapTileResolution );
 
  328   elemTerrain.setAttribute( QStringLiteral( 
"max-terrain-error" ), QString::number( mMaxTerrainScreenError ) );
 
  329   elemTerrain.setAttribute( QStringLiteral( 
"max-ground-error" ), QString::number( mMaxTerrainGroundError ) );
 
  330   elemTerrain.setAttribute( QStringLiteral( 
"shading-enabled" ), mTerrainShadingEnabled ? 1 : 0 );
 
  331   elemTerrain.setAttribute( QStringLiteral( 
"elevation-offset" ), mTerrainElevationOffset );
 
  333   QDomElement elemTerrainShadingMaterial = doc.createElement( QStringLiteral( 
"shading-material" ) );
 
  334   mTerrainShadingMaterial.
writeXml( elemTerrainShadingMaterial, context );
 
  335   elemTerrain.appendChild( elemTerrainShadingMaterial );
 
  336   elemTerrain.setAttribute( QStringLiteral( 
"map-theme" ), mTerrainMapTheme );
 
  337   elemTerrain.setAttribute( QStringLiteral( 
"show-labels" ), mShowLabels ? 1 : 0 );
 
  339   QDomElement elemPointLights = doc.createElement( QStringLiteral( 
"point-lights" ) );
 
  342     QDomElement elemPointLight = pointLight.writeXml( doc );
 
  343     elemPointLights.appendChild( elemPointLight );
 
  345   elem.appendChild( elemPointLights );
 
  347   QDomElement elemDirectionalLights = doc.createElement( QStringLiteral( 
"directional-lights" ) );
 
  350     QDomElement elemDirectionalLight = directionalLight.writeXml( doc );
 
  351     elemDirectionalLights.appendChild( elemDirectionalLight );
 
  353   elem.appendChild( elemDirectionalLights );
 
  355   QDomElement elemMapLayers = doc.createElement( QStringLiteral( 
"layers" ) );
 
  358     QDomElement elemMapLayer = doc.createElement( QStringLiteral( 
"layer" ) );
 
  359     elemMapLayer.setAttribute( QStringLiteral( 
"id" ), layerRef.layerId );
 
  360     elemMapLayers.appendChild( elemMapLayer );
 
  362   elemTerrain.appendChild( elemMapLayers );
 
  364   QDomElement elemTerrainMapLayers = doc.createElement( QStringLiteral( 
"terrainLayers" ) );
 
  367     QDomElement elemMapLayer = doc.createElement( QStringLiteral( 
"layer" ) );
 
  368     elemMapLayer.setAttribute( QStringLiteral( 
"id" ), layerRef.layerId );
 
  369     elemTerrainMapLayers.appendChild( elemMapLayer );
 
  371   elemTerrain.appendChild( elemTerrainMapLayers );
 
  373   QDomElement elemTerrainGenerator = doc.createElement( QStringLiteral( 
"generator" ) );
 
  375   mTerrainGenerator->writeXml( elemTerrainGenerator );
 
  376   elemTerrain.appendChild( elemTerrainGenerator );
 
  377   elem.appendChild( elemTerrain );
 
  379   QDomElement elemRenderers = doc.createElement( QStringLiteral( 
"renderers" ) );
 
  382     QDomElement elemRenderer = doc.createElement( QStringLiteral( 
"renderer" ) );
 
  383     elemRenderer.setAttribute( QStringLiteral( 
"type" ), renderer->type() );
 
  384     renderer->writeXml( elemRenderer, context );
 
  385     elemRenderers.appendChild( elemRenderer );
 
  387   elem.appendChild( elemRenderers );
 
  389   QDomElement elemSkybox = doc.createElement( QStringLiteral( 
"skybox" ) );
 
  390   elemSkybox.setAttribute( QStringLiteral( 
"skybox-enabled" ), mIsSkyboxEnabled );
 
  391   mSkyboxSettings.
writeXml( elemSkybox, context );
 
  392   elem.appendChild( elemSkybox );
 
  394   QDomElement elemShadows = doc.createElement( QStringLiteral( 
"shadow-rendering" ) );
 
  395   mShadowSettings.
writeXml( elemShadows, context );
 
  396   elem.appendChild( elemShadows );
 
  398   QDomElement elemDebug = doc.createElement( QStringLiteral( 
"debug" ) );
 
  399   elemDebug.setAttribute( QStringLiteral( 
"bounding-boxes" ), mShowTerrainBoundingBoxes ? 1 : 0 );
 
  400   elemDebug.setAttribute( QStringLiteral( 
"terrain-tile-info" ), mShowTerrainTileInfo ? 1 : 0 );
 
  401   elemDebug.setAttribute( QStringLiteral( 
"camera-view-center" ), mShowCameraViewCenter ? 1 : 0 );
 
  402   elemDebug.setAttribute( QStringLiteral( 
"show-light-sources" ), mShowLightSources ? 1 : 0 );
 
  403   elemDebug.setAttribute( QStringLiteral( 
"show-fps-counter" ), mIsFpsCounterEnabled ? 1 : 0 );
 
  404   elem.appendChild( elemDebug );
 
  406   QDomElement elemEyeDomeLighting = doc.createElement( QStringLiteral( 
"eye-dome-lighting" ) );
 
  407   elemEyeDomeLighting.setAttribute( 
"enabled", mEyeDomeLightingEnabled ? 1 : 0 );
 
  408   elemEyeDomeLighting.setAttribute( 
"eye-dome-lighting-strength", mEyeDomeLightingStrength );
 
  409   elemEyeDomeLighting.setAttribute( 
"eye-dome-lighting-distance", mEyeDomeLightingDistance );
 
  410   elem.appendChild( elemEyeDomeLighting );
 
  413   QDomElement elemDebugSettings = doc.createElement( QStringLiteral( 
"debug-settings" ) );
 
  414   elemDebugSettings.setAttribute( QStringLiteral( 
"shadowmap-enabled" ), mDebugShadowMapEnabled );
 
  415   elemDebugSettings.setAttribute( QStringLiteral( 
"shadowmap-corner" ), mDebugShadowMapCorner );
 
  416   elemDebugSettings.setAttribute( QStringLiteral( 
"shadowmap-size" ), mDebugShadowMapSize );
 
  417   elemDebugSettings.setAttribute( QStringLiteral( 
"depthmap-enabled" ), mDebugDepthMapEnabled );
 
  418   elemDebugSettings.setAttribute( QStringLiteral( 
"depthmap-corner" ), mDebugDepthMapCorner );
 
  419   elemDebugSettings.setAttribute( QStringLiteral( 
"depthmap-size" ), mDebugDepthMapSize );
 
  420   elem.appendChild( elemDebugSettings );
 
  422   QDomElement elemTemporalRange = doc.createElement( QStringLiteral( 
"temporal-range" ) );
 
  423   elemTemporalRange.setAttribute( QStringLiteral( 
"start" ), 
temporalRange().begin().toString( Qt::ISODate ) );
 
  424   elemTemporalRange.setAttribute( QStringLiteral( 
"end" ), 
temporalRange().end().toString( Qt::ISODate ) );
 
  431   for ( 
int i = 0; i < mLayers.count(); ++i )
 
  436   for ( 
int i = 0; i < mTerrainLayers.count(); ++i )
 
  442   mTerrainGenerator->resolveReferences( project );
 
  444   for ( 
int i = 0; i < mRenderers.count(); ++i )
 
  468   return mTransformContext;
 
  473   mTransformContext = context;
 
  478   if ( color == mBackgroundColor )
 
  481   mBackgroundColor = color;
 
  487   return mBackgroundColor;
 
  492   if ( color == mSelectionColor )
 
  495   mSelectionColor = color;
 
  501   return mSelectionColor;
 
  506   if ( zScale == mTerrainVerticalScale )
 
  509   mTerrainVerticalScale = zScale;
 
  515   return mTerrainVerticalScale;
 
  520   QList<QgsMapLayerRef> lst;
 
  521   lst.reserve( 
layers.count() );
 
  527   if ( mLayers == lst )
 
  536   QList<QgsMapLayer *> lst;
 
  537   lst.reserve( mLayers.count() );
 
  540     if ( layerRef.layer )
 
  541       lst.append( layerRef.layer );
 
  548   QList<QgsMapLayerRef> lst;
 
  549   lst.reserve( 
layers.count() );
 
  555   if ( mTerrainLayers == lst )
 
  558   mTerrainLayers = lst;
 
  564   QList<QgsMapLayer *> lst;
 
  565   lst.reserve( mTerrainLayers.count() );
 
  568     if ( layerRef.layer )
 
  569       lst.append( layerRef.layer );
 
  576   if ( mMapTileResolution == res )
 
  579   mMapTileResolution = res;
 
  585   return mMapTileResolution;
 
  590   if ( mMaxTerrainScreenError == error )
 
  593   mMaxTerrainScreenError = error;
 
  599   return mMaxTerrainScreenError;
 
  604   if ( mMaxTerrainGroundError == error )
 
  607   mMaxTerrainGroundError = error;
 
  613   if ( mTerrainElevationOffset == offset )
 
  615   mTerrainElevationOffset = offset;
 
  621   return mMaxTerrainGroundError;
 
  626   if ( mTerrainGenerator )
 
  631   mTerrainGenerator.reset( gen );
 
  639   if ( mTerrainShadingEnabled == enabled )
 
  642   mTerrainShadingEnabled = enabled;
 
  648   if ( mTerrainShadingMaterial == material )
 
  651   mTerrainShadingMaterial = material;
 
  657   if ( mTerrainMapTheme == theme )
 
  660   mTerrainMapTheme = theme;
 
  666   qDeleteAll( mRenderers );
 
  675   if ( mShowTerrainBoundingBoxes == enabled )
 
  678   mShowTerrainBoundingBoxes = enabled;
 
  684   if ( mShowTerrainTileInfo == enabled )
 
  687   mShowTerrainTileInfo = enabled;
 
  693   if ( mShowCameraViewCenter == enabled )
 
  696   mShowCameraViewCenter = enabled;
 
  702   if ( mShowLightSources == enabled )
 
  705   mShowLightSources = enabled;
 
  711   if ( mShowLabels == enabled )
 
  714   mShowLabels = enabled;
 
  720   if ( mEyeDomeLightingEnabled == enabled )
 
  722   mEyeDomeLightingEnabled = enabled;
 
  728   if ( mEyeDomeLightingStrength == strength )
 
  730   mEyeDomeLightingStrength = strength;
 
  736   if ( mEyeDomeLightingDistance == distance )
 
  738   mEyeDomeLightingDistance = distance;
 
  780   if ( mCameraNavigationMode == navigationMode )
 
  783   mCameraNavigationMode = navigationMode;
 
  789   if ( mCameraMovementSpeed == movementSpeed )
 
  792   mCameraMovementSpeed = movementSpeed;
 
  810   mDebugShadowMapEnabled = enabled;
 
  811   mDebugShadowMapCorner = corner;
 
  812   mDebugShadowMapSize = size;
 
  818   mDebugDepthMapEnabled = enabled;
 
  819   mDebugDepthMapCorner = corner;
 
  820   mDebugDepthMapSize = size;
 
  826   if ( fpsCounterEnabled == mIsFpsCounterEnabled )
 
  828   mIsFpsCounterEnabled = fpsCounterEnabled;
 
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 renderersChanged()
Emitted when the list of map's extra renderers have been modified.
QList< QgsAbstract3DRenderer * > renderers() const
Returns list of extra 3D renderers.
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 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.
QList< QgsDirectionalLightSettings > directionalLights() const
Returns list of directional lights defined in the scene.
void setPointLights(const QList< QgsPointLightSettings > &pointLights)
Sets list of point lights defined in the scene.
void backgroundColorChanged()
Emitted when the background color has changed.
void showTerrainBoundingBoxesChanged()
Emitted when the flag whether terrain's bounding boxes are shown has changed.
void setDirectionalLights(const QList< QgsDirectionalLightSettings > &directionalLights)
Sets list of directional lights defined in the scene.
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.
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 terrainLayersChanged()
Emitted when the list of map layers for terrain texture has changed.
float maxTerrainGroundError() const
Returns maximum ground error of terrain tiles in world units.
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 setShowLabels(bool enabled)
Sets whether to display labels on terrain tiles.
double terrainVerticalScale() const
Returns vertical scale (exaggeration) of terrain.
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 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)
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)
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.
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 showLightSourceOriginsChanged()
Emitted when the flag whether light source origins are shown has changed.
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()=default
Constructor for Qgs3DMapSettings.
~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 setCameraMovementSpeed(double movementSpeed)
Sets the camera movement speed.
void terrainElevationOffsetChanged(float newElevation)
Emitted when the terrain elevation offset is changed.
void setBackgroundColor(const QColor &color)
Sets background color of the 3D map view.
void fpsCounterEnabledChanged(bool fpsCounterEnabled)
Emitted when the FPS counter is enabled or disabled.
void setProjectionType(const Qt3DRender::QCameraLens::ProjectionType projectionType)
Sets the camera lens' projection type.
void setCameraNavigationMode(QgsCameraController::NavigationMode navigationMode)
Sets the navigation mode for the camera.
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.
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.
void setIsFpsCounterEnabled(bool fpsCounterEnabled)
Sets whether FPS counter label is enabled.
QList< QgsPointLightSettings > pointLights() const
Returns list of point lights defined in the scene.
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.
QgsCameraController::NavigationMode cameraNavigationMode() const
Returns the navigation mode used by the camera.
void terrainGeneratorChanged()
Emitted when the terrain generator has changed.
void setTerrainGenerator(QgsTerrainGenerator *gen)
Sets terrain generator.
void debugShadowMapSettingsChanged()
Emitted when shadow map debugging has changed.
QList< QgsMapLayer * > terrainLayers() const
Returns the list of map layers to be rendered as a texture of the terrain.
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.
void setTerrainLayers(const QList< QgsMapLayer * > &layers)
Sets the list of 2d map layers to be rendered in the terrain.
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()
NavigationMode
The navigation mode used by the camera.
@ WalkNavigation
Uses WASD keys or arrows to navigate in walking (first person) manner.
@ TerrainBasedNavigation
The default navigation based on the terrain.
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.
void setCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets CRS of the terrain.
void readXml(const QDomElement &elem)
Reads configuration from a DOM element previously written using writeXml()
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets CRS of the terrain.
Base class for all map layer types.
3D renderer that renders all mesh triangles of a mesh layer.
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
void setPosition(const QgsVector3D &pos)
Sets position of the light (in 3D world coordinates)
void readXml(const QDomElement &elem)
Reads configuration from a DOM element previously written using writeXml()
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
The class is used as a container of context for various read/write operations on other objects.
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 extentChanged()
Emitted when the terrain extent has changed.
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.