diff --git a/src/3d/qgs3dmapscene.cpp b/src/3d/qgs3dmapscene.cpp index baa60913ef0c..bc28d4da5a96 100644 --- a/src/3d/qgs3dmapscene.cpp +++ b/src/3d/qgs3dmapscene.cpp @@ -216,7 +216,6 @@ void Qgs3DMapScene::viewZoomFull() double d = side / 2 / std::tan( cameraController()->camera()->fieldOfView() / 2 * M_PI / 180 ); d += zRange.isInfinite() ? 0. : zRange.upper(); mCameraController->resetView( static_cast( d ) ); - return; } void Qgs3DMapScene::setViewFrom2DExtent( const QgsRectangle &extent ) diff --git a/src/3d/qgscameracontroller.cpp b/src/3d/qgscameracontroller.cpp index 13e650f515be..d76cce8d947a 100644 --- a/src/3d/qgscameracontroller.cpp +++ b/src/3d/qgscameracontroller.cpp @@ -186,11 +186,9 @@ void QgsCameraController::setViewFromTop( float worldX, float worldY, float dist camPose.setDistanceFromCenterPoint( distance ); camPose.setHeadingAngle( yaw ); - // a basic setup to make frustum depth range long enough that it does not cull everything - mCamera->setNearPlane( distance / 2 ); - mCamera->setFarPlane( distance * 2 ); - - setCameraPose( camPose ); + // we force the updateCameraNearFarPlanes() in Qgs3DMapScene to properly set the planes + mCameraPose = camPose; + updateCameraFromPose(); } QgsVector3D QgsCameraController::lookingAtPoint() const diff --git a/src/core/pointcloud/qgspointcloudlayerelevationproperties.cpp b/src/core/pointcloud/qgspointcloudlayerelevationproperties.cpp index 124c89b0c25a..de43f05bebd7 100644 --- a/src/core/pointcloud/qgspointcloudlayerelevationproperties.cpp +++ b/src/core/pointcloud/qgspointcloudlayerelevationproperties.cpp @@ -21,6 +21,7 @@ #include "qgsapplication.h" #include "qgscolorschemeregistry.h" #include "qgscolorutils.h" +#include "qgsvirtualpointcloudprovider.h" QgsPointCloudLayerElevationProperties::QgsPointCloudLayerElevationProperties( QObject *parent ) : QgsMapLayerElevationProperties( parent ) @@ -127,11 +128,27 @@ QgsDoubleRange QgsPointCloudLayerElevationProperties::calculateZRange( QgsMapLay { if ( pcLayer->dataProvider() ) { + double zMin = std::numeric_limits::quiet_NaN(); + double zMax = std::numeric_limits::quiet_NaN(); const QgsPointCloudStatistics stats = pcLayer->statistics(); + if ( !stats.statisticsMap().isEmpty() ) + { + // try to fetch z range from provider metadata + zMin = stats.minimum( QStringLiteral( "Z" ) ); + zMax = stats.maximum( QStringLiteral( "Z" ) ); + } + // try to fetch the elevation properties from virtual point cloud metadata + else if ( QgsVirtualPointCloudProvider *virtualProvider = dynamic_cast< QgsVirtualPointCloudProvider * >( pcLayer->dataProvider() ) ) + { + for ( QgsPointCloudSubIndex subIndex : virtualProvider->subIndexes() ) + { + const QgsDoubleRange newRange = subIndex.zRange(); + if ( newRange.isInfinite() ) continue; + zMin = std::isnan( zMin ) ? newRange.lower() : std::min( zMin, newRange.lower() ); + zMax = std::isnan( zMax ) ? newRange.upper() : std::max( zMax, newRange.upper() ); + } + } - // try to fetch z range from provider metadata - const double zMin = stats.minimum( QStringLiteral( "Z" ) ); - const double zMax = stats.maximum( QStringLiteral( "Z" ) ); if ( !std::isnan( zMin ) && !std::isnan( zMax ) ) { return QgsDoubleRange( zMin * mZScale + mZOffset, zMax * mZScale + mZOffset ); diff --git a/tests/src/3d/testqgspointcloud3drendering.cpp b/tests/src/3d/testqgspointcloud3drendering.cpp index a57b190f879a..f0613e6b9cfe 100644 --- a/tests/src/3d/testqgspointcloud3drendering.cpp +++ b/tests/src/3d/testqgspointcloud3drendering.cpp @@ -594,7 +594,7 @@ void TestQgsPointCloud3DRendering::testPointCloud3DOverview() // There is a bug in overview rendering, which doesn't render overview right away, it needs to get out of camera view // and back in. Then it renders correctly scene->cameraController()->moveView( mVpcLayer->extent().width(), mVpcLayer->extent().height() ); - scene->cameraController()->resetView( 120 ); + scene->cameraController()->resetView( 90 ); // When running the test on Travis, it would initially return empty rendered image. // Capturing the initial image and throwing it away fixes that. Hopefully we will // find a better fix in the future. diff --git a/tests/testdata/control_images/3d/expected_virtual_pointcloud_3d_overview/default/expected_virtual_pointcloud_3d_overview.png b/tests/testdata/control_images/3d/expected_virtual_pointcloud_3d_overview/default/expected_virtual_pointcloud_3d_overview.png index e72fe0fe5d2c..e06b4f838fca 100644 Binary files a/tests/testdata/control_images/3d/expected_virtual_pointcloud_3d_overview/default/expected_virtual_pointcloud_3d_overview.png and b/tests/testdata/control_images/3d/expected_virtual_pointcloud_3d_overview/default/expected_virtual_pointcloud_3d_overview.png differ diff --git a/tests/testdata/control_images/3d/expected_virtual_pointcloud_3d_overview/qt6/expected_virtual_pointcloud_3d_overview.png b/tests/testdata/control_images/3d/expected_virtual_pointcloud_3d_overview/qt6/expected_virtual_pointcloud_3d_overview.png index 2fd86a008494..4c6c33383246 100644 Binary files a/tests/testdata/control_images/3d/expected_virtual_pointcloud_3d_overview/qt6/expected_virtual_pointcloud_3d_overview.png and b/tests/testdata/control_images/3d/expected_virtual_pointcloud_3d_overview/qt6/expected_virtual_pointcloud_3d_overview.png differ