[feature] Create new debug widget for 3D map View

This commit adds new debug side panel (similar to navigation widget), which moves several existing options from settings/navigation panel here. Camera Info has been moved from navigation panel and from table changed into input elements (preparation for another feature). Show map tile info, Show bounding boxes, Show camera's view/rotation center, Show light sources, Show debug overlay, Debug shadow map, Debug Depth map options have been moved from advanced sub-category of options. New Stop scene updates option has been created.
This commit is contained in:
Withalion 2024-11-17 16:37:09 +01:00 committed by Martin Dobias
parent 66cc502dba
commit 9b18fdd1f9
11 changed files with 682 additions and 365 deletions

View File

@ -0,0 +1,145 @@
/***************************************************************************
qgs3ddebugwidget.cpp
--------------------------------------
Date : November 2024
Copyright : (C) 2024 by Matej Bagar
Email : matej dot bagar at lutraconsulting dot co dot uk
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgis.h"
#include "moc_qgs3ddebugwidget.cpp"
#include "qgs3ddebugwidget.h"
#include "qgs3dmapcanvas.h"
#include "qgscameracontroller.h"
Qgs3DDebugWidget::Qgs3DDebugWidget( Qgs3DMapCanvas *canvas, QWidget *parent ) : QWidget( parent ), m3DMapCanvas( canvas )
{
// set up the widget defined in ui file
setupUi( this );
// set up the fixed width of debug widget
mCameraInfoGroupBox->setMinimumWidth( mCameraInfoGroupBox->sizeHint().width() );
mCameraInfoGroupBox->adjustSize();
scrollAreaWidgetContents->setMinimumWidth( scrollAreaWidgetContents->sizeHint().width() );
scrollAreaWidgetContents->adjustSize();
scrollArea->setMinimumWidth( scrollArea->sizeHint().width() );
scrollArea->adjustSize();
this->adjustSize();
// set up the shadow map block
mDebugShadowMapCornerComboBox->addItem( tr( "Top Left" ) );
mDebugShadowMapCornerComboBox->addItem( tr( "Top Right" ) );
mDebugShadowMapCornerComboBox->addItem( tr( "Bottom Left" ) );
mDebugShadowMapCornerComboBox->addItem( tr( "Bottom Right" ) );
mDebugShadowMapSizeSpinBox->setClearValue( 0.1 );
// set up the depth map block
mDebugDepthMapCornerComboBox->addItem( tr( "Top Left" ) );
mDebugDepthMapCornerComboBox->addItem( tr( "Top Right" ) );
mDebugDepthMapCornerComboBox->addItem( tr( "Bottom Left" ) );
mDebugDepthMapCornerComboBox->addItem( tr( "Bottom Right" ) );
mDebugDepthMapSizeSpinBox->setClearValue( 0.1 );
// set up the camera info block
mNearPlane->setRange( std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max() );
mFarPlane->setRange( std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max() );
mCameraX->setRange( std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max() );
mCameraY->setRange( std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max() );
mCameraZ->setRange( std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max() );
mLookingX->setRange( std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max() );
mLookingY->setRange( std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max() );
mLookingZ->setRange( std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max() );
// hide camera info on first render
for ( QWidget *childWidget : mCameraInfoGroupBox->findChildren<QWidget *>() )
{
childWidget->setVisible( false );
}
// hide or show camera info on toggle
connect( mCameraInfoGroupBox, &QGroupBox::toggled, this, [ = ]( const bool enabled )
{
for ( QWidget *childWidget : mCameraInfoGroupBox->findChildren<QWidget *>() )
{
childWidget->setVisible( enabled );
}
} );
}
/**
* Sets up the interactive elements with values from Qgs3DMapSettings
*/
void Qgs3DDebugWidget::setMapSettings( Qgs3DMapSettings *mapSettings )
{
mMap = mapSettings;
chkShowTileInfo->setChecked( mMap->showTerrainTilesInfo() );
chkShowBoundingBoxes->setChecked( mMap->showTerrainBoundingBoxes() );
chkShowCameraViewCenter->setChecked( mMap->showCameraViewCenter() );
chkShowCameraRotationCenter->setChecked( mMap->showCameraRotationCenter() );
chkShowLightSourceOrigins->setChecked( mMap->showLightSourceOrigins() );
chkStopUpdates->setChecked( mMap->stopUpdates() );
chkDebugOverlay->setChecked( mMap->isDebugOverlayEnabled() );
connect( chkShowTileInfo, &QCheckBox::toggled, this, [ = ]( const bool enabled ) {mMap->setShowTerrainTilesInfo( enabled ); } );
connect( chkShowBoundingBoxes, &QCheckBox::toggled, this, [ = ]( const bool enabled ) {mMap->setShowTerrainBoundingBoxes( enabled ); } );
connect( chkShowCameraViewCenter, &QCheckBox::toggled, this, [ = ]( const bool enabled ) {mMap->setShowCameraViewCenter( enabled ); } );
connect( chkShowCameraRotationCenter, &QCheckBox::toggled, this, [ = ]( const bool enabled ) {mMap->setShowCameraRotationCenter( enabled ); } );
connect( chkShowLightSourceOrigins, &QCheckBox::toggled, this, [ = ]( const bool enabled ) {mMap->setShowLightSourceOrigins( enabled ); } );
connect( chkStopUpdates, &QCheckBox::toggled, this, [ = ]( const bool enabled ) {mMap->setStopUpdates( enabled ); } );
connect( chkDebugOverlay, &QCheckBox::toggled, this, [ = ]( const bool enabled ) {mMap->setIsDebugOverlayEnabled( enabled ); } );
mDebugShadowMapGroupBox->setChecked( mMap->debugShadowMapEnabled() );
mDebugShadowMapCornerComboBox->setCurrentIndex( mMap->debugShadowMapCorner() );
mDebugShadowMapSizeSpinBox->setValue( mMap->debugShadowMapSize() );
// Do not display the shadow debug map if the shadow effect is not enabled.
connect( mDebugShadowMapGroupBox, &QGroupBox::toggled, this, [ = ]( const bool enabled )
{
mMap->setDebugShadowMapSettings( enabled && mMap->shadowSettings().renderShadows(), static_cast<Qt::Corner>( mDebugShadowMapCornerComboBox->currentIndex() ), mDebugShadowMapSizeSpinBox->value() );
} );
connect( mDebugShadowMapCornerComboBox, QOverload<int>::of( &QComboBox::currentIndexChanged ), this, [ = ]( const int index )
{
mMap->setDebugShadowMapSettings( mDebugShadowMapGroupBox->isChecked() && mMap->shadowSettings().renderShadows(), static_cast<Qt::Corner>( index ), mDebugShadowMapSizeSpinBox->value() );
} );
connect( mDebugShadowMapSizeSpinBox, QOverload<double>::of( &QDoubleSpinBox::valueChanged ), this, [ = ]( const int value )
{
mMap->setDebugShadowMapSettings( mDebugShadowMapGroupBox->isChecked() && mMap->shadowSettings().renderShadows(), static_cast<Qt::Corner>( mDebugShadowMapCornerComboBox->currentIndex() ), value );
} );
mDebugDepthMapGroupBox->setChecked( mMap->debugDepthMapEnabled() );
mDebugDepthMapCornerComboBox->setCurrentIndex( mMap->debugDepthMapCorner() );
mDebugDepthMapSizeSpinBox->setValue( mMap->debugDepthMapSize() );
connect( mDebugDepthMapGroupBox, &QGroupBox::toggled, this, [ = ]( const bool enabled )
{
mMap->setDebugDepthMapSettings( enabled, static_cast<Qt::Corner>( mDebugDepthMapCornerComboBox->currentIndex() ), mDebugDepthMapSizeSpinBox->value() );
} );
connect( mDebugDepthMapCornerComboBox, QOverload<int>::of( &QComboBox::currentIndexChanged ), this, [ = ]( const int index )
{
mMap->setDebugDepthMapSettings( mDebugDepthMapGroupBox->isChecked(), static_cast<Qt::Corner>( index ), mDebugDepthMapSizeSpinBox->value() );
} );
connect( mDebugShadowMapSizeSpinBox, QOverload<double>::of( &QDoubleSpinBox::valueChanged ), this, [ = ]( const int value )
{
mMap->setDebugDepthMapSettings( mDebugDepthMapGroupBox->isChecked(), static_cast<Qt::Corner>( mDebugDepthMapCornerComboBox->currentIndex() ), value );
} );
}
/**
* Update the state of navigation widget from camera's state
*/
void Qgs3DDebugWidget::updateFromCamera() const
{
mNearPlane->setValue( m3DMapCanvas->cameraController()->camera()->nearPlane() );
mFarPlane->setValue( m3DMapCanvas->cameraController()->camera()->farPlane() );
mCameraX->setValue( m3DMapCanvas->cameraController()->camera()->position().x() );
mCameraY->setValue( m3DMapCanvas->cameraController()->camera()->position().y() );
mCameraZ->setValue( m3DMapCanvas->cameraController()->camera()->position().z() );
mLookingX->setValue( m3DMapCanvas->cameraController()->lookingAtPoint().x() );
mLookingY->setValue( m3DMapCanvas->cameraController()->lookingAtPoint().y() );
mLookingZ->setValue( m3DMapCanvas->cameraController()->lookingAtPoint().z() );
}

View File

@ -0,0 +1,41 @@
/***************************************************************************
qgs3ddebugwidget.h
--------------------------------------
Date : November 2024
Copyright : (C) 2024 by Matej Bagar
Email : matej dot bagar at lutraconsulting dot co dot uk
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGS3DDEBUGWIDGET_H
#define QGS3DDEBUGWIDGET_H
class QStandardItemModel;
class Qgs3DMapCanvas;
#include <ui_3ddebugwidget.h>
#include "qgs3dmapsettings.h"
class Qgs3DDebugWidget : public QWidget, Ui::Q3DDebugWidget
{
Q_OBJECT
public:
explicit Qgs3DDebugWidget( Qgs3DMapCanvas *canvas, QWidget *parent = nullptr );
void setMapSettings( Qgs3DMapSettings *mapSettings );
public slots:
void updateFromCamera() const;
private:
Qgs3DMapSettings *mMap = nullptr;
Qgs3DMapCanvas *m3DMapCanvas = nullptr;
};
#endif // QGS3DDEBUGWIDGET_H

View File

@ -46,6 +46,7 @@
#include "qgs3dmaptoolidentify.h" #include "qgs3dmaptoolidentify.h"
#include "qgs3dmaptoolmeasureline.h" #include "qgs3dmaptoolmeasureline.h"
#include "qgs3dnavigationwidget.h" #include "qgs3dnavigationwidget.h"
#include "qgs3ddebugwidget.h"
#include "qgs3dutils.h" #include "qgs3dutils.h"
#include "qgswindow3dengine.h" #include "qgswindow3dengine.h"
@ -288,11 +289,13 @@ Qgs3DMapCanvasWidget::Qgs3DMapCanvasWidget( const QString &name, bool isDocked )
mContainer->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); mContainer->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
mNavigationWidget = new Qgs3DNavigationWidget( mCanvas ); mNavigationWidget = new Qgs3DNavigationWidget( mCanvas );
mNavigationWidget->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ); mNavigationWidget->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding );
mDebugWidget = new Qgs3DDebugWidget( mCanvas );
QHBoxLayout *hLayout = new QHBoxLayout; QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->setContentsMargins( 0, 0, 0, 0 ); hLayout->setContentsMargins( 0, 0, 0, 0 );
hLayout->addWidget( mContainer ); hLayout->addWidget( mContainer );
hLayout->addWidget( mNavigationWidget ); hLayout->addWidget( mNavigationWidget );
hLayout->addWidget( mDebugWidget );
toggleNavigationWidget( toggleNavigationWidget(
setting.value( QStringLiteral( "/3D/navigationWidget/visibility" ), false, QgsSettings::Gui ).toBool() setting.value( QStringLiteral( "/3D/navigationWidget/visibility" ), false, QgsSettings::Gui ).toBool()
@ -318,6 +321,19 @@ Qgs3DMapCanvasWidget::Qgs3DMapCanvasWidget( const QString &name, bool isDocked )
{ {
QgisApp::instance()->close3DMapView( canvasName() ); QgisApp::instance()->close3DMapView( canvasName() );
} ); } );
QAction *toggleDebugPanel = toolBar->addAction(
QgsApplication::getThemeIcon( QStringLiteral( "/propertyicons/general.svg" ) ),
tr( "Toggle On-Screen Debug Information" ) );
toggleDebugPanel->setCheckable( true );
toggleDebugPanel->setChecked(
setting.value( QStringLiteral( "/3D/debugWidget/visibility" ), false, QgsSettings::Gui ).toBool()
);
toggleDebugWidget(
setting.value( QStringLiteral( "/3D/debugWidget/visibility" ), false, QgsSettings::Gui ).toBool()
);
connect( toggleDebugPanel, &QAction::toggled, this, &Qgs3DMapCanvasWidget::toggleDebugWidget );
} }
Qgs3DMapCanvasWidget::~Qgs3DMapCanvasWidget() Qgs3DMapCanvasWidget::~Qgs3DMapCanvasWidget()
@ -396,6 +412,13 @@ void Qgs3DMapCanvasWidget::toggleFpsCounter( bool visibility )
mLabelFpsCounter->setVisible( visibility ); mLabelFpsCounter->setVisible( visibility );
} }
void Qgs3DMapCanvasWidget::toggleDebugWidget( const bool visibility ) const
{
mDebugWidget->setVisible( visibility );
QgsSettings setting;
setting.setValue( QStringLiteral( "/3D/debugWidget/visibility" ), visibility, QgsSettings::Gui );
}
void Qgs3DMapCanvasWidget::setMapSettings( Qgs3DMapSettings *map ) void Qgs3DMapCanvasWidget::setMapSettings( Qgs3DMapSettings *map )
{ {
whileBlocking( mActionEnableShadows )->setChecked( map->shadowSettings().renderShadows() ); whileBlocking( mActionEnableShadows )->setChecked( map->shadowSettings().renderShadows() );
@ -407,14 +430,14 @@ void Qgs3DMapCanvasWidget::setMapSettings( Qgs3DMapSettings *map )
mCanvas->setMapSettings( map ); mCanvas->setMapSettings( map );
// Connect the camera to the navigation widget.
connect( mCanvas->cameraController(), &QgsCameraController::cameraChanged, mNavigationWidget, &Qgs3DNavigationWidget::updateFromCamera );
connect( mCanvas->scene(), &Qgs3DMapScene::totalPendingJobsCountChanged, this, &Qgs3DMapCanvasWidget::onTotalPendingJobsCountChanged ); connect( mCanvas->scene(), &Qgs3DMapScene::totalPendingJobsCountChanged, this, &Qgs3DMapCanvasWidget::onTotalPendingJobsCountChanged );
connect( mCanvas->scene(), &Qgs3DMapScene::gpuMemoryLimitReached, this, &Qgs3DMapCanvasWidget::onGpuMemoryLimitReached ); connect( mCanvas->scene(), &Qgs3DMapScene::gpuMemoryLimitReached, this, &Qgs3DMapCanvasWidget::onGpuMemoryLimitReached );
// update the navigation widget when the near/far planes have been updated by the map scene // Connect the camera to the debug widget.
connect( mCanvas->cameraController()->camera(), &Qt3DRender::QCamera::nearPlaneChanged, mNavigationWidget, &Qgs3DNavigationWidget::updateFromCamera ); connect( mCanvas->cameraController(), &QgsCameraController::cameraChanged, mDebugWidget, &Qgs3DDebugWidget::updateFromCamera );
connect( mCanvas->cameraController()->camera(), &Qt3DRender::QCamera::farPlaneChanged, mNavigationWidget, &Qgs3DNavigationWidget::updateFromCamera ); // update the debug widget when the near/far planes have been updated by the map scene
connect( mCanvas->cameraController()->camera(), &Qt3DRender::QCamera::nearPlaneChanged, mDebugWidget, &Qgs3DDebugWidget::updateFromCamera );
connect( mCanvas->cameraController()->camera(), &Qt3DRender::QCamera::farPlaneChanged, mDebugWidget, &Qgs3DDebugWidget::updateFromCamera );
mAnimationWidget->setCameraController( mCanvas->cameraController() ); mAnimationWidget->setCameraController( mCanvas->cameraController() );
mAnimationWidget->setMap( map ); mAnimationWidget->setMap( map );

View File

@ -36,6 +36,7 @@ class Qgs3DMapSettings;
class Qgs3DMapToolIdentify; class Qgs3DMapToolIdentify;
class Qgs3DMapToolMeasureLine; class Qgs3DMapToolMeasureLine;
class Qgs3DNavigationWidget; class Qgs3DNavigationWidget;
class Qgs3DDebugWidget;
class QgsMapTool; class QgsMapTool;
class QgsMapToolExtent; class QgsMapToolExtent;
class QgsMapCanvas; class QgsMapCanvas;
@ -79,6 +80,7 @@ class APP_EXPORT Qgs3DMapCanvasWidget : public QWidget
void exportScene(); void exportScene();
void toggleNavigationWidget( bool visibility ); void toggleNavigationWidget( bool visibility );
void toggleFpsCounter( bool visibility ); void toggleFpsCounter( bool visibility );
void toggleDebugWidget( bool visibility ) const;
void setSceneExtentOn2DCanvas(); void setSceneExtentOn2DCanvas();
void setSceneExtent( const QgsRectangle &extent ); void setSceneExtent( const QgsRectangle &extent );
@ -139,7 +141,8 @@ class APP_EXPORT Qgs3DMapCanvasWidget : public QWidget
QWidget *mContainer = nullptr; QWidget *mContainer = nullptr;
//! On-Screen Navigation widget. //! On-Screen Navigation widget.
Qgs3DNavigationWidget *mNavigationWidget = nullptr; Qgs3DNavigationWidget *mNavigationWidget = nullptr;
//! On-screen Debug widget
Qgs3DDebugWidget *mDebugWidget = nullptr;
}; };
#endif // QGS3DMAPCANVASWIDGET_H #endif // QGS3DMAPCANVASWIDGET_H

View File

@ -92,8 +92,6 @@ Qgs3DMapConfigWidget::Qgs3DMapConfigWidget( Qgs3DMapSettings *map, QgsMapCanvas
terrainElevationOffsetSpinBox->setClearValue( 0.0 ); terrainElevationOffsetSpinBox->setClearValue( 0.0 );
edlStrengthSpinBox->setClearValue( 1000 ); edlStrengthSpinBox->setClearValue( 1000 );
edlDistanceSpinBox->setClearValue( 1 ); edlDistanceSpinBox->setClearValue( 1 );
mDebugShadowMapSizeSpinBox->setClearValue( 0.1 );
mDebugDepthMapSizeSpinBox->setClearValue( 0.1 );
cboTerrainLayer->setAllowEmptyLayer( true ); cboTerrainLayer->setAllowEmptyLayer( true );
cboTerrainLayer->setFilters( Qgis::LayerFilter::RasterLayer ); cboTerrainLayer->setFilters( Qgis::LayerFilter::RasterLayer );
@ -158,16 +156,7 @@ Qgs3DMapConfigWidget::Qgs3DMapConfigWidget( Qgs3DMapSettings *map, QgsMapCanvas
spinGroundError->setValue( mMap->maxTerrainGroundError() ); spinGroundError->setValue( mMap->maxTerrainGroundError() );
terrainElevationOffsetSpinBox->setValue( mMap->terrainElevationOffset() ); terrainElevationOffsetSpinBox->setValue( mMap->terrainElevationOffset() );
chkShowLabels->setChecked( mMap->showLabels() ); chkShowLabels->setChecked( mMap->showLabels() );
chkShowTileInfo->setChecked( mMap->showTerrainTilesInfo() );
chkShowBoundingBoxes->setChecked( mMap->showTerrainBoundingBoxes() );
chkShowCameraViewCenter->setChecked( mMap->showCameraViewCenter() );
chkShowCameraRotationCenter->setChecked( mMap->showCameraRotationCenter() );
chkShowLightSourceOrigins->setChecked( mMap->showLightSourceOrigins() );
mFpsCounterCheckBox->setChecked( mMap->isFpsCounterEnabled() ); mFpsCounterCheckBox->setChecked( mMap->isFpsCounterEnabled() );
chkStopUpdates->setChecked( mMap->stopUpdates() );
mDebugOverlayCheckBox->setChecked( mMap->isDebugOverlayEnabled() );
mDebugOverlayCheckBox->setVisible( true );
groupTerrainShading->setChecked( mMap->isTerrainShadingEnabled() ); groupTerrainShading->setChecked( mMap->isTerrainShadingEnabled() );
widgetTerrainMaterial->setTechnique( QgsMaterialSettingsRenderingTechnique::TrianglesWithFixedTexture ); widgetTerrainMaterial->setTechnique( QgsMaterialSettingsRenderingTechnique::TrianglesWithFixedTexture );
@ -232,25 +221,6 @@ Qgs3DMapConfigWidget::Qgs3DMapConfigWidget( Qgs3DMapSettings *map, QgsMapCanvas
edlStrengthSpinBox->setValue( map->eyeDomeLightingStrength() ); edlStrengthSpinBox->setValue( map->eyeDomeLightingStrength() );
edlDistanceSpinBox->setValue( map->eyeDomeLightingDistance() ); edlDistanceSpinBox->setValue( map->eyeDomeLightingDistance() );
mDebugShadowMapCornerComboBox->addItem( tr( "Top Left" ) );
mDebugShadowMapCornerComboBox->addItem( tr( "Top Right" ) );
mDebugShadowMapCornerComboBox->addItem( tr( "Bottom Left" ) );
mDebugShadowMapCornerComboBox->addItem( tr( "Bottom Right" ) );
mDebugDepthMapCornerComboBox->addItem( tr( "Top Left" ) );
mDebugDepthMapCornerComboBox->addItem( tr( "Top Right" ) );
mDebugDepthMapCornerComboBox->addItem( tr( "Bottom Left" ) );
mDebugDepthMapCornerComboBox->addItem( tr( "Bottom Right" ) );
mDebugShadowMapGroupBox->setChecked( map->debugShadowMapEnabled() );
mDebugShadowMapCornerComboBox->setCurrentIndex( static_cast<int>( map->debugShadowMapCorner() ) );
mDebugShadowMapSizeSpinBox->setValue( map->debugShadowMapSize() );
mDebugDepthMapGroupBox->setChecked( map->debugDepthMapEnabled() );
mDebugDepthMapCornerComboBox->setCurrentIndex( static_cast<int>( map->debugDepthMapCorner() ) );
mDebugDepthMapSizeSpinBox->setValue( map->debugDepthMapSize() );
// Ambient occlusion // Ambient occlusion
mAmbientOcclusionSettingsWidget->setAmbientOcclusionSettings( map->ambientOcclusionSettings() ); mAmbientOcclusionSettingsWidget->setAmbientOcclusionSettings( map->ambientOcclusionSettings() );
@ -373,15 +343,8 @@ void Qgs3DMapConfigWidget::apply()
mMap->setMaxTerrainGroundError( spinGroundError->value() ); mMap->setMaxTerrainGroundError( spinGroundError->value() );
mMap->setTerrainElevationOffset( terrainElevationOffsetSpinBox->value() ); mMap->setTerrainElevationOffset( terrainElevationOffsetSpinBox->value() );
mMap->setShowLabels( chkShowLabels->isChecked() ); mMap->setShowLabels( chkShowLabels->isChecked() );
mMap->setShowTerrainTilesInfo( chkShowTileInfo->isChecked() );
mMap->setShowTerrainBoundingBoxes( chkShowBoundingBoxes->isChecked() );
mMap->setShowCameraViewCenter( chkShowCameraViewCenter->isChecked() );
mMap->setShowCameraRotationCenter( chkShowCameraRotationCenter->isChecked() );
mMap->setShowLightSourceOrigins( chkShowLightSourceOrigins->isChecked() );
mMap->setIsFpsCounterEnabled( mFpsCounterCheckBox->isChecked() ); mMap->setIsFpsCounterEnabled( mFpsCounterCheckBox->isChecked() );
mMap->setStopUpdates( chkStopUpdates->isChecked() );
mMap->setTerrainShadingEnabled( groupTerrainShading->isChecked() ); mMap->setTerrainShadingEnabled( groupTerrainShading->isChecked() );
mMap->setIsDebugOverlayEnabled( mDebugOverlayCheckBox->isChecked() );
const std::unique_ptr< QgsAbstractMaterialSettings > terrainMaterial( widgetTerrainMaterial->settings() ); const std::unique_ptr< QgsAbstractMaterialSettings > terrainMaterial( widgetTerrainMaterial->settings() );
if ( QgsPhongMaterialSettings *phongMaterial = dynamic_cast< QgsPhongMaterialSettings * >( terrainMaterial.get() ) ) if ( QgsPhongMaterialSettings *phongMaterial = dynamic_cast< QgsPhongMaterialSettings * >( terrainMaterial.get() ) )
@ -405,11 +368,6 @@ void Qgs3DMapConfigWidget::apply()
viewSyncMode.setFlag( Qgis::ViewSyncModeFlag::Sync3DTo2D, mSync3DTo2DCheckbox->isChecked() ); viewSyncMode.setFlag( Qgis::ViewSyncModeFlag::Sync3DTo2D, mSync3DTo2DCheckbox->isChecked() );
mMap->setViewSyncMode( viewSyncMode ); mMap->setViewSyncMode( viewSyncMode );
mMap->setViewFrustumVisualizationEnabled( mVisualizeExtentCheckBox->isChecked() ); mMap->setViewFrustumVisualizationEnabled( mVisualizeExtentCheckBox->isChecked() );
mMap->setDebugDepthMapSettings( mDebugDepthMapGroupBox->isChecked(), static_cast<Qt::Corner>( mDebugDepthMapCornerComboBox->currentIndex() ), mDebugDepthMapSizeSpinBox->value() );
// Do not display the shadow debug map if the shadow effect is not enabled.
mMap->setDebugShadowMapSettings( mDebugShadowMapGroupBox->isChecked() && groupShadowRendering->isChecked(), static_cast<Qt::Corner>( mDebugShadowMapCornerComboBox->currentIndex() ), mDebugShadowMapSizeSpinBox->value() );
} }
void Qgs3DMapConfigWidget::onTerrainTypeChanged() void Qgs3DMapConfigWidget::onTerrainTypeChanged()

View File

@ -138,37 +138,4 @@ Qgs3DNavigationWidget::Qgs3DNavigationWidget( Qgs3DMapCanvas *canvas, QWidget *p
m3DMapCanvas->cameraController()->moveView( -1, 0 ); m3DMapCanvas->cameraController()->moveView( -1, 0 );
} }
); );
mCameraInfoItemModel = new QStandardItemModel( this );
mCameraInfoItemModel->appendRow( QList<QStandardItem *> { new QStandardItem( QStringLiteral( "Near plane" ) ), new QStandardItem } );
mCameraInfoItemModel->appendRow( QList<QStandardItem *> { new QStandardItem( QStringLiteral( "Far plane" ) ), new QStandardItem } );
mCameraInfoItemModel->appendRow( QList<QStandardItem *> { new QStandardItem( QStringLiteral( "Camera X pos" ) ), new QStandardItem } );
mCameraInfoItemModel->appendRow( QList<QStandardItem *> { new QStandardItem( QStringLiteral( "Camera Y pos" ) ), new QStandardItem } );
mCameraInfoItemModel->appendRow( QList<QStandardItem *> { new QStandardItem( QStringLiteral( "Camera Z pos" ) ), new QStandardItem } );
mCameraInfoItemModel->appendRow( QList<QStandardItem *> { new QStandardItem( QStringLiteral( "Looking at X" ) ), new QStandardItem } );
mCameraInfoItemModel->appendRow( QList<QStandardItem *> { new QStandardItem( QStringLiteral( "Looking at Y" ) ), new QStandardItem } );
mCameraInfoItemModel->appendRow( QList<QStandardItem *> { new QStandardItem( QStringLiteral( "Looking at Z" ) ), new QStandardItem } );
mCameraInfo->setModel( mCameraInfoItemModel );
mCameraInfo->verticalHeader()->hide();
mCameraInfo->horizontalHeader()->hide();
mCameraInfo->horizontalHeader()->setSectionResizeMode( QHeaderView::ResizeMode::Stretch );
QObject::connect( mCameraInfoCheckBox, &QCheckBox::clicked, m3DMapCanvas, [ = ]( bool enabled ) { mCameraInfo->setVisible( enabled ); } );
}
void Qgs3DNavigationWidget::updateFromCamera()
{
// Make sure the angle is between 0 - 359
whileBlocking( mCompass )->setValue( fmod( m3DMapCanvas->cameraController()->yaw() + 360, 360 ) );
mCameraInfoItemModel->setData( mCameraInfoItemModel->index( 0, 1 ), QStringLiteral( "%1" ).arg( m3DMapCanvas->cameraController()->camera()->nearPlane() ) );
mCameraInfoItemModel->setData( mCameraInfoItemModel->index( 1, 1 ), QStringLiteral( "%1" ).arg( m3DMapCanvas->cameraController()->camera()->farPlane() ) );
mCameraInfoItemModel->setData( mCameraInfoItemModel->index( 2, 1 ), QStringLiteral( "%1" ).arg( m3DMapCanvas->cameraController()->camera()->position().x() ) );
mCameraInfoItemModel->setData( mCameraInfoItemModel->index( 3, 1 ), QStringLiteral( "%1" ).arg( m3DMapCanvas->cameraController()->camera()->position().y() ) );
mCameraInfoItemModel->setData( mCameraInfoItemModel->index( 4, 1 ), QStringLiteral( "%1" ).arg( m3DMapCanvas->cameraController()->camera()->position().z() ) );
mCameraInfoItemModel->setData( mCameraInfoItemModel->index( 5, 1 ), QStringLiteral( "%1" ).arg( m3DMapCanvas->cameraController()->lookingAtPoint().x() ) );
mCameraInfoItemModel->setData( mCameraInfoItemModel->index( 6, 1 ), QStringLiteral( "%1" ).arg( m3DMapCanvas->cameraController()->lookingAtPoint().y() ) );
mCameraInfoItemModel->setData( mCameraInfoItemModel->index( 7, 1 ), QStringLiteral( "%1" ).arg( m3DMapCanvas->cameraController()->lookingAtPoint().z() ) );
} }

View File

@ -29,16 +29,8 @@ class Qgs3DNavigationWidget : public QWidget, private Ui::Q3DNavigationWidget
public: public:
Qgs3DNavigationWidget( Qgs3DMapCanvas *canvas, QWidget *parent = nullptr ); Qgs3DNavigationWidget( Qgs3DMapCanvas *canvas, QWidget *parent = nullptr );
public slots:
/**
* Update the state of navigation widget from camera's state
*/
void updateFromCamera();
private: private:
Qgs3DMapCanvas *m3DMapCanvas = nullptr; Qgs3DMapCanvas *m3DMapCanvas = nullptr;
QStandardItemModel *mCameraInfoItemModel = nullptr;
}; };
#endif // QGS3DNAVIGATIONWIDGET_H #endif // QGS3DNAVIGATIONWIDGET_H

View File

@ -379,6 +379,7 @@ if (WITH_3D)
3d/qgspointcloudlayer3drendererwidget.cpp 3d/qgspointcloudlayer3drendererwidget.cpp
3d/qgs3dmapcanvaswidget.cpp 3d/qgs3dmapcanvaswidget.cpp
3d/qgs3dviewsmanagerdialog.cpp 3d/qgs3dviewsmanagerdialog.cpp
3d/qgs3ddebugwidget.cpp
) )
endif() endif()

362
src/ui/3d/3ddebugwidget.ui Normal file
View File

@ -0,0 +1,362 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Q3DDebugWidget</class>
<widget class="QWidget" name="Q3DDebugWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>283</width>
<height>452</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string notr="true">Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>250</width>
<height>792</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QCheckBox" name="chkShowTileInfo">
<property name="text">
<string>Show map tile info</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkShowBoundingBoxes">
<property name="text">
<string>Show bounding boxes</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkShowCameraViewCenter">
<property name="text">
<string>Show camera's view center</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkShowCameraRotationCenter">
<property name="text">
<string>Show camera's rotation center</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkShowLightSourceOrigins">
<property name="text">
<string>Show light sources</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkStopUpdates">
<property name="text">
<string>Stop scene updates</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkDebugOverlay">
<property name="visible">
<bool>true</bool>
</property>
<property name="text">
<string>Show debug overlay</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="mDebugShadowMapGroupBox">
<property name="title">
<string>Debug Shadow Map</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_10">
<item row="0" column="1">
<widget class="QComboBox" name="mDebugShadowMapCornerComboBox"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="lblDebugShadowMapCorner">
<property name="text">
<string>Corner</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lblDebugShadowMapSize">
<property name="text">
<string>Size</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDoubleSpinBox" name="mDebugShadowMapSizeSpinBox">
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>0.100000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="mDebugDepthMapGroupBox">
<property name="title">
<string>Debug Depth Map</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="1">
<widget class="QComboBox" name="mDebugDepthMapCornerComboBox"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lblDebugDepthMapSize">
<property name="text">
<string>Size</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="lblDebugDepthMapCorner">
<property name="text">
<string>Corner</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDoubleSpinBox" name="mDebugDepthMapSizeSpinBox">
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>0.100000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="mCameraInfoGroupBox">
<property name="title">
<string>Show camera info</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item row="12" column="1">
<widget class="QDoubleSpinBox" name="mCameraZ">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="lblLookingX">
<property name="text">
<string>Looking at X</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="lblLookingY">
<property name="text">
<string>Looking at Y</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QDoubleSpinBox" name="mNearPlane">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::UpDownArrows</enum>
</property>
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QDoubleSpinBox" name="mFarPlane">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::UpDownArrows</enum>
</property>
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="lblCameraX">
<property name="text">
<string>Camera X pos</string>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="lblCameraY">
<property name="text">
<string>Camera Y pos</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QDoubleSpinBox" name="mCameraX">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="lblFarPlane">
<property name="text">
<string>Far plane</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="lblCameraZ">
<property name="text">
<string>Camera Z pos</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="lblNearPlane">
<property name="text">
<string>Near plane</string>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QDoubleSpinBox" name="mCameraY">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="lblLookingZ">
<property name="text">
<string>Looking at Z</string>
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QDoubleSpinBox" name="mLookingX">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="14" column="1">
<widget class="QDoubleSpinBox" name="mLookingY">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
<item row="15" column="1">
<widget class="QDoubleSpinBox" name="mLookingZ">
<property name="decimals">
<number>6</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header>qgsdoublespinbox.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -26,9 +26,6 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>2</number> <number>2</number>
</property> </property>
<property name="alignment">
<set>Qt::AlignTop</set>
</property>
<item> <item>
<layout class="QGridLayout" name="compassLayout"> <layout class="QGridLayout" name="compassLayout">
<property name="topMargin"> <property name="topMargin">
@ -36,11 +33,15 @@
</property> </property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QToolButton" name="mMoveUpButton"> <widget class="QToolButton" name="mMoveUpButton">
<property name="toolTip">
<string>Move up</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="toolTip"> <property name="icon">
<string>Move up</string> <iconset>
<normaloff>:/images/themes/default/mActionArrowUp.svg</normaloff>:/images/themes/default/mActionArrowUp.svg</iconset>
</property> </property>
<property name="autoRepeat"> <property name="autoRepeat">
<bool>true</bool> <bool>true</bool>
@ -48,22 +49,19 @@
<property name="autoRaise"> <property name="autoRaise">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mActionArrowUp.svg</normaloff>:/images/themes/default/mActionArrowUp.svg</iconset>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QToolButton" name="mZoomInButton"> <widget class="QToolButton" name="mZoomInButton">
<property name="toolTip"> <property name="toolTip">
<string/> <string>Zoom In</string>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="toolTip"> <property name="icon">
<string>Zoom In</string> <iconset>
<normaloff>:/images/themes/default/mActionZoomIn.svg</normaloff>:/images/themes/default/mActionZoomIn.svg</iconset>
</property> </property>
<property name="autoRepeat"> <property name="autoRepeat">
<bool>true</bool> <bool>true</bool>
@ -71,19 +69,19 @@
<property name="autoRaise"> <property name="autoRaise">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mActionZoomIn.svg</normaloff>:/images/themes/default/mActionZoomIn.svg</iconset>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="1" alignment="Qt::AlignHCenter"> <item row="0" column="1" alignment="Qt::AlignHCenter">
<widget class="QToolButton" name="mTiltUpButton"> <widget class="QToolButton" name="mTiltUpButton">
<property name="toolTip">
<string>Tilt up</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="toolTip"> <property name="icon">
<string>Tilt up</string> <iconset>
<normaloff>:/images/themes/default/mActionTiltUp.svg</normaloff>:/images/themes/default/mActionTiltUp.svg</iconset>
</property> </property>
<property name="autoRepeat"> <property name="autoRepeat">
<bool>true</bool> <bool>true</bool>
@ -91,19 +89,19 @@
<property name="autoRaise"> <property name="autoRaise">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mActionTiltUp.svg</normaloff>:/images/themes/default/mActionTiltUp.svg</iconset>
</property>
</widget> </widget>
</item> </item>
<item row="1" column="0" alignment="Qt::AlignVCenter"> <item row="1" column="0" alignment="Qt::AlignVCenter">
<widget class="QToolButton" name="mMoveLeftButton"> <widget class="QToolButton" name="mMoveLeftButton">
<property name="toolTip">
<string>Move left</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="toolTip"> <property name="icon">
<string>Move left</string> <iconset>
<normaloff>:/images/themes/default/mActionArrowLeft.svg</normaloff>:/images/themes/default/mActionArrowLeft.svg</iconset>
</property> </property>
<property name="autoRepeat"> <property name="autoRepeat">
<bool>true</bool> <bool>true</bool>
@ -111,10 +109,6 @@
<property name="autoRaise"> <property name="autoRaise">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mActionArrowLeft.svg</normaloff>:/images/themes/default/mActionArrowLeft.svg</iconset>
</property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
@ -132,11 +126,15 @@
</item> </item>
<item row="1" column="2" alignment="Qt::AlignVCenter"> <item row="1" column="2" alignment="Qt::AlignVCenter">
<widget class="QToolButton" name="mMoveRightButton"> <widget class="QToolButton" name="mMoveRightButton">
<property name="toolTip">
<string>Move right</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="toolTip"> <property name="icon">
<string>Move right</string> <iconset>
<normaloff>:/images/themes/default/mActionArrowRight.svg</normaloff>:/images/themes/default/mActionArrowRight.svg</iconset>
</property> </property>
<property name="autoRepeat"> <property name="autoRepeat">
<bool>true</bool> <bool>true</bool>
@ -144,19 +142,19 @@
<property name="autoRaise"> <property name="autoRaise">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mActionArrowRight.svg</normaloff>:/images/themes/default/mActionArrowRight.svg</iconset>
</property>
</widget> </widget>
</item> </item>
<item row="2" column="2"> <item row="2" column="2">
<widget class="QToolButton" name="mZoomOutButton"> <widget class="QToolButton" name="mZoomOutButton">
<property name="toolTip">
<string>Zoom Out</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="toolTip"> <property name="icon">
<string>Zoom Out</string> <iconset>
<normaloff>:/images/themes/default/mActionZoomOut.svg</normaloff>:/images/themes/default/mActionZoomOut.svg</iconset>
</property> </property>
<property name="autoRepeat"> <property name="autoRepeat">
<bool>true</bool> <bool>true</bool>
@ -164,19 +162,19 @@
<property name="autoRaise"> <property name="autoRaise">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mActionZoomOut.svg</normaloff>:/images/themes/default/mActionZoomOut.svg</iconset>
</property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QToolButton" name="mMoveDownButton"> <widget class="QToolButton" name="mMoveDownButton">
<property name="toolTip">
<string>Move down</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="toolTip"> <property name="icon">
<string>Move down</string> <iconset>
<normaloff>:/images/themes/default/mActionArrowDown.svg</normaloff>:/images/themes/default/mActionArrowDown.svg</iconset>
</property> </property>
<property name="autoRepeat"> <property name="autoRepeat">
<bool>true</bool> <bool>true</bool>
@ -184,19 +182,19 @@
<property name="autoRaise"> <property name="autoRaise">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mActionArrowDown.svg</normaloff>:/images/themes/default/mActionArrowDown.svg</iconset>
</property>
</widget> </widget>
</item> </item>
<item row="2" column="1" alignment="Qt::AlignHCenter"> <item row="2" column="1" alignment="Qt::AlignHCenter">
<widget class="QToolButton" name="mTiltDownButton"> <widget class="QToolButton" name="mTiltDownButton">
<property name="toolTip">
<string>Tilt down</string>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
<property name="toolTip"> <property name="icon">
<string>Tilt down</string> <iconset>
<normaloff>:/images/themes/default/mActionTiltDown.svg</normaloff>:/images/themes/default/mActionTiltDown.svg</iconset>
</property> </property>
<property name="autoRepeat"> <property name="autoRepeat">
<bool>true</bool> <bool>true</bool>
@ -204,43 +202,22 @@
<property name="autoRaise"> <property name="autoRaise">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mActionTiltDown.svg</normaloff>:/images/themes/default/mActionTiltDown.svg</iconset>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="cameraInfoLayout" stretch="0,0"> <spacer name="verticalSpacer">
<property name="topMargin"> <property name="orientation">
<number>0</number> <enum>Qt::Vertical</enum>
</property> </property>
<property name="bottomMargin"> <property name="sizeHint" stdset="0">
<number>0</number> <size>
<width>20</width>
<height>40</height>
</size>
</property> </property>
<item> </spacer>
<widget class="QCheckBox" name="mCameraInfoCheckBox">
<property name="text">
<string>Show camera info (for debugging)</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="mCameraInfo">
<property name="visible">
<bool>false</bool>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@ -217,8 +217,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>818</width> <width>100</width>
<height>649</height> <height>30</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_7"> <layout class="QVBoxLayout" name="verticalLayout_7">
@ -963,53 +963,46 @@
<string>Advanced Settings</string> <string>Advanced Settings</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_11"> <layout class="QGridLayout" name="gridLayout_11">
<item row="2" column="0">
<widget class="QGroupBox" name="mDebugDepthMapGroupBox">
<property name="title">
<string>Debug Depth Map</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="1">
<widget class="QComboBox" name="mDebugDepthMapCornerComboBox"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Size</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Corner</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDoubleSpinBox" name="mDebugDepthMapSizeSpinBox">
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>0.100000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<layout class="QGridLayout" name="gridLayoutAdvanced"> <layout class="QGridLayout" name="gridLayoutAdvanced">
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Max. screen error</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Max. ground error</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsSpinBox" name="spinMapResolution">
<property name="suffix">
<string> px</string>
</property>
<property name="maximum">
<number>4096</number>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QCheckBox" name="mFpsCounterCheckBox">
<property name="text">
<string>Show frames per second (FPS)</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="chkShowLabels">
<property name="text">
<string>Show labels</string>
</property>
</widget>
</item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QgsDoubleSpinBox" name="spinGroundError"> <widget class="QgsDoubleSpinBox" name="spinGroundError">
<property name="suffix"> <property name="suffix">
@ -1029,13 +1022,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="0" colspan="2">
<widget class="QCheckBox" name="chkShowBoundingBoxes">
<property name="text">
<string>Show bounding boxes</string>
</property>
</widget>
</item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLabel" name="labelZoomLevels"> <widget class="QLabel" name="labelZoomLevels">
<property name="text"> <property name="text">
@ -1043,89 +1029,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Map tile resolution</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QCheckBox" name="chkShowCameraRotationCenter">
<property name="text">
<string>Show camera's rotation center</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsSpinBox" name="spinMapResolution">
<property name="suffix">
<string> px</string>
</property>
<property name="maximum">
<number>4096</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Max. screen error</string>
</property>
</widget>
</item>
<item row="11" column="0" colspan="2">
<widget class="QCheckBox" name="mFpsCounterCheckBox">
<property name="text">
<string>Show frames per second (FPS)</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Zoom levels</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QCheckBox" name="chkShowLabels">
<property name="text">
<string>Show labels</string>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<widget class="QCheckBox" name="chkShowCameraViewCenter">
<property name="text">
<string>Show camera's view center</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QCheckBox" name="chkShowTileInfo">
<property name="text">
<string>Show map tile info</string>
</property>
</widget>
</item>
<item row="13" column="0" colspan="2">
<widget class="QCheckBox" name="mDebugOverlayCheckBox">
<property name="visible">
<bool>false</bool>
</property>
<property name="text">
<string>Show debug overlay</string>
</property>
</widget>
</item>
<item row="10" column="0" colspan="2">
<widget class="QCheckBox" name="chkShowLightSourceOrigins">
<property name="text">
<string>Show light sources</string>
</property>
</widget>
</item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QgsDoubleSpinBox" name="spinScreenError"> <widget class="QgsDoubleSpinBox" name="spinScreenError">
<property name="suffix"> <property name="suffix">
@ -1136,68 +1039,23 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Max. ground error</string> <string>Map tile resolution</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="12" column="0"> <item row="3" column="0">
<widget class="QCheckBox" name="chkStopUpdates"> <widget class="QLabel" name="label_7">
<property name="text"> <property name="text">
<string>Stop scene updates</string> <string>Zoom levels</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QGroupBox" name="mDebugShadowMapGroupBox">
<property name="title">
<string>Debug Shadow Map</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_10">
<item row="0" column="1">
<widget class="QComboBox" name="mDebugShadowMapCornerComboBox"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Corner</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Size</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDoubleSpinBox" name="mDebugShadowMapSizeSpinBox">
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>0.100000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<spacer name="verticalSpacerAdvanced"> <spacer name="verticalSpacerAdvanced">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
@ -1304,20 +1162,10 @@
<tabstop>spinScreenError</tabstop> <tabstop>spinScreenError</tabstop>
<tabstop>spinGroundError</tabstop> <tabstop>spinGroundError</tabstop>
<tabstop>chkShowLabels</tabstop> <tabstop>chkShowLabels</tabstop>
<tabstop>chkShowTileInfo</tabstop>
<tabstop>chkShowBoundingBoxes</tabstop>
<tabstop>chkShowCameraViewCenter</tabstop>
<tabstop>chkShowLightSourceOrigins</tabstop>
<tabstop>mFpsCounterCheckBox</tabstop> <tabstop>mFpsCounterCheckBox</tabstop>
<tabstop>edlGroupBox</tabstop> <tabstop>edlGroupBox</tabstop>
<tabstop>edlStrengthSpinBox</tabstop> <tabstop>edlStrengthSpinBox</tabstop>
<tabstop>edlDistanceSpinBox</tabstop> <tabstop>edlDistanceSpinBox</tabstop>
<tabstop>mDebugShadowMapGroupBox</tabstop>
<tabstop>mDebugShadowMapCornerComboBox</tabstop>
<tabstop>mDebugShadowMapSizeSpinBox</tabstop>
<tabstop>mDebugDepthMapGroupBox</tabstop>
<tabstop>mDebugDepthMapCornerComboBox</tabstop>
<tabstop>mDebugDepthMapSizeSpinBox</tabstop>
</tabstops> </tabstops>
<resources> <resources>
<include location="../../../images/images.qrc"/> <include location="../../../images/images.qrc"/>