Skip to content

Commit

Permalink
[3d] Add general 3d options tab, with settings for default camera
Browse files Browse the repository at this point in the history
projection types and movement options

These settings are inherited by all new 3d views
  • Loading branch information
nyalldawson committed Jan 14, 2021
1 parent a630ef4 commit 553c747
Show file tree
Hide file tree
Showing 10 changed files with 335 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/3d/qgscameracontroller.cpp
Expand Up @@ -17,6 +17,7 @@
#include "qgsraycastingutils_p.h"
#include "qgsterrainentity_p.h"
#include "qgsvector3d.h"
#include "qgssettings.h"

#include "qgis.h"

Expand All @@ -35,7 +36,6 @@ QgsCameraController::QgsCameraController( Qt3DCore::QNode *parent )
, mMouseHandler( new Qt3DInput::QMouseHandler )
, mKeyboardHandler( new Qt3DInput::QKeyboardHandler )
{

mMouseHandler->setSourceDevice( mMouseDevice );
connect( mMouseHandler, &Qt3DInput::QMouseHandler::positionChanged,
this, &QgsCameraController::onPositionChanged );
Expand Down
1 change: 1 addition & 0 deletions src/3d/qgscameracontroller.h
Expand Up @@ -70,6 +70,7 @@ class _3D_EXPORT QgsCameraController : public Qt3DCore::QEntity
TerrainBasedNavigation, //! The default navigation based on the terrain
WalkNavigation //! Uses WASD keys or arrows to navigate in walking (first person) manner
};
Q_ENUM( NavigationMode )

public:
//! Constructs the camera controller with optional parent node that will take ownership
Expand Down
5 changes: 3 additions & 2 deletions src/app/3d/qgs3dmapconfigwidget.cpp
Expand Up @@ -73,13 +73,14 @@ Qgs3DMapConfigWidget::Qgs3DMapConfigWidget( Qgs3DMapSettings *map, QgsMapCanvas
mMeshSymbolWidget = new QgsMesh3dSymbolWidget( nullptr, groupMeshTerrainShading );
mMeshSymbolWidget->configureForTerrain();

cboCameraProjectionType->addItem( tr( "Perspective projection" ), Qt3DRender::QCameraLens::PerspectiveProjection );
cboCameraProjectionType->addItem( tr( "Orthogonal projection" ), Qt3DRender::QCameraLens::OrthographicProjection );
cboCameraProjectionType->addItem( tr( "Perspective Projection" ), Qt3DRender::QCameraLens::PerspectiveProjection );
cboCameraProjectionType->addItem( tr( "Orthogonal Projection" ), Qt3DRender::QCameraLens::OrthographicProjection );
connect( cboCameraProjectionType, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, [ = ]()
{
spinCameraFieldOfView->setEnabled( cboCameraProjectionType->currentIndex() == cboCameraProjectionType->findData( Qt3DRender::QCameraLens::PerspectiveProjection ) );
} );

mCameraMovementSpeed->setClearValue( 4 );
spinCameraFieldOfView->setClearValue( 45.0 );
spinTerrainScale->setClearValue( 1.0 );
spinTerrainResolution->setClearValue( 16 );
Expand Down
82 changes: 82 additions & 0 deletions src/app/3d/qgs3doptions.cpp
@@ -0,0 +1,82 @@
/***************************************************************************
qgs3doptions.cpp
-------------------------
begin : January 2021
copyright : (C) 2021 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* 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 "qgs3doptions.h"
#include "qgsapplication.h"
#include "qgssettings.h"
#include "qgis.h"
#include "qgsgui.h"
#include "qgscameracontroller.h"
#include <Qt3DRender/QCamera>

//
// QgsCodeEditorOptionsWidget
//

Qgs3DOptionsWidget::Qgs3DOptionsWidget( QWidget *parent )
: QgsOptionsPageWidget( parent )
{
setupUi( this );

layout()->setContentsMargins( 0, 0, 0, 0 );

mCameraNavigationModeCombo->addItem( tr( "Terrain Based" ), QgsCameraController::TerrainBasedNavigation );
mCameraNavigationModeCombo->addItem( tr( "Walk Mode (First Person)" ), QgsCameraController::WalkNavigation );

cboCameraProjectionType->addItem( tr( "Perspective Projection" ), Qt3DRender::QCameraLens::PerspectiveProjection );
cboCameraProjectionType->addItem( tr( "Orthogonal Projection" ), Qt3DRender::QCameraLens::OrthographicProjection );

mCameraMovementSpeed->setClearValue( 4 );
spinCameraFieldOfView->setClearValue( 45.0 );

QgsSettings settings;
const QgsCameraController::NavigationMode defaultNavMode = settings.enumValue( QStringLiteral( "map3d/defaultNavigation" ), QgsCameraController::TerrainBasedNavigation, QgsSettings::App );
mCameraNavigationModeCombo->setCurrentIndex( mCameraNavigationModeCombo->findData( static_cast< int >( defaultNavMode ) ) );

const Qt3DRender::QCameraLens::ProjectionType defaultProjection = settings.enumValue( QStringLiteral( "map3d/defaultProjection" ), Qt3DRender::QCameraLens::PerspectiveProjection, QgsSettings::App );
cboCameraProjectionType->setCurrentIndex( cboCameraProjectionType->findData( static_cast< int >( defaultProjection ) ) );

mCameraMovementSpeed->setValue( settings.value( QStringLiteral( "map3d/defaultMovementSpeed" ), 5, QgsSettings::App ).toDouble() );
spinCameraFieldOfView->setValue( settings.value( QStringLiteral( "map3d/defaultFieldOfView" ), 45, QgsSettings::App ).toInt() );
}

void Qgs3DOptionsWidget::apply()
{
QgsSettings settings;
settings.setValue( QStringLiteral( "map3d/defaultNavigation" ), static_cast< QgsCameraController::NavigationMode >( mCameraNavigationModeCombo->currentData().toInt() ), QgsSettings::App );
settings.setValue( QStringLiteral( "map3d/defaultProjection" ), static_cast< Qt3DRender::QCameraLens::ProjectionType >( cboCameraProjectionType->currentData().toInt() ), QgsSettings::App );
settings.setValue( QStringLiteral( "map3d/defaultMovementSpeed" ), mCameraMovementSpeed->value(), QgsSettings::App );
settings.setValue( QStringLiteral( "map3d/defaultFieldOfView" ), spinCameraFieldOfView->value(), QgsSettings::App );
}


//
// Qgs3DOptionsFactory
//
Qgs3DOptionsFactory::Qgs3DOptionsFactory()
: QgsOptionsWidgetFactory( tr( "3D" ), QIcon() )
{

}

QIcon Qgs3DOptionsFactory::icon() const
{
return QgsApplication::getThemeIcon( QStringLiteral( "/3d.svg" ) );
}

QgsOptionsPageWidget *Qgs3DOptionsFactory::createWidget( QWidget *parent ) const
{
return new Qgs3DOptionsWidget( parent );
}
59 changes: 59 additions & 0 deletions src/app/3d/qgs3doptions.h
@@ -0,0 +1,59 @@
/***************************************************************************
qgs3doptions.h
-------------------------
begin : January 2021
copyright : (C) 2021 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* 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 QGS3DOPTIONS_H
#define QGS3DOPTIONS_H

#include "ui_qgs3doptionsbase.h"
#include "qgsoptionswidgetfactory.h"
#include "qgscodeeditor.h"

/**
* \ingroup app
* \class Qgs3DOptionsWidget
* \brief An options widget showing 3D settings.
*
* \since QGIS 3.18
*/
class Qgs3DOptionsWidget : public QgsOptionsPageWidget, private Ui::Qgs3DOptionsBase
{
Q_OBJECT

public:

/**
* Constructor for Qgs3DOptionsWidget with the specified \a parent widget.
*/
Qgs3DOptionsWidget( QWidget *parent );

void apply() override;

};


class Qgs3DOptionsFactory : public QgsOptionsWidgetFactory
{
Q_OBJECT

public:

Qgs3DOptionsFactory();

QIcon icon() const override;
QgsOptionsPageWidget *createWidget( QWidget *parent = nullptr ) const override;

};


#endif // QGS3DOPTIONS_H
1 change: 1 addition & 0 deletions src/app/CMakeLists.txt
Expand Up @@ -271,6 +271,7 @@ if (WITH_3D)
3d/qgs3dmeasuredialog.cpp
3d/qgs3dmodelsourcelineedit.cpp
3d/qgs3dnavigationwidget.cpp
3d/qgs3doptions.cpp
3d/qgsgoochmaterialwidget.cpp
3d/qgslightswidget.cpp
3d/qgsline3dsymbolwidget.cpp
Expand Down
16 changes: 15 additions & 1 deletion src/app/qgisapp.cpp
Expand Up @@ -118,6 +118,7 @@
#include "qgsmeshlayer3drendererwidget.h"
#include "qgspointcloudlayer3drendererwidget.h"
#include "qgs3dapputils.h"
#include "qgs3doptions.h"
#endif

#ifdef HAVE_GEOREFERENCER
Expand Down Expand Up @@ -1723,7 +1724,11 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh
} );

mCodeEditorWidgetFactory.reset( qgis::make_unique< QgsCodeEditorOptionsFactory >() );
} // QgisApp ctor

#ifdef HAVE_3D
m3DOptionsWidgetFactory.reset( qgis::make_unique< Qgs3DOptionsFactory >() );
#endif
}

QgisApp::QgisApp()
: QMainWindow( nullptr, Qt::WindowFlags() )
Expand Down Expand Up @@ -13297,6 +13302,8 @@ void QgisApp::new3DMapCanvas()
{
setupDockWidget( dock, true );

QgsSettings settings;

Qgs3DMapSettings *map = new Qgs3DMapSettings;
map->setCrs( prj->crs() );
map->setOrigin( QgsVector3D( fullExtent.center().x(), fullExtent.center().y(), 0 ) );
Expand All @@ -13306,6 +13313,13 @@ void QgisApp::new3DMapCanvas()
map->setTerrainLayers( mMapCanvas->layers() );
map->setTemporalRange( mMapCanvas->temporalRange() );

const QgsCameraController::NavigationMode defaultNavMode = settings.enumValue( QStringLiteral( "map3d/defaultNavigation" ), QgsCameraController::TerrainBasedNavigation, QgsSettings::App );
map->setCameraNavigationMode( defaultNavMode );
map->setCameraMovementSpeed( settings.value( QStringLiteral( "map3d/defaultMovementSpeed" ), 5, QgsSettings::App ).toDouble() );
const Qt3DRender::QCameraLens::ProjectionType defaultProjection = settings.enumValue( QStringLiteral( "map3d/defaultProjection" ), Qt3DRender::QCameraLens::PerspectiveProjection, QgsSettings::App );
map->setProjectionType( defaultProjection );
map->setFieldOfView( settings.value( QStringLiteral( "map3d/defaultFieldOfView" ), 45, QgsSettings::App ).toInt() );

map->setTransformContext( QgsProject::instance()->transformContext() );
map->setPathResolver( QgsProject::instance()->pathResolver() );
map->setMapThemeCollection( QgsProject::instance()->mapThemeCollection() );
Expand Down
1 change: 1 addition & 0 deletions src/app/qgisapp.h
Expand Up @@ -2705,6 +2705,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
QgsScopedDevToolWidgetFactory mStartupProfilerWidgetFactory;

QgsScopedOptionsWidgetFactory mCodeEditorWidgetFactory;
QgsScopedOptionsWidgetFactory m3DOptionsWidgetFactory;

class QgsCanvasRefreshBlocker
{
Expand Down
6 changes: 3 additions & 3 deletions src/ui/3d/map3dconfigwidget.ui
Expand Up @@ -410,7 +410,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>98</width>
<width>77</width>
<height>47</height>
</rect>
</property>
Expand Down Expand Up @@ -584,7 +584,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>710</width>
<width>709</width>
<height>604</height>
</rect>
</property>
Expand Down Expand Up @@ -645,7 +645,7 @@
<widget class="QComboBox" name="mCameraNavigationModeCombo"/>
</item>
<item row="4" column="1" colspan="2">
<widget class="QDoubleSpinBox" name="mCameraMovementSpeed">
<widget class="QgsDoubleSpinBox" name="mCameraMovementSpeed">
<property name="minimum">
<double>0.010000000000000</double>
</property>
Expand Down

0 comments on commit 553c747

Please sign in to comment.