17#include "moc_qgs3dmapscene.cpp"
19#include <Qt3DRender/QCamera>
20#include <Qt3DRender/QMesh>
21#include <Qt3DRender/QRenderSettings>
22#include <Qt3DRender/QSceneLoader>
23#include <Qt3DExtras/QForwardRenderer>
24#include <Qt3DExtras/QPhongMaterial>
25#include <Qt3DExtras/QPhongAlphaMaterial>
26#include <Qt3DExtras/QDiffuseSpecularMaterial>
27#include <Qt3DExtras/QSphereMesh>
28#include <Qt3DLogic/QFrameAction>
29#include <Qt3DRender/QEffect>
30#include <Qt3DRender/QTechnique>
31#include <Qt3DRender/QRenderPass>
32#include <Qt3DRender/QRenderState>
33#include <Qt3DRender/QCullFace>
34#include <Qt3DRender/QDepthTest>
39#include <QOpenGLContext>
40#include <QOpenGLFunctions>
94 onBackgroundColorChanged();
99 mEngine->
renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::OnDemand );
101 QRect viewportRect( QPoint( 0, 0 ), mEngine->
size() );
107 float aspectRatio = ( float ) viewportRect.width() / viewportRect.height();
108 mEngine->
camera()->lens()->setPerspectiveProjection( mMap.
fieldOfView(), aspectRatio, 10.f, 10000.0f );
110 mFrameAction =
new Qt3DLogic::QFrameAction();
111 connect( mFrameAction, &Qt3DLogic::QFrameAction::triggered,
this, &Qgs3DMapScene::onFrameTriggered );
112 addComponent( mFrameAction );
118 addCameraViewCenterEntity( mEngine->
camera() );
119 addCameraRotationCenterEntity( mCameraController );
124 createTerrainDeferred();
154 const QList<QgsMapLayer *> modelVectorLayers = mModelVectorLayers;
160 if ( renderer->
type() == QLatin1String(
"vector" ) )
163 if ( pointSymbol->
shapeProperty( QStringLiteral(
"model" ) ).toString() == url )
165 removeLayerEntity( layer );
166 addLayerEntity( layer );
169 else if ( renderer->
type() == QLatin1String(
"rulebased" ) )
172 for (
auto rule : rules )
175 if ( pointSymbol->
shapeProperty( QStringLiteral(
"model" ) ).toString() == url )
177 removeLayerEntity( layer );
178 addLayerEntity( layer );
193 onSkyboxSettingsChanged();
198 onEyeDomeShadingSettingsChanged();
200 onDebugShadowMapSettingsChanged();
201 onDebugDepthMapSettingsChanged();
203 onAmbientOcclusionSettingsChanged();
206 onCameraMovementSpeedChanged();
208 on3DAxisSettingsChanged();
215 const double side = std::max( extent.
width(), extent.
height() );
216 double d = side / 2 / std::tan(
cameraController()->camera()->fieldOfView() / 2 * M_PI / 180 );
218 mCameraController->
resetView(
static_cast<float>( d ) );
228 float xSide = std::abs( p1.
x() - p2.
x() );
229 float ySide = std::abs( p1.
z() - p2.
z() );
232 float fov = 2 * std::atan( std::tan( qDegreesToRadians(
cameraController()->camera()->fieldOfView() ) / 2 ) *
cameraController()->camera()->aspectRatio() );
233 float r = xSide / 2.0f / std::tan( fov / 2.0f );
238 float fov = qDegreesToRadians(
cameraController()->camera()->fieldOfView() );
239 float r = ySide / 2.0f / std::tan( fov / 2.0f );
246 Qt3DRender::QCamera *camera = mCameraController->
camera();
247 QVector<QgsPointXY> extent;
248 QVector<int> pointsOrder = { 0, 1, 3, 2 };
249 for (
int i : pointsOrder )
251 const QPoint p( ( ( i >> 0 ) & 1 ) ? 0 : mEngine->
size().width(), ( ( i >> 1 ) & 1 ) ? 0 : mEngine->
size().height() );
253 QVector3D dir = ray.direction();
254 if ( dir.z() == 0.0 )
255 dir.setZ( 0.000001 );
256 double t = -ray.origin().z() / dir.z();
260 t = camera->farPlane();
265 t = std::min<float>( t, camera->farPlane() );
267 QVector3D planePoint = ray.origin() + t * dir;
276 return mTerrain ? mTerrain->pendingJobsCount() : 0;
282 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
283 count += entity->pendingJobsCount();
289 Qt3DRender::QCamera *camera = mCameraController->
camera();
290 float fov = camera->fieldOfView();
291 const QSize size = mEngine->
size();
292 float screenSizePx = std::max( size.width(), size.height() );
296 float frustumWidthAtDistance = 2 * distance * tan( fov / 2 );
297 float err = frustumWidthAtDistance * epsilon / screenSizePx;
301void Qgs3DMapScene::onCameraChanged()
303 if ( mMap.
projectionType() == Qt3DRender::QCameraLens::OrthographicProjection )
305 QRect viewportRect( QPoint( 0, 0 ), mEngine->
size() );
306 const float viewWidthFromCenter = mCameraController->
distance();
307 const float viewHeightFromCenter = viewportRect.height() * viewWidthFromCenter / viewportRect.width();
308 mEngine->
camera()->lens()->setOrthographicProjection( -viewWidthFromCenter, viewWidthFromCenter, -viewHeightFromCenter, viewHeightFromCenter, mEngine->
camera()->nearPlane(), mEngine->
camera()->farPlane() );
312 updateCameraNearFarPlanes();
314 onShadowSettingsChanged();
320void Qgs3DMapScene::updateScene(
bool forceUpdate )
322 if ( !mSceneUpdatesEnabled )
328 QgsEventTracing::ScopedEvent traceEvent( QStringLiteral(
"3D" ), forceUpdate ? QStringLiteral(
"Force update scene" ) : QStringLiteral(
"Update scene" ) );
330 Qgs3DMapSceneEntity::SceneContext sceneContext;
331 Qt3DRender::QCamera *camera = mEngine->
camera();
332 sceneContext.cameraFov = camera->fieldOfView();
333 sceneContext.cameraPos = camera->position();
334 const QSize size = mEngine->
size();
335 sceneContext.screenSizePx = std::max( size.width(), size.height() );
343 float fovRadians = ( camera->fieldOfView() / 2.0f ) *
static_cast<float>( M_PI ) / 180.0f;
344 float fovCotan = std::cos( fovRadians ) / std::sin( fovRadians );
345 QMatrix4x4 projMatrix(
346 fovCotan / camera->aspectRatio(), 0, 0, 0,
351 sceneContext.viewProjectionMatrix = projMatrix * camera->viewMatrix();
354 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
356 if ( forceUpdate || ( entity->isEnabled() && entity->needsUpdate() ) )
358 entity->handleSceneUpdate( sceneContext );
359 if ( entity->hasReachedGpuMemoryLimit() )
367bool Qgs3DMapScene::updateCameraNearFarPlanes()
382 QMatrix4x4 viewMatrix = camera->viewMatrix();
388 for ( Qgs3DMapSceneEntity *se : std::as_const( mSceneEntities ) )
390 const QgsRange<float> depthRange = se->getNearFarPlaneRange( viewMatrix );
392 fnear = std::min( fnear, depthRange.
lower() );
393 ffar = std::max( ffar, depthRange.
upper() );
402 if ( fnear == 1e9 && ffar == 0 )
412 std::swap( fnear, ffar );
415 float newFar = ffar * 2;
416 float newNear = fnear / 2;
419 camera->setFarPlane( newFar );
420 camera->setNearPlane( newNear );
427void Qgs3DMapScene::onFrameTriggered(
float dt )
429 QgsEventTracing::addEvent( QgsEventTracing::EventType::Instant, QStringLiteral(
"3D" ), QStringLiteral(
"Frame begins" ) );
436 static int frameCount = 0;
437 static float accumulatedTime = 0.0f;
447 accumulatedTime += dt;
448 if ( accumulatedTime >= 0.2f )
450 float fps = ( float ) frameCount / accumulatedTime;
452 accumulatedTime = 0.0f;
457void Qgs3DMapScene::createTerrain()
461 mSceneEntities.removeOne( mTerrain );
467 if ( !mTerrainUpdateScheduled )
470 QTimer::singleShot( 0,
this, &Qgs3DMapScene::createTerrainDeferred );
471 mTerrainUpdateScheduled =
true;
480void Qgs3DMapScene::createTerrainDeferred()
489 mMap.
terrainGenerator()->setupQuadtree( rootBox3D, rootError, maxZoomLevel, clippingBox3D );
491 mTerrain =
new QgsTerrainEntity( &mMap );
492 mTerrain->setParent(
this );
495 mSceneEntities << mTerrain;
499 connect( mTerrain, &Qgs3DMapSceneEntity::newEntityCreated,
this, [
this]( Qt3DCore::QEntity *entity ) {
501 const QList<QgsGeoTransform *> transforms = entity->findChildren<QgsGeoTransform *>();
502 for ( QgsGeoTransform *transform : transforms )
504 transform->setOrigin( mMap.
origin() );
508 handleClippingOnEntity( entity );
521 removeLayerEntity( layer );
524 addLayerEntity( layer );
529 mTerrainUpdateScheduled =
false;
532void Qgs3DMapScene::onBackgroundColorChanged()
537void Qgs3DMapScene::updateLights()
539 for ( Qt3DCore::QEntity *entity : std::as_const( mLightEntities ) )
540 entity->deleteLater();
541 mLightEntities.clear();
543 const QList<QgsLightSource *> newLights = mMap.
lightSources();
546 mLightEntities.append( source->createEntity( mMap,
this ) );
549 onShadowSettingsChanged();
552void Qgs3DMapScene::updateCameraLens()
559void Qgs3DMapScene::onLayerRenderer3DChanged()
561 QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
565 removeLayerEntity( layer );
568 addLayerEntity( layer );
571void Qgs3DMapScene::onLayersChanged()
573 QSet<QgsMapLayer *> layersBefore = qgis::listToSet( mLayerEntities.keys() );
574 QList<QgsMapLayer *> layersAdded;
578 if ( !layersBefore.contains( layer ) )
580 layersAdded << layer;
584 layersBefore.remove( layer );
589 for (
QgsMapLayer *layer : std::as_const( layersBefore ) )
591 removeLayerEntity( layer );
594 for (
QgsMapLayer *layer : std::as_const( layersAdded ) )
596 addLayerEntity( layer );
602 const QList<QgsMapLayer *>
layers = mLayerEntities.keys();
607 if ( temporalProperties->isActive() )
609 removeLayerEntity( layer );
610 addLayerEntity( layer );
616void Qgs3DMapScene::addLayerEntity(
QgsMapLayer *layer )
618 bool needsSceneUpdate =
false;
629 if ( renderer->
type() == QLatin1String(
"vector" ) )
637 mModelVectorLayers.append( layer );
641 else if ( renderer->
type() == QLatin1String(
"rulebased" ) )
644 for (
auto rule : rules )
649 mModelVectorLayers.append( layer );
677 Qt3DCore::QEntity *newEntity = renderer->
createEntity( &mMap );
680 newEntity->setParent(
this );
681 mLayerEntities.insert( layer, newEntity );
683 finalizeNewEntity( newEntity );
685 if ( Qgs3DMapSceneEntity *sceneNewEntity = qobject_cast<Qgs3DMapSceneEntity *>( newEntity ) )
687 needsSceneUpdate =
true;
688 mSceneEntities.append( sceneNewEntity );
690 connect( sceneNewEntity, &Qgs3DMapSceneEntity::newEntityCreated,
this, [
this]( Qt3DCore::QEntity *entity ) {
691 finalizeNewEntity( entity );
693 updateCameraNearFarPlanes();
701 if ( needsSceneUpdate )
726void Qgs3DMapScene::removeLayerEntity(
QgsMapLayer *layer )
728 Qt3DCore::QEntity *entity = mLayerEntities.take( layer );
730 if ( Qgs3DMapSceneEntity *sceneEntity = qobject_cast<Qgs3DMapSceneEntity *>( entity ) )
732 mSceneEntities.removeOne( sceneEntity );
736 entity->deleteLater();
745 mModelVectorLayers.removeAll( layer );
762void Qgs3DMapScene::finalizeNewEntity( Qt3DCore::QEntity *newEntity )
765 const QList<QgsGeoTransform *> transforms = newEntity->findChildren<QgsGeoTransform *>();
766 for ( QgsGeoTransform *transform : transforms )
768 transform->setOrigin( mMap.
origin() );
772 handleClippingOnEntity( newEntity );
776 const QList<QgsLineMaterial *> childLineMaterials = newEntity->findChildren<QgsLineMaterial *>();
777 for ( QgsLineMaterial *lm : childLineMaterials )
780 lm->setViewportSize( mEngine->
size() );
783 lm->setViewportSize( mEngine->
size() );
790 bm->setViewportSize( mEngine->
size() );
799 const QList<Qt3DRender::QMaterial *> childMaterials = newEntity->findChildren<Qt3DRender::QMaterial *>();
800 for ( Qt3DRender::QMaterial *material : childMaterials )
803 if ( Qt3DExtras::QDiffuseSpecularMaterial *ph = qobject_cast<Qt3DExtras::QDiffuseSpecularMaterial *>( material ) )
805 if ( ph->diffuse().value<QColor>().alphaF() != 1.0f )
807 Qt3DCore::QEntity *entity = qobject_cast<Qt3DCore::QEntity *>( ph->parent() );
808 if ( entity && !entity->components().contains( transparentLayer ) )
810 entity->addComponent( transparentLayer );
817 Qt3DRender::QEffect *effect = material->effect();
820 const QVector<Qt3DRender::QParameter *> parameters = effect->parameters();
821 for (
const Qt3DRender::QParameter *parameter : parameters )
823 if ( parameter->name() ==
"opacity" && parameter->value() != 1.0f )
825 Qt3DCore::QEntity *entity = qobject_cast<Qt3DCore::QEntity *>( material->parent() );
826 if ( entity && !entity->components().contains( transparentLayer ) )
828 entity->addComponent( transparentLayer );
838int Qgs3DMapScene::maximumTextureSize()
const
840 QSurface *surface = mEngine->
surface();
841 QOpenGLContext context;
843 bool success = context.makeCurrent( surface );
847 QOpenGLFunctions openglFunctions = QOpenGLFunctions( &context );
850 openglFunctions.initializeOpenGLFunctions();
851 openglFunctions.glGetIntegerv( GL_MAX_TEXTURE_SIZE, &size );
860void Qgs3DMapScene::addCameraViewCenterEntity( Qt3DRender::QCamera *camera )
862 mEntityCameraViewCenter =
new Qt3DCore::QEntity;
864 Qt3DCore::QTransform *trCameraViewCenter =
new Qt3DCore::QTransform;
865 mEntityCameraViewCenter->addComponent( trCameraViewCenter );
866 connect( camera, &Qt3DRender::QCamera::viewCenterChanged,
this, [trCameraViewCenter, camera] {
867 trCameraViewCenter->setTranslation( camera->viewCenter() );
870 Qt3DExtras::QPhongMaterial *materialCameraViewCenter =
new Qt3DExtras::QPhongMaterial;
871 materialCameraViewCenter->setAmbient( Qt::red );
872 mEntityCameraViewCenter->addComponent( materialCameraViewCenter );
874 Qt3DExtras::QSphereMesh *rendererCameraViewCenter =
new Qt3DExtras::QSphereMesh;
875 rendererCameraViewCenter->setRadius( 10 );
876 mEntityCameraViewCenter->addComponent( rendererCameraViewCenter );
879 mEntityCameraViewCenter->setParent(
this );
888 if ( mSceneState == state )
894void Qgs3DMapScene::updateSceneState()
896 if ( mTerrainUpdateScheduled )
902 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
904 if ( entity->isEnabled() && entity->pendingJobsCount() > 0 )
911 setSceneState(
Ready );
914void Qgs3DMapScene::onSkyboxSettingsChanged()
919 mSkybox->deleteLater();
927 QMap<QString, QString> faces;
933 faces[QStringLiteral(
"posX" )], faces[QStringLiteral(
"posY" )], faces[QStringLiteral(
"posZ" )],
934 faces[QStringLiteral(
"negX" )], faces[QStringLiteral(
"negY" )], faces[QStringLiteral(
"negZ" )],
945void Qgs3DMapScene::onShadowSettingsChanged()
949 const QList<QgsLightSource *> lightSources = mMap.
lightSources();
950 QList<QgsDirectionalLightSettings *> directionalLightSources;
955 directionalLightSources << qgis::down_cast<QgsDirectionalLightSettings *>( source );
961 if ( shadowSettings.
renderShadows() && selectedLight >= 0 && selectedLight < directionalLightSources.count() )
973void Qgs3DMapScene::onAmbientOcclusionSettingsChanged()
983void Qgs3DMapScene::onDebugShadowMapSettingsChanged()
988void Qgs3DMapScene::onDebugDepthMapSettingsChanged()
993void Qgs3DMapScene::onDebugOverlayEnabledChanged()
999void Qgs3DMapScene::onEyeDomeShadingSettingsChanged()
1007void Qgs3DMapScene::onCameraMovementSpeedChanged()
1012void Qgs3DMapScene::onCameraNavigationModeChanged()
1019 QVector<QString> notParsedLayers;
1029 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); ++it )
1032 Qt3DCore::QEntity *rootEntity = it.value();
1034 switch ( layerType )
1038 notParsedLayers.push_back( layer->
name() );
1048 notParsedLayers.push_back( layer->
name() );
1062 if ( !notParsedLayers.empty() )
1064 QString message = tr(
"The following layers were not exported:" ) +
"\n";
1065 for (
const QString &layerName : notParsedLayers )
1066 message += layerName +
"\n";
1075 QVector<const QgsChunkNode *> chunks;
1076 if ( !mLayerEntities.contains( layer ) )
1078 if ( QgsChunkedEntity *
c = qobject_cast<QgsChunkedEntity *>( mLayerEntities[layer] ) )
1080 const QList<QgsChunkNode *> activeNodes =
c->activeNodes();
1081 for ( QgsChunkNode *n : activeNodes )
1082 chunks.push_back( n );
1094 double zMin = std::numeric_limits<double>::max();
1095 double zMax = std::numeric_limits<double>::lowest();
1098 const QgsBox3D box3D = mTerrain->rootNode()->box3D();
1099 zMin = std::min( zMin, box3D.
zMinimum() );
1100 zMax = std::max( zMax, box3D.
zMaximum() );
1103 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); it++ )
1106 switch ( layer->
type() )
1112 zMin = std::min( zMin, zRange.
lower() );
1113 zMax = std::max( zMax, zRange.
upper() );
1118 QgsMeshLayer *meshLayer = qobject_cast<QgsMeshLayer *>( layer );
1126 zMin = std::min( zMin, verticalGroupMetadata.
minimum() * verticalScale );
1127 zMax = std::max( zMax, verticalGroupMetadata.
maximum() * verticalScale );
1137 zMin = std::min( zMin, zRange.
lower() );
1138 zMax = std::max( zMax, zRange.
upper() );
1151 const QgsDoubleRange zRange( std::min( zMin, std::numeric_limits<double>::max() ), std::max( zMax, std::numeric_limits<double>::lowest() ) );
1162 mEntityRotationCenter =
new Qt3DCore::QEntity;
1164 Qt3DCore::QTransform *trRotationCenter =
new Qt3DCore::QTransform;
1165 mEntityRotationCenter->addComponent( trRotationCenter );
1166 Qt3DExtras::QPhongMaterial *materialRotationCenter =
new Qt3DExtras::QPhongMaterial;
1167 materialRotationCenter->setAmbient( Qt::blue );
1168 mEntityRotationCenter->addComponent( materialRotationCenter );
1169 Qt3DExtras::QSphereMesh *rendererRotationCenter =
new Qt3DExtras::QSphereMesh;
1170 rendererRotationCenter->setRadius( 10 );
1171 mEntityRotationCenter->addComponent( rendererRotationCenter );
1172 mEntityRotationCenter->setEnabled(
false );
1173 mEntityRotationCenter->setParent(
this );
1176 trRotationCenter->setTranslation( center );
1184void Qgs3DMapScene::on3DAxisSettingsChanged()
1199void Qgs3DMapScene::onOriginChanged()
1201 const QList<QgsGeoTransform *> geoTransforms = findChildren<QgsGeoTransform *>();
1202 for ( QgsGeoTransform *transform : geoTransforms )
1204 transform->setOrigin( mMap.
origin() );
1210void Qgs3DMapScene::handleClippingOnEntity( QEntity *entity )
const
1212 if ( mClipPlanesEquations.isEmpty() )
1216 material->disableClipping();
1223 material->enableClipping( mClipPlanesEquations );
1229 for ( QObject *child : entity->children() )
1231 Qt3DCore::QEntity *childEntity = qobject_cast<Qt3DCore::QEntity *>( child );
1234 handleClippingOnEntity( childEntity );
1239void Qgs3DMapScene::handleClippingOnAllEntities()
const
1243 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); ++it )
1245 handleClippingOnEntity( it.value() );
1249 handleClippingOnEntity( mTerrain );
1255 if ( clipPlaneEquations.size() > mMaxClipPlanes )
1257 QgsDebugMsgLevel( QStringLiteral(
"Qgs3DMapScene::enableClipping: it is not possible to use more than %1 clipping planes." ).arg( mMaxClipPlanes ), 2 );
1259 mClipPlanesEquations = clipPlaneEquations.mid( 0, mMaxClipPlanes );
1266 handleClippingOnAllEntities();
1271 mClipPlanesEquations.clear();
1278 handleClippingOnAllEntities();
1281void Qgs3DMapScene::onStopUpdatesChanged()
LayerType
Types of layers that can be added to a map.
@ Group
Composite group layer. Added in QGIS 3.24.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
@ Directional
Directional light source.
void onAxisSettingsChanged()
Force update of the axis and the viewport when a setting has changed.
Manages the various settings the user can choose from when exporting a 3D scene 3.
bool exportNormals() const
Returns whether normals will be exported.
int terrrainResolution() const
Returns the terrain resolution.
QString sceneFolderPath() const
Returns the scene folder path.
float scale() const
Returns the scale of the exported model.
int terrainTextureResolution() const
Returns the terrain texture resolution.
QString sceneName() const
Returns the scene name.
bool smoothEdges() const
Returns whether triangles edges will look smooth.
bool exportTextures() const
Returns whether textures will be exported.
QVector< const QgsChunkNode * > getLayerActiveChunkNodes(QgsMapLayer *layer)
Returns the active chunk nodes of layer.
void terrainPendingJobsCountChanged()
Emitted when the number of terrain's pending jobs changes.
void viewed2DExtentFrom3DChanged(QVector< QgsPointXY > extent)
Emitted when the viewed 2D extent seen by the 3D camera has changed.
static std::function< QMap< QString, Qgs3DMapScene * >()> sOpenScenesFunction
Static function for returning open 3D map scenes.
void fpsCountChanged(float fpsCount)
Emitted when the FPS count changes.
void setViewFrom2DExtent(const QgsRectangle &extent)
Resets camera view to show the extent extent (top view)
void disableClipping()
Disables OpenGL clipping.
Qgs3DMapScene(Qgs3DMapSettings &map, QgsAbstract3DEngine *engine)
Constructs a 3D scene based on map settings and Qt 3D renderer configuration.
QgsAbstract3DEngine * engine() const
Returns the abstract 3D engine.
void gpuMemoryLimitReached()
Emitted when one of the entities reaches its GPU memory limit and it is not possible to lower the GPU...
QgsDoubleRange elevationRange() const
Returns the scene's elevation range.
QgsCameraController * cameraController() const
Returns camera controller.
SceneState
Enumeration of possible states of the 3D scene.
@ Ready
The scene is fully loaded/updated.
@ Updating
The scene is still being loaded/updated.
bool exportScene(const Qgs3DMapExportSettings &exportSettings)
Exports the scene according to the scene export settings Returns false if the operation failed.
int totalPendingJobsCount() const
Returns number of pending jobs for all chunked entities.
void updateTemporal()
Updates the temporale entities.
static Q_DECL_DEPRECATED QMap< QString, Qgs3DMapScene * > openScenes()
Returns a map of 3D map scenes (by name) open in the QGIS application.
void totalPendingJobsCountChanged()
Emitted when the total number of pending jobs changes.
void fpsCounterEnabledChanged(bool fpsCounterEnabled)
Emitted when the FPS counter is activated or deactivated.
QgsRectangle sceneExtent() const
Returns the scene extent in the map's CRS.
void sceneStateChanged()
Emitted when the scene's state has changed.
int terrainPendingJobsCount() const
Returns number of pending jobs of the terrain entity.
QList< QgsMapLayer * > layers() const
Returns the layers that contain chunked entities.
QVector< QgsPointXY > viewFrustum2DExtent() const
Calculates the 2D extent viewed by the 3D camera as the vertices of the viewed trapezoid.
void enableClipping(const QList< QVector4D > &clipPlaneEquations)
Enables OpenGL clipping based on the planes equations defined in clipPlaneEquations.
float worldSpaceError(float epsilon, float distance) const
Given screen error (in pixels) and distance from camera (in 3D world coordinates),...
void terrainEntityChanged()
Emitted when the current terrain entity is replaced by a new one.
void viewZoomFull()
Resets camera view to show the whole scene (top view)
void extentChanged()
Emitted when the 3d view's 2d extent has changed.
bool isDebugOverlayEnabled() const
Returns whether debug overlay is enabled.
Qt::Corner debugDepthMapCorner() const
Returns the corner where the shadow map preview is displayed.
void originChanged()
Emitted when the world's origin point has been shifted.
void eyeDomeLightingDistanceChanged()
Emitted when the eye dome lighting distance has changed.
void terrainShadingChanged()
Emitted when terrain shading enabled flag or terrain shading material has changed.
QgsVector3D mapToWorldCoordinates(const QgsVector3D &mapCoords) const
Converts map coordinates to 3D world coordinates (applies offset and turns (x,y,z) into (x,...
double cameraMovementSpeed() const
Returns the camera movement speed.
Qt3DRender::QCameraLens::ProjectionType projectionType() const
Returns the camera lens' projection type.
bool debugDepthMapEnabled() const
Returns whether the shadow map debugging is enabled.
bool isSkyboxEnabled() const
Returns whether the skybox is enabled.
void debugDepthMapSettingsChanged()
Emitted when depth map debugging has changed.
Qgis::NavigationMode cameraNavigationMode() const
Returns the navigation mode used by the camera.
double eyeDomeLightingStrength() const
Returns the eye dome lighting strength value.
void backgroundColorChanged()
Emitted when the background color has changed.
Qt::Corner debugShadowMapCorner() const
Returns the corner where the shadow map preview is displayed.
bool showCameraViewCenter() const
Returns whether to show camera's view center as a sphere (for debugging)
void showCameraRotationCenterChanged()
Emitted when the flag whether camera's rotation center is shown has changed.
const QgsAbstractTerrainSettings * terrainSettings() const
Returns the terrain settings.
void cameraNavigationModeChanged()
Emitted when the camera navigation mode was changed.
void shadowSettingsChanged()
Emitted when shadow rendering settings are changed.
bool stopUpdates() const
Returns whether the scene updates on camera movement.
void eyeDomeLightingEnabledChanged()
Emitted when the flag whether eye dome lighting is used has changed.
void debugOverlayEnabledChanged(bool debugOverlayEnabled)
Emitted when the debug overaly is enabled or disabled.
void skyboxSettingsChanged()
Emitted when skybox settings are changed.
QgsShadowSettings shadowSettings() const
Returns the current configuration of shadows.
QList< QgsLightSource * > lightSources() const
Returns list of directional light sources defined in the scene.
double debugDepthMapSize() const
Returns the size of the shadow map preview.
void projectionTypeChanged()
Emitted when the camera lens projection type changes.
float fieldOfView() const
Returns the camera lens' field of view.
QgsAmbientOcclusionSettings ambientOcclusionSettings() const
Returns the current configuration of screen space ambient occlusion.
QgsRectangle extent() const
Returns the 3D scene's 2D extent in the 3D scene's CRS.
void stopUpdatesChanged()
Emitted when the flag whether to keep updating scene has changed.
int eyeDomeLightingDistance() const
Returns the eye dome lighting distance value (contributes to the contrast of the image)
void lightSourcesChanged()
Emitted when any of the light source settings in the map changes.
void showLightSourceOriginsChanged()
Emitted when the flag whether light source origins are shown has changed.
QgsTerrainGenerator * terrainGenerator() const
Returns the terrain generator.
QColor backgroundColor() const
Returns background color of the 3D map view.
void terrainSettingsChanged()
Emitted when the terrain settings are changed.
double debugShadowMapSize() const
Returns the size of the shadow map preview.
QgsVector3D worldToMapCoordinates(const QgsVector3D &worldCoords) const
Converts 3D world coordinates to map coordinates (applies offset and turns (x,y,z) into (x,...
bool showTerrainBoundingBoxes() const
Returns whether to display bounding boxes of terrain tiles (for debugging)
bool debugShadowMapEnabled() const
Returns whether the shadow map debugging is enabled.
bool terrainRenderingEnabled() const
Returns whether the 2D terrain surface will be rendered.
void fpsCounterEnabledChanged(bool fpsCounterEnabled)
Emitted when the FPS counter is enabled or disabled.
void axisSettingsChanged()
Emitted when 3d axis rendering settings are changed.
void ambientOcclusionSettingsChanged()
Emitted when ambient occlusion rendering settings are changed.
void layersChanged()
Emitted when the list of map layers for 3d rendering has changed.
void eyeDomeLightingStrengthChanged()
Emitted when the eye dome lighting strength has changed.
QgsSkyboxSettings skyboxSettings() const
Returns the current configuration of the skybox.
void cameraMovementSpeedChanged()
Emitted when the camera movement speed was changed.
bool eyeDomeLightingEnabled() const
Returns whether eye dome lighting is used.
bool isFpsCounterEnabled() const
Returns whether FPS counter label is enabled.
void fieldOfViewChanged()
Emitted when the camera lens field of view changes.
QList< QgsMapLayer * > layers() const
Returns the list of 3D map layers to be rendered in the scene.
void terrainGeneratorChanged()
Emitted when the terrain generator has changed.
void debugShadowMapSettingsChanged()
Emitted when shadow map debugging has changed.
void showCameraViewCenterChanged()
Emitted when the flag whether camera's view center is shown has changed.
QgsVector3D origin() const
Returns coordinates in map CRS at which 3D scene has origin (0,0,0).
bool showCameraRotationCenter() const
Returns whether to show camera's rotation center as a sphere (for debugging)
Entity that handles the exporting of 3D scene.
bool save(const QString &sceneName, const QString &sceneFolderPath, int precision=6)
Saves the scene to a .obj file Returns false if the operation failed.
void setExportTextures(bool exportTextures)
Sets whether the textures will be exported.
void parseTerrain(QgsTerrainEntity *terrain, const QString &layer)
Creates terrain export objects from the terrain entity.
void setTerrainResolution(int resolution)
Sets the terrain resolution.
void setTerrainTextureResolution(int resolution)
Sets the terrain texture resolution.
bool parseVectorLayerEntity(Qt3DCore::QEntity *entity, QgsVectorLayer *layer)
Creates necessary export objects from entity if it represents valid vector layer entity Returns false...
void setScale(float scale)
Sets the scale of the exported 3D model.
void setExportNormals(bool exportNormals)
Sets whether the normals will be exported.
void setSmoothEdges(bool smoothEdges)
Sets whether the triangles will look smooth.
static int maxZoomLevel(double tile0width, double tileResolution, double maxError)
Calculates the highest needed zoom level for tiles in quad-tree given width of the base tile (zoom le...
static QgsAABB mapToWorldExtent(const QgsRectangle &extent, double zMin, double zMax, const QgsVector3D &mapOrigin)
Converts map extent to axis aligned bounding box in 3D world coordinates.
static void computeBoundingBoxNearFarPlanes(const QgsAABB &bbox, const QMatrix4x4 &viewMatrix, float &fnear, float &ffar)
This routine computes nearPlane farPlane from the closest and farthest corners point of bounding box ...
static QgsRay3D rayFromScreenPoint(const QPoint &point, const QSize &windowSize, Qt3DRender::QCamera *camera)
Convert from clicked point on the screen to a ray in world coordinates.
static int openGlMaxClipPlanes(QSurface *surface)
Gets the maximum number of clip planes that can be used.
void sizeChanged()
Emitted after a call to setSize()
virtual QSurface * surface() const =0
Returns the surface of the engine.
virtual Qt3DRender::QCamera * camera()=0
Returns pointer to the engine's camera entity.
virtual void setClearColor(const QColor &color)=0
Sets background color of the scene.
virtual void setFrustumCullingEnabled(bool enabled)=0
Sets whether frustum culling is enabled (this should make rendering faster by not rendering entities ...
QgsFrameGraph * frameGraph()
Returns the shadow rendering frame graph object used to render the scene.
virtual QSize size() const =0
Returns size of the engine's rendering area in pixels.
virtual Qt3DRender::QRenderSettings * renderSettings()=0
Returns access to the engine's render settings (the frame graph can be accessed from here)
Base class for all renderers that may to participate in 3D view.
virtual QString type() const =0
Returns unique identifier of the renderer class (used to identify subclass)
virtual Qt3DCore::QEntity * createEntity(Qgs3DMapSettings *map) const =0
Returns a 3D entity that will be used to show renderer's data in 3D scene.
double maximumGroundError() const
Returns the maximum ground error of terrain tiles in world units.
int mapTileResolution() const
Returns the resolution (in pixels) of the texture of a terrain tile.
class containing the configuration of ambient occlusion rendering 3
float radius() const
Returns the radius parameter of the ambient occlusion effect.
bool isEnabled() const
Returns whether ambient occlusion effect is enabled.
float intensity() const
Returns the shading factor of the ambient occlusion effect.
float threshold() const
Returns at what amount of occlusion the effect will kick in.
static QgsSourceCache * sourceCache()
Returns the application's source cache, used for caching embedded and remote source strings as local ...
A 3-dimensional box composed of x, y, z coordinates.
double zMaximum() const
Returns the maximum z value.
double zMinimum() const
Returns the minimum z value.
Qt3DRender::QCamera * camera() const
Returns camera that is being controlled.
float distance() const
Returns distance of the camera from the point it is looking at.
void setCameraNavigationMode(Qgis::NavigationMode navigationMode)
Sets the navigation mode used by the camera controller.
void cameraChanged()
Emitted when camera has been updated.
void frameTriggered(float dt)
Called internally from 3D scene when a new frame is generated. Updates camera according to keyboard/m...
void resetView(float distance)
Move camera back to the initial position (looking down towards origin of world's coordinates)
void setViewFromTop(float worldX, float worldY, float distance, float yaw=0)
Sets camera to look down towards given point in world coordinate, in given distance from plane with z...
void setOrigin(const QgsVector3D &origin)
Reacts to the shift of origin of the scene, updating camera pose and any other member variables so th...
void setCameraMovementSpeed(double movementSpeed)
Sets the camera movement speed.
void cameraRotationCenterChanged(QVector3D position)
Emitted when the camera rotation center changes.
A skybox constructed from a 6 cube faces.
QgsRange which stores a range of double values.
bool isInfinite() const
Returns true if the range consists of all possible values.
void addClipPlanes(int nrClipPlanes)
Setups nrClipPlanes clip planes in the forward pass to enable OpenGL clipping.
void removeClipPlanes()
Disables OpenGL clipping.
void setShadowBias(float shadowBias)
Sets the shadow bias value.
void setupShadowMapDebugging(bool enabled, Qt::Corner corner, double size)
Sets the shadow map debugging view port.
void setShadowMapResolution(int resolution)
Sets the resolution of the shadow map.
void setAmbientOcclusionIntensity(float intensity)
Sets the ambient occlusion intensity.
Qt3DRender::QLayer * transparentObjectLayer()
Returns a layer object used to indicate that the object is transparent.
void setDebugOverlayEnabled(bool enabled)
Sets whether debug overlay is enabled.
void setShadowRenderingEnabled(bool enabled)
Sets whether the shadow rendering is enabled.
void setupDepthMapDebugging(bool enabled, Qt::Corner corner, double size)
Sets the depth map debugging view port.
void setupDirectionalLight(const QgsDirectionalLightSettings &light, float maximumShadowRenderingDistance)
Sets shadow rendering to use a directional light.
void setAmbientOcclusionThreshold(float threshold)
Sets the ambient occlusion threshold.
void setupEyeDomeLighting(bool enabled, double strength, int distance)
Sets eye dome lighting shading related settings.
void setAmbientOcclusionEnabled(bool enabled)
Sets whether Screen Space Ambient Occlusion will be enabled.
void setAmbientOcclusionRadius(float radius)
Sets the ambient occlusion radius.
virtual QgsDoubleRange calculateZRange(QgsMapLayer *layer) const
Attempts to calculate the overall elevation or z range for the specified layer, using the settings de...
Base class for storage of map layer temporal properties.
Base class for all map layer types.
QgsAbstract3DRenderer * renderer3D() const
Returns 3D renderer associated with the layer.
void request3DUpdate()
Signal emitted when a layer requires an update in any 3D maps.
void renderer3DChanged()
Signal emitted when 3D renderer associated with the layer has changed.
void rendererChanged()
Signal emitted when renderer is changed.
virtual QgsMapLayerTemporalProperties * temporalProperties()
Returns the layer's temporal properties.
void layerModified()
Emitted when modifications has been done on layer.
double verticalScale() const
Returns mesh vertical scale.
int verticalDatasetGroupIndex() const
Returns the index of the dataset group that will be used to render the vertical component of the 3D m...
void setMaximumTextureSize(int maximumTextureSize)
Sets the maximum texture size supported by the hardware Used to store the GL_MAX_TEXTURE_SIZE value t...
QgsMesh3DSymbol * clone() const override SIP_FACTORY
Returns a new instance of the symbol with the same settings.
3D renderer that renders all mesh triangles of a mesh layer.
void setSymbol(QgsMesh3DSymbol *symbol)
Sets 3D symbol associated with the renderer.
const QgsMesh3DSymbol * symbol() const
Returns 3D symbol associated with the renderer.
void setLayer(QgsMeshLayer *layer)
Sets vector layer associated with the renderer.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
virtual void showMessage(bool blocking=true)=0
display the message to the user and deletes itself
A skybox constructed from a panoramic image.
void setViewportSize(const QSizeF size)
Set the size of the view port.
Qgis::Point3DShape shape() const
Returns 3D shape for points.
QVariant shapeProperty(const QString &property) const
Returns the value for a specific shape property.
3D renderer that renders all points from a point cloud layer
void setLayer(QgsPointCloudLayer *layer)
Sets point cloud layer associated with the renderer.
Represents a map layer supporting display of point clouds.
QgsMapLayerElevationProperties * elevationProperties() override
Returns the layer's elevation properties.
void subsetStringChanged()
Emitted when the layer's subset string has changed.
A class to represent a 2D point.
A template based class for storing ranges (lower to upper values).
T lower() const
Returns the lower bound of the range.
T upper() const
Returns the upper bound of the range.
bool isEmpty() const
Returns true if the range is empty, ie the lower bound equals (or exceeds) the upper bound and either...
A representation of a ray in 3D.
A rectangle specified with double values.
QList< QgsRuleBased3DRenderer::Rule * > RuleList
class containing the configuration of shadows rendering 3
int selectedDirectionalLight() const
Returns the selected direcctional light used to cast shadows.
bool renderShadows() const
Returns whether shadow rendering is enabled.
int shadowMapResolution() const
Returns the resolution of the shadow map texture used to generate the shadows.
double maximumShadowRenderingDistance() const
Returns the maximum shadow rendering distance accounted for when rendering shadows Objects further aw...
double shadowBias() const
Returns the shadow bias used to correct the numerical imprecision of shadows (for the depth test) Thi...
Contains the configuration of a skybox entity.
QMap< QString, QString > cubeMapFacesPaths() const
Returns a map containing the path of each texture specified by the user.
QgsSkyboxEntity::SkyboxType skyboxType() const
Returns the type of the skybox.
QString panoramicTexturePath() const
Returns the panoramic texture path of a skybox of type "Panormaic skybox".
void remoteSourceFetched(const QString &url)
Emitted when the cache has finished retrieving a 3D model from a remote url.
virtual QgsBox3D rootChunkBox3D(const Qgs3DMapSettings &map) const
Returns 3D box (in map coordinates) of the root chunk.
virtual float rootChunkError(const Qgs3DMapSettings &map) const
Returns error of the root chunk in world coordinates.
virtual QgsRectangle rootChunkExtent() const =0
extent of the terrain's root chunk in terrain's CRS
void setLayer(QgsTiledSceneLayer *layer)
Sets tiled scene layer associated with the renderer.
Represents a map layer supporting display of tiled scene objects.
QgsMapLayerElevationProperties * elevationProperties() override
Returns the layer's elevation properties.
Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double precisi...
double y() const
Returns Y coordinate.
double z() const
Returns Z coordinate.
double x() const
Returns X coordinate.
3D renderer that renders all features of a vector layer with the same 3D symbol.
Represents a vector layer which manages a vector based data sets.
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
bool qgsFloatNear(float a, float b, float epsilon=4 *FLT_EPSILON)
Compare two floats (but allow some difference)
#define QgsDebugMsgLevel(str, level)