Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
skybox settings UI
  • Loading branch information
NEDJIMAbelgacem committed Aug 1, 2020
1 parent 3ddf03b commit f5726e5
Show file tree
Hide file tree
Showing 12 changed files with 262 additions and 65 deletions.
16 changes: 15 additions & 1 deletion python/3d/auto_generated/qgs3dmapsettings.sip.in
Expand Up @@ -15,7 +15,6 @@




class Qgs3DMapSettings : QObject, QgsTemporalRangeObject
{
%Docstring
Expand Down Expand Up @@ -434,6 +433,16 @@ Returns DPI used for conversion between real world units (e.g. mm) and pixels
Default value is 96

.. versionadded:: 3.10
%End

QgsSkyboxSettings skyboxSettings() const;
%Docstring
Returns the current configuration of the skybox
%End

void setSkyboxSettings( const QgsSkyboxSettings &skyboxSettings );
%Docstring
Sets the current configuration of the skybox
%End

signals:
Expand Down Expand Up @@ -538,6 +547,11 @@ Emitted when the list of directional lights changes
Emitted when the camera lens field of view changes

.. versionadded:: 3.8
%End

void skyboxSettingsChanged();
%Docstring
Emitted when skybox settings are changed
%End

private:
Expand Down
32 changes: 29 additions & 3 deletions src/3d/qgs3dmapscene.cpp
Expand Up @@ -122,6 +122,7 @@ Qgs3DMapScene::Qgs3DMapScene( const Qgs3DMapSettings &map, QgsAbstract3DEngine *
connect( &map, &Qgs3DMapSettings::showLightSourceOriginsChanged, this, &Qgs3DMapScene::updateLights );
connect( &map, &Qgs3DMapSettings::fieldOfViewChanged, this, &Qgs3DMapScene::updateCameraLens );
connect( &map, &Qgs3DMapSettings::renderersChanged, this, &Qgs3DMapScene::onRenderersChanged );
connect( &map, &Qgs3DMapSettings::skyboxSettingsChanged, this, &Qgs3DMapScene::onSkyboxSettingsChanged );

connect( QgsApplication::instance()->sourceCache(), &QgsSourceCache::remoteSourceFetched, this, [ = ]( const QString & url )
{
Expand Down Expand Up @@ -839,6 +840,10 @@ void Qgs3DMapScene::addCameraViewCenterEntity( Qt3DRender::QCamera *camera )
{
mEntityCameraViewCenter->setEnabled( mMap.showCameraViewCenter() );
} );
// connect( &mMap, &Qgs3DMapSettings, this, [this]
// {
// mEntityCameraViewCenter->setEnabled( mMap.showCameraViewCenter() );
// } );
}

void Qgs3DMapScene::setSceneState( Qgs3DMapScene::SceneState state )
Expand Down Expand Up @@ -869,16 +874,37 @@ void Qgs3DMapScene::updateSceneState()
setSceneState( Ready );
}

void Qgs3DMapScene::onSkyboxSettingsChanged( const QgsSkyboxSettings &settings )
void Qgs3DMapScene::onSkyboxSettingsChanged()
{
qDebug() << __FUNCTION__;
QgsSkyboxSettings skyboxSettings = mMap.skyboxSettings();
if ( mSkybox != nullptr )
{
delete mSkybox;
mSkybox = nullptr;
}
if ( settings.getIsSkyboxEnabled() )
if ( skyboxSettings.isSkyboxEnabled() )
{
// mSkybox = new QgsSkyboxEntity( settings.getSkyboxBaseName(), settings.getSkyboxExtension() );
qDebug() << skyboxSettings.skyboxType();
if ( skyboxSettings.skyboxType() == QStringLiteral( "Textures collection" ) )
{
qDebug() << "base name: " << skyboxSettings.skyboxBaseName();
qDebug() << "extension: " << skyboxSettings.skyboxExtension();
mSkybox = new QgsCubeFacesSkyboxEntity( skyboxSettings.skyboxBaseName(), skyboxSettings.skyboxExtension(), this );
}
if ( skyboxSettings.skyboxType() == QStringLiteral( "HDR texture" ) )
{
qDebug() << "texture path: " << skyboxSettings.hdrTexturePath();
mSkybox = new QgsHDRSkyboxEntity( skyboxSettings.hdrTexturePath(), this );
}
if ( skyboxSettings.skyboxType() == QStringLiteral( "Distinct Faces" ) )
{
QMap<QString, QString> faces = skyboxSettings.cubeMapFacesPaths();
mSkybox = new QgsCubeFacesSkyboxEntity(
faces[QStringLiteral( "posX" )], faces[QStringLiteral( "posY" )], faces[QStringLiteral( "posZ" )],
faces[QStringLiteral( "negX" )], faces[QStringLiteral( "negY" )], faces[QStringLiteral( "negZ" )],
this
);
}
}
}
2 changes: 1 addition & 1 deletion src/3d/qgs3dmapscene.h
Expand Up @@ -122,7 +122,6 @@ class _3D_EXPORT Qgs3DMapScene : public Qt3DCore::QEntity
public slots:
//! Updates the temporale entities
void updateTemporal();
void onSkyboxSettingsChanged( const QgsSkyboxSettings &settings );

private slots:
void onCameraChanged();
Expand All @@ -136,6 +135,7 @@ class _3D_EXPORT Qgs3DMapScene : public Qt3DCore::QEntity
void updateLights();
void updateCameraLens();
void onRenderersChanged();
void onSkyboxSettingsChanged();

private:
void addLayerEntity( QgsMapLayer *layer );
Expand Down
6 changes: 6 additions & 0 deletions src/3d/qgs3dmapsettings.cpp
Expand Up @@ -594,3 +594,9 @@ void Qgs3DMapSettings::setSkybox( bool enabled, const QString &fileBase, const Q
mSkyboxFileBase = fileBase;
mSkyboxFileExtension = fileExtension;
}

void Qgs3DMapSettings::setSkyboxSettings( const QgsSkyboxSettings &skyboxSettings )
{
mSkyboxSettings = skyboxSettings;
emit skyboxSettingsChanged();
}
18 changes: 17 additions & 1 deletion src/3d/qgs3dmapsettings.h
Expand Up @@ -30,6 +30,7 @@
#include "qgsdirectionallightsettings.h"
#include "qgsterraingenerator.h"
#include "qgsvector3d.h"
#include "qgsskyboxsettings.h"

class QgsMapLayer;
class QgsRasterLayer;
Expand All @@ -42,7 +43,6 @@ class QgsProject;

class QDomElement;


/**
* \ingroup 3d
* Definition of the world
Expand Down Expand Up @@ -384,6 +384,16 @@ class _3D_EXPORT Qgs3DMapSettings : public QObject, public QgsTemporalRangeObjec
*/
double outputDpi() const { return mDpi; }

/**
* Returns the current configuration of the skybox
*/
QgsSkyboxSettings skyboxSettings() const { return mSkyboxSettings; }

/**
* Sets the current configuration of the skybox
*/
void setSkyboxSettings( const QgsSkyboxSettings &skyboxSettings );

signals:
//! Emitted when the background color has changed
void backgroundColorChanged();
Expand Down Expand Up @@ -458,6 +468,11 @@ class _3D_EXPORT Qgs3DMapSettings : public QObject, public QgsTemporalRangeObjec
*/
void fieldOfViewChanged();

/*
* Emitted when skybox settings are changed
*/
void skyboxSettingsChanged();

private:
#ifdef SIP_RUN
Qgs3DMapSettings &operator=( const Qgs3DMapSettings & );
Expand Down Expand Up @@ -495,6 +510,7 @@ class _3D_EXPORT Qgs3DMapSettings : public QObject, public QgsTemporalRangeObjec
QgsPathResolver mPathResolver;
QgsMapThemeCollection *mMapThemes = nullptr; //!< Pointer to map themes (e.g. from the current project) to resolve map theme content from the name
double mDpi = 96; //!< Dot per inch value for the screen / painter
QgsSkyboxSettings mSkyboxSettings;
};


Expand Down
7 changes: 2 additions & 5 deletions src/3d/qgsskyboxentity.cpp
Expand Up @@ -63,9 +63,6 @@ QgsSkyboxEntity::QgsSkyboxEntity( QNode *parent )
mMaterial->addParameter( mGammaStrengthParameter );
mMaterial->addParameter( mTextureParameter );

// mMesh->setXExtent( 2.0f );
// mMesh->setYExtent( 2.0f );
// mMesh->setZExtent( 2.0f );
mMesh->setXYMeshResolution( QSize( 2, 2 ) );
mMesh->setXZMeshResolution( QSize( 2, 2 ) );
mMesh->setYZMeshResolution( QSize( 2, 2 ) );
Expand Down Expand Up @@ -101,7 +98,7 @@ QgsHDRSkyboxEntity::QgsHDRSkyboxEntity( const QString &hdrTexturePath, QNode *pa

void QgsHDRSkyboxEntity::reloadTexture()
{
mLoadedTexture->setSource( QUrl( mHDRTexturePath ) );
mLoadedTexture->setSource( QUrl::fromUserInput( mHDRTexturePath ) );
}

// 6 faces skybox
Expand Down Expand Up @@ -173,6 +170,6 @@ void QgsCubeFacesSkyboxEntity::reloadTexture()
for ( auto it = mCubeFacesTextures.begin(); it != mCubeFacesTextures.end(); ++it )
{
Qt3DRender::QTextureImage *image = it.value();
image->setSource( QUrl( mCubeFacesPaths[ it.key() ] ) );
image->setSource( QUrl::fromUserInput( mCubeFacesPaths[ it.key() ] ) );
}
}
22 changes: 19 additions & 3 deletions src/3d/qgsskyboxsettings.h
Expand Up @@ -2,23 +2,39 @@
#define QGSSKYBOXSETTINGS_H

#include <QString>
#include <QMap>

class QgsSkyboxSettings
{
public:
bool getIsSkyboxEnabled() const { return mIsSkyboxEnabled; }
bool isSkyboxEnabled() const { return mIsSkyboxEnabled; }
void setIsSkyboxEnabled( bool enabled ) { mIsSkyboxEnabled = enabled; }

QString getSkyboxBaseName() const { return mSkyboxBaseName; }
QString skyboxType() const { return mSkyboxType; }
void setSkyboxType( const QString &type ) { mSkyboxType = type; }

QString skyboxBaseName() const { return mSkyboxBaseName; }
void setSkyboxBaseName( const QString &baseName ) { mSkyboxBaseName = baseName; }

QString getSkyboxExtension() const { return mSkyboxExt; }
QString skyboxExtension() const { return mSkyboxExt; }
void setSkyboxExtension( const QString &extension ) { mSkyboxExt = extension; }

QString hdrTexturePath() const { return mHDRTexturePath; }
void setHDRTexturePath( const QString &texturePath ) { mHDRTexturePath = texturePath; }

QMap<QString, QString> cubeMapFacesPaths() const { return mCubeMapFacesPaths; }
void setCubeMapFace( const QString &face, const QString &path ) { mCubeMapFacesPaths[face] = path; }

private:
bool mIsSkyboxEnabled = false;
QString mSkyboxType;
//
QString mSkyboxBaseName;
QString mSkyboxExt;
//
QString mHDRTexturePath;
//
QMap<QString, QString> mCubeMapFacesPaths;
};

#endif // QGSSKYBOXSETTINGS_H
3 changes: 2 additions & 1 deletion src/app/3d/qgs3dmapconfigwidget.cpp
Expand Up @@ -126,7 +126,7 @@ Qgs3DMapConfigWidget::Qgs3DMapConfigWidget( Qgs3DMapSettings *map, QgsMapCanvas
onTerrainTypeChanged();

mSkyboxSettingsWidget = new QgsSkyboxRenderingSettingsWidget( this );
connect( mSkyboxSettingsWidget, &QgsSkyboxRenderingSettingsWidget::skyboxSettingsChanged, m3DMapCanvas->scene(), &Qgs3DMapScene::onSkyboxSettingsChanged );
// connect( mSkyboxSettingsWidget, &QgsSkyboxRenderingSettingsWidget::skyboxSettingsChanged, m3DMapCanvas->scene(), &Qgs3DMapScene::onSkyboxSettingsChanged );
groupSkyboxSettings->layout()->addWidget( mSkyboxSettingsWidget );
}

Expand Down Expand Up @@ -237,6 +237,7 @@ void Qgs3DMapConfigWidget::apply()

mMap->setPointLights( widgetLights->pointLights() );
mMap->setDirectionalLights( widgetLights->directionalLights() );
mMap->setSkyboxSettings( mSkyboxSettingsWidget->toSkyboxSettings() );
}

void Qgs3DMapConfigWidget::onTerrainTypeChanged()
Expand Down
2 changes: 1 addition & 1 deletion src/app/3d/qgs3dmapconfigwidget.h
Expand Up @@ -25,7 +25,7 @@ class QgsMapCanvas;
class QgsMesh3dSymbolWidget;
class QgsSkyboxRenderingSettingsWidget;
class Qgs3DMapCanvas;

class QgsSkyboxSettings;

class Qgs3DMapConfigWidget : public QWidget, private Ui::Map3DConfigWidget
{
Expand Down
30 changes: 17 additions & 13 deletions src/app/3d/qgsskyboxrenderingsettingswidget.cpp
Expand Up @@ -9,19 +9,23 @@ QgsSkyboxRenderingSettingsWidget::QgsSkyboxRenderingSettingsWidget( QWidget *par
{
setupUi( this );

QObject::connect( skyboxEnabledCheckBox, &QCheckBox::stateChanged, [&]( int state ) -> void
{
mIsSkyboxEnabled = state == 1;
emit skyboxSettingsChanged( toSkyboxSettings() );
} );
QObject::connect( skyboxPrefixLineEdit, &QLineEdit::textChanged, [&]( const QString & newPrefix ) -> void
{
mSkyboxBaseName = newPrefix;
emit skyboxSettingsChanged( toSkyboxSettings() );
} );
connect( skyboxExtensionLineEdit, &QLineEdit::textChanged, [&]( const QString & newExt ) -> void
layoutGroupBoxes.push_back( textureCollectionGroupBox );
layoutGroupBoxes.push_back( hdrTextureGroupBox );
layoutGroupBoxes.push_back( faceTexturesGroupBox );

skyboxTypeComboBox->addItem( QStringLiteral( "Textures collection" ) );
skyboxTypeComboBox->addItem( QStringLiteral( "HDR texture" ) );
skyboxTypeComboBox->addItem( QStringLiteral( "Distinct Faces" ) );
connect( skyboxTypeComboBox, &QComboBox::currentTextChanged, [&]( const QString & skyboxType )
{
mSkyboxExtension = newExt;
emit skyboxSettingsChanged( toSkyboxSettings() );
for ( QGroupBox *groupBox : layoutGroupBoxes )
groupBox->setVisible( false );
if ( skyboxType == QStringLiteral( "Textures collection" ) )
textureCollectionGroupBox->setVisible( true );
if ( skyboxType == QStringLiteral( "HDR texture" ) )
hdrTextureGroupBox->setVisible( true );
if ( skyboxType == QStringLiteral( "Distinct Faces" ) )
faceTexturesGroupBox->setVisible( true );
} );
skyboxTypeComboBox->setCurrentIndex( 1 );
}
21 changes: 12 additions & 9 deletions src/app/3d/qgsskyboxrenderingsettingswidget.h
Expand Up @@ -15,19 +15,22 @@ class QgsSkyboxRenderingSettingsWidget : public QWidget, private Ui::SkyboxRende
QgsSkyboxSettings toSkyboxSettings()
{
QgsSkyboxSettings settings;
settings.setIsSkyboxEnabled( mIsSkyboxEnabled );
settings.setSkyboxBaseName( mSkyboxBaseName );
settings.setSkyboxExtension( mSkyboxExtension );
settings.setIsSkyboxEnabled( skyboxEnabledCheckBox->checkState() == Qt::CheckState::Checked );
settings.setSkyboxType( skyboxTypeComboBox->currentText() );
settings.setSkyboxBaseName( skyboxBaseNameLineEdit->text() );
settings.setSkyboxExtension( skyboxExtensionLineEdit->text() );
settings.setHDRTexturePath( hdrTextureImageSource->source() );
settings.setCubeMapFace( QStringLiteral( "posX" ), posXImageSource->source() );
settings.setCubeMapFace( QStringLiteral( "posY" ), posYImageSource->source() );
settings.setCubeMapFace( QStringLiteral( "posZ" ), posZImageSource->source() );
settings.setCubeMapFace( QStringLiteral( "negX" ), negXImageSource->source() );
settings.setCubeMapFace( QStringLiteral( "negY" ), negYImageSource->source() );
settings.setCubeMapFace( QStringLiteral( "negZ" ), negZImageSource->source() );
return settings;
}

signals:
void skyboxSettingsChanged( const QgsSkyboxSettings &skyboxSettings );

private:
bool mIsSkyboxEnabled = false;
QString mSkyboxBaseName;
QString mSkyboxExtension;
QVector<QGroupBox *> layoutGroupBoxes;
};

#endif // SKYBOXRENDERINGSETTINGSWIDGET_H

0 comments on commit f5726e5

Please sign in to comment.