Skip to content

Commit

Permalink
Add global 3d setting to control whether vertical mouse axis movement…
Browse files Browse the repository at this point in the history
…s should be inverted
  • Loading branch information
nyalldawson committed Jan 14, 2021
1 parent 553c747 commit 7fa38ce
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 21 deletions.
30 changes: 28 additions & 2 deletions src/3d/qgscameracontroller.cpp
Expand Up @@ -76,6 +76,11 @@ void QgsCameraController::setCameraMovementSpeed( double movementSpeed )
mCameraMovementSpeed = movementSpeed;
}

void QgsCameraController::setVerticalAxisInversion( QgsCameraController::VerticalAxisInversion inversion )
{
mVerticalAxisInversion = inversion;
}

void QgsCameraController::setTerrainEntity( QgsTerrainEntity *te )
{
mTerrainEntity = te;
Expand Down Expand Up @@ -626,7 +631,18 @@ void QgsCameraController::onPositionChangedFlyNavigation( Qt3DInput::QMouseEvent

if ( mPressedButton != Qt3DInput::QMouseEvent::RightButton )
{
float diffPitch = -1 * 0.2f * dy;
float diffPitch = -0.2f * dy;
switch ( mVerticalAxisInversion )
{
case Always:
diffPitch *= -1;
break;

case WhenDragging:
case Never:
break;
}

float diffYaw = - 0.2f * dx;
rotateCamera( diffPitch, diffYaw );
updateCameraFromPose( false );
Expand All @@ -651,7 +667,17 @@ void QgsCameraController::onPositionChangedFlyNavigation( Qt3DInput::QMouseEvent

if ( mPressedButton == Qt3DInput::QMouseEvent::LeftButton || mPressedButton == Qt3DInput::QMouseEvent::MiddleButton )
{
float diffPitch = 0.2f * dy;
float diffPitch = -0.2f * dy;
switch ( mVerticalAxisInversion )
{
case Always:
case WhenDragging:
diffPitch *= -1;
break;

case Never:
break;
}
float diffYaw = - 0.2f * dx;
rotateCamera( diffPitch, diffYaw );
updateCameraFromPose( false );
Expand Down
30 changes: 26 additions & 4 deletions src/3d/qgscameracontroller.h
Expand Up @@ -67,11 +67,20 @@ class _3D_EXPORT QgsCameraController : public Qt3DCore::QEntity
//! The navigation mode used by the camera
enum NavigationMode
{
TerrainBasedNavigation, //! The default navigation based on the terrain
WalkNavigation //! Uses WASD keys or arrows to navigate in walking (first person) manner
TerrainBasedNavigation, //!< The default navigation based on the terrain
WalkNavigation //!< Uses WASD keys or arrows to navigate in walking (first person) manner
};
Q_ENUM( NavigationMode )

//! Vertical axis inversion options
enum VerticalAxisInversion
{
Never, //!< Never invert vertical axis movements
WhenDragging, //!< Invert vertical axis movements when dragging in first person modes
Always, //!< Always invert vertical axis movements
};
Q_ENUM( VerticalAxisInversion )

public:
//! Constructs the camera controller with optional parent node that will take ownership
QgsCameraController( Qt3DCore::QNode *parent = nullptr );
Expand All @@ -82,13 +91,13 @@ class _3D_EXPORT QgsCameraController : public Qt3DCore::QEntity
QRect viewport() const { return mViewport; }

/**
* Returns the nvigtion mode used by the camera controller
* Returns the navigation mode used by the camera controller.
* \since QGIS 3.18
*/
QgsCameraController::NavigationMode cameraNavigationMode() const { return mCameraNavigationMode; }

/**
* Sets the nvigtion mode used by the camera controller
* Sets the navigation mode used by the camera controller.
* \since QGIS 3.18
*/
void setCameraNavigationMode( QgsCameraController::NavigationMode navigationMode );
Expand All @@ -105,6 +114,18 @@ class _3D_EXPORT QgsCameraController : public Qt3DCore::QEntity
*/
void setCameraMovementSpeed( double movementSpeed );

/**
* Returns the vertical axis inversion behavior.
* \since QGIS 3.18
*/
QgsCameraController::VerticalAxisInversion verticalAxisInversion() const { return mVerticalAxisInversion; }

/**
* Sets the vertical axis \a inversion behavior.
* \since QGIS 3.18
*/
void setVerticalAxisInversion( QgsCameraController::VerticalAxisInversion inversion );

/**
* Connects to object picker attached to terrain entity. Called internally from 3D scene.
* This allows camera controller understand how far from the camera is the terrain under mouse cursor.
Expand Down Expand Up @@ -243,6 +264,7 @@ class _3D_EXPORT QgsCameraController : public Qt3DCore::QEntity
Qt3DInput::QMouseHandler *mMouseHandler = nullptr;
Qt3DInput::QKeyboardHandler *mKeyboardHandler = nullptr;
NavigationMode mCameraNavigationMode = NavigationMode::TerrainBasedNavigation;
VerticalAxisInversion mVerticalAxisInversion = WhenDragging;
double mCameraMovementSpeed = 5.0;

QSet< int > mDepressedKeys;
Expand Down
8 changes: 8 additions & 0 deletions src/app/3d/qgs3doptions.cpp
Expand Up @@ -38,13 +38,20 @@ Qgs3DOptionsWidget::Qgs3DOptionsWidget( QWidget *parent )
cboCameraProjectionType->addItem( tr( "Perspective Projection" ), Qt3DRender::QCameraLens::PerspectiveProjection );
cboCameraProjectionType->addItem( tr( "Orthogonal Projection" ), Qt3DRender::QCameraLens::OrthographicProjection );

mInvertVerticalAxisCombo->addItem( tr( "Never" ), QgsCameraController::Never );
mInvertVerticalAxisCombo->addItem( tr( "Only When Dragging" ), QgsCameraController::WhenDragging );
mInvertVerticalAxisCombo->addItem( tr( "Always" ), QgsCameraController::Always );

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 QgsCameraController::VerticalAxisInversion axisInversion = settings.enumValue( QStringLiteral( "map3d/axisInversion" ), QgsCameraController::WhenDragging, QgsSettings::App );
mInvertVerticalAxisCombo->setCurrentIndex( mInvertVerticalAxisCombo->findData( static_cast< int >( axisInversion ) ) );

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

Expand All @@ -56,6 +63,7 @@ void Qgs3DOptionsWidget::apply()
{
QgsSettings settings;
settings.setValue( QStringLiteral( "map3d/defaultNavigation" ), static_cast< QgsCameraController::NavigationMode >( mCameraNavigationModeCombo->currentData().toInt() ), QgsSettings::App );
settings.setValue( QStringLiteral( "map3d/axisInversion" ), static_cast< QgsCameraController::VerticalAxisInversion >( mInvertVerticalAxisCombo->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 );
Expand Down
5 changes: 5 additions & 0 deletions src/app/qgisapp.cpp
Expand Up @@ -13315,6 +13315,7 @@ void QgisApp::new3DMapCanvas()

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 );
Expand Down Expand Up @@ -13342,6 +13343,10 @@ void QgisApp::new3DMapCanvas()
QgsRectangle extent = mMapCanvas->extent();
float dist = static_cast< float >( std::max( extent.width(), extent.height() ) );
dock->mapCanvas3D()->setViewFromTop( mMapCanvas->extent().center(), dist, static_cast< float >( mMapCanvas->rotation() ) );

const QgsCameraController::VerticalAxisInversion axisInversion = settings.enumValue( QStringLiteral( "map3d/axisInversion" ), QgsCameraController::WhenDragging, QgsSettings::App );
if ( dock->mapCanvas3D()->cameraController() )
dock->mapCanvas3D()->cameraController()->setVerticalAxisInversion( axisInversion );
}
#endif
}
Expand Down
40 changes: 25 additions & 15 deletions src/ui/3d/qgs3doptionsbase.ui
Expand Up @@ -69,12 +69,8 @@
<string>Default Camera Settings</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QLabel" name="labelCameraProjectionType">
<property name="text">
<string>Projection type</string>
</property>
</widget>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="cboCameraProjectionType"/>
</item>
<item row="2" column="1" colspan="2">
<widget class="QgsSpinBox" name="spinCameraFieldOfView">
Expand All @@ -86,20 +82,17 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelFieldofView">
<item row="1" column="0">
<widget class="QLabel" name="labelCameraProjectionType">
<property name="text">
<string>Field of View</string>
<string>Projection type</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="cboCameraProjectionType"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelCameraNavigationMode">
<item row="2" column="0">
<widget class="QLabel" name="labelFieldofView">
<property name="text">
<string>Navigation mode</string>
<string>Field of View</string>
</property>
</widget>
</item>
Expand All @@ -119,13 +112,30 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelCameraNavigationMode">
<property name="text">
<string>Navigation mode</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelMovementSpeed">
<property name="text">
<string>Movement speed</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labelCameraNavigationMode_2">
<property name="text">
<string>Invert vertical axis</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QComboBox" name="mInvertVerticalAxisCombo"/>
</item>
</layout>
</widget>
</item>
Expand Down

0 comments on commit 7fa38ce

Please sign in to comment.