void Qgs3DMapConfigWidget::apply() { QgsRasterLayer *demLayer = qobject_cast<QgsRasterLayer *>( cboTerrainLayer->currentLayer() ); bool needsUpdateOrigin = false; if ( demLayer ) { bool tGenNeedsUpdate = true; if ( mMap->terrainGenerator()->type() == QgsTerrainGenerator::Dem ) { // if we already have a DEM terrain generator, check whether there was actually any change QgsDemTerrainGenerator *oldDemTerrainGen = static_cast<QgsDemTerrainGenerator *>( mMap->terrainGenerator() ); if ( oldDemTerrainGen->layer() == demLayer && oldDemTerrainGen->resolution() == spinTerrainResolution->value() && oldDemTerrainGen->skirtHeight() == spinTerrainSkirtHeight->value() ) tGenNeedsUpdate = false; } if ( tGenNeedsUpdate ) { QgsDemTerrainGenerator *demTerrainGen = new QgsDemTerrainGenerator; demTerrainGen->setCrs( mMap->crs(), QgsProject::instance()->transformContext() ); demTerrainGen->setLayer( demLayer ); demTerrainGen->setResolution( spinTerrainResolution->value() ); demTerrainGen->setSkirtHeight( spinTerrainSkirtHeight->value() ); mMap->setTerrainGenerator( demTerrainGen ); needsUpdateOrigin = true; } } else if ( !demLayer && mMap->terrainGenerator()->type() != QgsTerrainGenerator::Flat ) { QgsFlatTerrainGenerator *flatTerrainGen = new QgsFlatTerrainGenerator; flatTerrainGen->setCrs( mMap->crs() ); flatTerrainGen->setExtent( mMainCanvas->fullExtent() ); mMap->setTerrainGenerator( flatTerrainGen ); needsUpdateOrigin = true; } if ( needsUpdateOrigin ) { // reproject terrain's extent to map CRS QgsRectangle te = mMap->terrainGenerator()->extent(); QgsCoordinateTransform terrainToMapTransform( mMap->terrainGenerator()->crs(), mMap->crs(), QgsProject::instance() ); te = terrainToMapTransform.transformBoundingBox( te ); QgsPointXY center = te.center(); mMap->setOrigin( QgsVector3D( center.x(), center.y(), 0 ) ); } mMap->setTerrainVerticalScale( spinTerrainScale->value() ); mMap->setMapTileResolution( spinMapResolution->value() ); mMap->setMaxTerrainScreenError( spinScreenError->value() ); mMap->setMaxTerrainGroundError( spinGroundError->value() ); mMap->setShowLabels( chkShowLabels->isChecked() ); mMap->setShowTerrainTilesInfo( chkShowTileInfo->isChecked() ); mMap->setShowTerrainBoundingBoxes( chkShowBoundingBoxes->isChecked() ); mMap->setShowCameraViewCenter( chkShowCameraViewCenter->isChecked() ); }
float QgsTerrainGenerator::rootChunkError( const Qgs3DMapSettings &map ) const { QgsRectangle te = extent(); QgsCoordinateTransform terrainToMapTransform( crs(), map.crs() ); te = terrainToMapTransform.transformBoundingBox( te ); // use texel size as the error return te.width() / map.mapTileResolution(); }
QgsAABB QgsTerrainGenerator::rootChunkBbox( const Qgs3DMapSettings &map ) const { QgsRectangle te = extent(); QgsCoordinateTransform terrainToMapTransform( crs(), map.crs() ); te = terrainToMapTransform.transformBoundingBox( te ); float hMin, hMax; rootChunkHeightRange( hMin, hMax ); return QgsAABB( te.xMinimum() - map.originX(), hMin * map.terrainVerticalScale(), -te.yMaximum() + map.originY(), te.xMaximum() - map.originX(), hMax * map.terrainVerticalScale(), -te.yMinimum() + map.originY() ); }