18#include <Qt3DRender/QCamera>
19#include <Qt3DRender/QMesh>
20#include <Qt3DRender/QObjectPicker>
21#include <Qt3DRender/QPickEvent>
22#include <Qt3DRender/QPickingSettings>
23#include <Qt3DRender/QPickTriangleEvent>
24#include <Qt3DRender/QRenderSettings>
25#include <Qt3DRender/QSceneLoader>
26#include <Qt3DExtras/QForwardRenderer>
27#include <Qt3DExtras/QPhongMaterial>
28#include <Qt3DExtras/QPhongAlphaMaterial>
29#include <Qt3DExtras/QDiffuseSpecularMaterial>
30#include <Qt3DExtras/QSphereMesh>
31#include <Qt3DLogic/QFrameAction>
32#include <Qt3DRender/QEffect>
33#include <Qt3DRender/QTechnique>
34#include <Qt3DRender/QRenderPass>
35#include <Qt3DRender/QRenderState>
36#include <Qt3DRender/QCullFace>
37#include <Qt3DRender/QDepthTest>
42#include <QOpenGLContext>
43#include <QOpenGLFunctions>
93 onBackgroundColorChanged();
98 mEngine->
renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::OnDemand );
101 mEngine->
renderSettings()->pickingSettings()->setPickMethod( Qt3DRender::QPickingSettings::TrianglePicking );
103 QRect viewportRect( QPoint( 0, 0 ), mEngine->
size() );
106 float aspectRatio = ( float )viewportRect.width() / viewportRect.height();
107 mEngine->
camera()->lens()->setPerspectiveProjection( mMap.
fieldOfView(), aspectRatio, 10.f, 10000.0f );
109 mFrameAction =
new Qt3DLogic::QFrameAction();
110 connect( mFrameAction, &Qt3DLogic::QFrameAction::triggered,
111 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->
shapeProperties()[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->
shapeProperties()[QStringLiteral(
"model" )].toString() == url )
177 removeLayerEntity( layer );
178 addLayerEntity( layer );
189 onRenderersChanged();
197 onSkyboxSettingsChanged();
202 onEyeDomeShadingSettingsChanged();
204 onDebugShadowMapSettingsChanged();
205 onDebugDepthMapSettingsChanged();
207 onAmbientOcclusionSettingsChanged();
210 onCameraMovementSpeedChanged();
212 on3DAxisSettingsChanged();
219 const double side = std::max( extent.
width(), extent.
height() );
220 double d = side / 2 / std::tan(
cameraController()->camera()->fieldOfView() / 2 * M_PI / 180 );
222 mCameraController->
resetView(
static_cast< float >( d ) );
233 float xSide = std::abs( p1.
x() - p2.
x() );
234 float ySide = std::abs( p1.
z() - p2.
z() );
237 float fov = 2 * std::atan( std::tan( qDegreesToRadians(
cameraController()->camera()->fieldOfView() ) / 2 ) *
cameraController()->camera()->aspectRatio() );
238 float r = xSide / 2.0f / std::tan( fov / 2.0f );
243 float fov = qDegreesToRadians(
cameraController()->camera()->fieldOfView() );
244 float r = ySide / 2.0f / std::tan( fov / 2.0f );
251 Qt3DRender::QCamera *camera = mCameraController->
camera();
252 QVector<QgsPointXY> extent;
253 QVector<int> pointsOrder = { 0, 1, 3, 2 };
254 for (
int i : pointsOrder )
256 const QPoint p( ( ( i >> 0 ) & 1 ) ? 0 : mEngine->
size().width(), ( ( i >> 1 ) & 1 ) ? 0 : mEngine->
size().height() );
259 if ( dir.y() == 0.0 )
260 dir.setY( 0.000001 );
261 double t = - ray.
origin().y() / dir.y();
265 t = camera->farPlane();
270 t = std::min<float>( t, camera->farPlane() );
272 QVector3D planePoint = ray.
origin() + t * dir;
281 return mTerrain ? mTerrain->pendingJobsCount() : 0;
287 for ( QgsChunkedEntity *entity : std::as_const( mChunkEntities ) )
288 count += entity->pendingJobsCount();
294 if ( mPickHandlers.isEmpty() )
297 for ( Qt3DCore::QEntity *entity : mLayerEntities )
299 if ( QgsChunkedEntity *chunkedEntity = qobject_cast<QgsChunkedEntity *>( entity ) )
300 chunkedEntity->setPickingEnabled(
true );
304 mPickHandlers.append( pickHandler );
309 mPickHandlers.removeOne( pickHandler );
311 if ( mPickHandlers.isEmpty() )
314 for ( Qt3DCore::QEntity *entity : mLayerEntities )
316 if ( QgsChunkedEntity *chunkedEntity = qobject_cast<QgsChunkedEntity *>( entity ) )
317 chunkedEntity->setPickingEnabled(
false );
322void Qgs3DMapScene::onLayerEntityPickedObject( Qt3DRender::QPickEvent *pickEvent,
QgsFeatureId fid )
324 QgsMapLayer *layer = mLayerEntities.key( qobject_cast<QgsChunkedEntity *>( sender() ) );
334 pickHandler->handlePickOnVectorLayer( vlayer, fid, pickEvent->worldIntersection(), pickEvent );
340 Qt3DRender::QCamera *camera = mCameraController->
camera();
341 float fov = camera->fieldOfView();
342 const QSize size = mEngine->
size();
343 float screenSizePx = std::max( size.width(), size.height() );
347 float frustumWidthAtDistance = 2 * distance * tan( fov / 2 );
348 float err = frustumWidthAtDistance * epsilon / screenSizePx;
354 Qt3DRender::QCamera *camera = engine->
camera();
355 QgsChunkedEntity::SceneState state;
356 state.cameraFov = camera->fieldOfView();
357 state.cameraPos = camera->position();
358 const QSize size = engine->
size();
359 state.screenSizePx = std::max( size.width(), size.height() );
360 state.viewProjectionMatrix = camera->projectionMatrix() * camera->viewMatrix();
364void Qgs3DMapScene::onCameraChanged()
366 if ( mMap.
projectionType() == Qt3DRender::QCameraLens::OrthographicProjection )
368 QRect viewportRect( QPoint( 0, 0 ), mEngine->
size() );
369 const float viewWidthFromCenter = mCameraController->
distance();
370 const float viewHeightFromCenter = viewportRect.height() * viewWidthFromCenter / viewportRect.width();
371 mEngine->
camera()->lens()->setOrthographicProjection( -viewWidthFromCenter, viewWidthFromCenter, -viewHeightFromCenter, viewHeightFromCenter, mEngine->
camera()->nearPlane(), mEngine->
camera()->farPlane() );
375 bool changedCameraPlanes = updateCameraNearFarPlanes();
377 if ( changedCameraPlanes )
382 updateCameraNearFarPlanes();
385 onShadowSettingsChanged();
393 QVector<Qt3DCore::QComponent *> toBeRemovedComponents;
394 for ( Qt3DCore::QComponent *component : entity->components() )
396 Qt3DRender::QLayer *layer = qobject_cast<Qt3DRender::QLayer *>( component );
397 if ( layer !=
nullptr )
398 toBeRemovedComponents.push_back( layer );
400 for ( Qt3DCore::QComponent *component : toBeRemovedComponents )
401 entity->removeComponent( component );
402 for ( Qt3DCore::QEntity *obj : entity->findChildren<Qt3DCore::QEntity *>() )
404 if ( obj !=
nullptr )
411 for ( Qt3DRender::QLayer *layer : layers )
412 entity->addComponent( layer );
413 for ( Qt3DCore::QEntity *child : entity->findChildren<Qt3DCore::QEntity *>() )
415 if ( child !=
nullptr )
420void Qgs3DMapScene::updateScene()
422 QgsEventTracing::addEvent( QgsEventTracing::Instant, QStringLiteral(
"3D" ), QStringLiteral(
"Update Scene" ) );
423 for ( QgsChunkedEntity *entity : std::as_const( mChunkEntities ) )
425 if ( entity->isEnabled() )
431static void _updateNearFarPlane(
const QList<QgsChunkNode *> &activeNodes,
const QMatrix4x4 &viewMatrix,
float &fnear,
float &ffar )
433 for ( QgsChunkNode *node : activeNodes )
438 for (
int i = 0; i < 8; ++i )
440 QVector4D p( ( ( i >> 0 ) & 1 ) ? bbox.
xMin : bbox.
xMax,
441 ( ( i >> 1 ) & 1 ) ? bbox.
yMin : bbox.
yMax,
442 ( ( i >> 2 ) & 1 ) ? bbox.
zMin : bbox.
zMax, 1 );
444 QVector4D pc = viewMatrix * p;
448 fnear = std::min( fnear, dst );
449 ffar = std::max( ffar, dst );
454bool Qgs3DMapScene::updateCameraNearFarPlanes()
469 QMatrix4x4 viewMatrix = camera->viewMatrix();
472 QList<QgsChunkNode *> activeNodes;
474 activeNodes = mTerrain->activeNodes();
479 if ( mTerrain && activeNodes.isEmpty() )
480 activeNodes << mTerrain->rootNode();
482 _updateNearFarPlane( activeNodes, viewMatrix, fnear, ffar );
486 for ( QgsChunkedEntity *e : std::as_const( mChunkEntities ) )
490 QList<QgsChunkNode *> activeEntityNodes = e->activeNodes();
491 if ( activeEntityNodes.empty() )
492 activeEntityNodes << e->rootNode();
493 _updateNearFarPlane( activeEntityNodes, viewMatrix, fnear, ffar );
502 std::swap( fnear, ffar );
504 if ( fnear == 1e9 && ffar == 0 )
508 qWarning() <<
"oops... this should not happen! couldn't determine near/far plane. defaulting to 1...1e9";
514 float newFar = ffar * 2;
515 float newNear = fnear / 2;
518 camera->setFarPlane( newFar );
519 camera->setNearPlane( newNear );
526void Qgs3DMapScene::onFrameTriggered(
float dt )
530 for ( QgsChunkedEntity *entity : std::as_const( mChunkEntities ) )
532 if ( entity->isEnabled() && entity->needsUpdate() )
542 static int frameCount = 0;
543 static float accumulatedTime = 0.0f;
553 accumulatedTime += dt;
554 if ( accumulatedTime >= 0.2f )
556 float fps = ( float )frameCount / accumulatedTime;
558 accumulatedTime = 0.0f;
563void Qgs3DMapScene::createTerrain()
567 mChunkEntities.removeOne( mTerrain );
569 mTerrain->deleteLater();
573 if ( !mTerrainUpdateScheduled )
576 QTimer::singleShot( 0,
this, &Qgs3DMapScene::createTerrainDeferred );
577 mTerrainUpdateScheduled =
true;
586void Qgs3DMapScene::createTerrainDeferred()
595 mMap.
terrainGenerator()->setupQuadtree( rootBbox, rootError, maxZoomLevel, clippingBbox );
597 mTerrain =
new QgsTerrainEntity( mMap );
598 mTerrain->setParent(
this );
601 mChunkEntities << mTerrain;
612 const QList<QgsMapLayer *> layers = mMap.
layers();
616 removeLayerEntity( layer );
619 addLayerEntity( layer );
624 mTerrainUpdateScheduled =
false;
627void Qgs3DMapScene::onBackgroundColorChanged()
632void Qgs3DMapScene::updateLights()
634 for ( Qt3DCore::QEntity *entity : std::as_const( mLightEntities ) )
635 entity->deleteLater();
636 mLightEntities.clear();
638 const QList< QgsLightSource * > newLights = mMap.
lightSources();
641 mLightEntities.append( source->createEntity( mMap,
this ) );
644 onShadowSettingsChanged();
647void Qgs3DMapScene::updateCameraLens()
654void Qgs3DMapScene::onRenderersChanged()
657 qDeleteAll( mRenderersEntities );
658 mRenderersEntities.clear();
661 const QList<QgsAbstract3DRenderer *> renderers = mMap.
renderers();
664 Qt3DCore::QEntity *newEntity = renderer->createEntity( mMap );
667 newEntity->setParent(
this );
668 finalizeNewEntity( newEntity );
669 mRenderersEntities[renderer] = newEntity;
674void Qgs3DMapScene::onLayerRenderer3DChanged()
676 QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
680 removeLayerEntity( layer );
683 addLayerEntity( layer );
686void Qgs3DMapScene::onLayersChanged()
688 QSet<QgsMapLayer *> layersBefore = qgis::listToSet( mLayerEntities.keys() );
689 QList<QgsMapLayer *> layersAdded;
690 const QList<QgsMapLayer *> layers = mMap.
layers();
693 if ( !layersBefore.contains( layer ) )
695 layersAdded << layer;
699 layersBefore.remove( layer );
704 for (
QgsMapLayer *layer : std::as_const( layersBefore ) )
706 removeLayerEntity( layer );
709 for (
QgsMapLayer *layer : std::as_const( layersAdded ) )
711 addLayerEntity( layer );
717 const QList<QgsMapLayer * > layers = mLayerEntities.keys();
722 removeLayerEntity( layer );
723 addLayerEntity( layer );
728void Qgs3DMapScene::addLayerEntity(
QgsMapLayer *layer )
730 bool needsSceneUpdate =
false;
738 if ( layer->
type() == Qgis::LayerType::Vector &&
739 ( renderer->
type() == QLatin1String(
"vector" ) || renderer->
type() == QLatin1String(
"rulebased" ) ) )
742 if ( renderer->
type() == QLatin1String(
"vector" ) )
745 if ( vlayer->
geometryType() == Qgis::GeometryType::Point )
750 mModelVectorLayers.append( layer );
754 else if ( renderer->
type() == QLatin1String(
"rulebased" ) )
757 for (
auto rule : rules )
762 mModelVectorLayers.append( layer );
768 else if ( layer->
type() == Qgis::LayerType::Mesh && renderer->
type() == QLatin1String(
"mesh" ) )
779 else if ( layer->
type() == Qgis::LayerType::PointCloud && renderer->
type() == QLatin1String(
"pointcloud" ) )
785 Qt3DCore::QEntity *newEntity = renderer->
createEntity( mMap );
788 newEntity->setParent(
this );
789 mLayerEntities.insert( layer, newEntity );
791 finalizeNewEntity( newEntity );
793 if ( QgsChunkedEntity *chunkedNewEntity = qobject_cast<QgsChunkedEntity *>( newEntity ) )
795 mChunkEntities.append( chunkedNewEntity );
796 needsSceneUpdate =
true;
798 chunkedNewEntity->setPickingEnabled( !mPickHandlers.isEmpty() );
799 connect( chunkedNewEntity, &QgsChunkedEntity::pickedObject,
this, &Qgs3DMapScene::onLayerEntityPickedObject );
801 connect( chunkedNewEntity, &QgsChunkedEntity::newEntityCreated,
this, [
this]( Qt3DCore::QEntity * entity )
803 finalizeNewEntity( entity );
811 if ( needsSceneUpdate )
816 if ( layer->
type() == Qgis::LayerType::Vector )
823 if ( layer->
type() == Qgis::LayerType::Mesh )
828 if ( layer->
type() == Qgis::LayerType::PointCloud )
836void Qgs3DMapScene::removeLayerEntity(
QgsMapLayer *layer )
838 Qt3DCore::QEntity *entity = mLayerEntities.take( layer );
840 if ( QgsChunkedEntity *chunkedEntity = qobject_cast<QgsChunkedEntity *>( entity ) )
842 mChunkEntities.removeOne( chunkedEntity );
846 entity->deleteLater();
850 if ( layer->
type() == Qgis::LayerType::Vector )
855 mModelVectorLayers.removeAll( layer );
858 if ( layer->
type() == Qgis::LayerType::Mesh )
863 if ( layer->
type() == Qgis::LayerType::PointCloud )
871void Qgs3DMapScene::finalizeNewEntity( Qt3DCore::QEntity *newEntity )
875 for ( QgsLineMaterial *lm : newEntity->findChildren<QgsLineMaterial *>() )
879 lm->setViewportSize( mEngine->
size() );
882 lm->setViewportSize( mEngine->
size() );
889 bm->setViewportSize( mEngine->
size() );
892 bm->setViewportSize( mEngine->
size() );
898 for ( Qt3DRender::QMaterial *material : newEntity->findChildren<Qt3DRender::QMaterial *>() )
901 if ( Qt3DExtras::QDiffuseSpecularMaterial *ph = qobject_cast<Qt3DExtras::QDiffuseSpecularMaterial *>( material ) )
903 if ( ph->diffuse().value<QColor>().alphaF() != 1.0f )
905 Qt3DCore::QEntity *entity = qobject_cast<Qt3DCore::QEntity *>( ph->parent() );
906 if ( entity && !entity->components().contains( transparentLayer ) )
908 entity->addComponent( transparentLayer );
915 Qt3DRender::QEffect *effect = material->effect();
918 for (
const auto *parameter : effect->parameters() )
920 if ( parameter->name() ==
"opacity" && parameter->value() != 1.0f )
922 Qt3DCore::QEntity *entity = qobject_cast<Qt3DCore::QEntity *>( material->parent() );
923 if ( entity && !entity->components().contains( transparentLayer ) )
925 entity->addComponent( transparentLayer );
935int Qgs3DMapScene::maximumTextureSize()
const
937 QSurface *surface = mEngine->
surface();
938 QOpenGLContext context;
940 bool success = context.makeCurrent( surface );
944 QOpenGLFunctions openglFunctions = QOpenGLFunctions( &context );
947 openglFunctions.initializeOpenGLFunctions();
948 openglFunctions.glGetIntegerv( GL_MAX_TEXTURE_SIZE, &size );
958void Qgs3DMapScene::addCameraViewCenterEntity( Qt3DRender::QCamera *camera )
960 mEntityCameraViewCenter =
new Qt3DCore::QEntity;
962 Qt3DCore::QTransform *trCameraViewCenter =
new Qt3DCore::QTransform;
963 mEntityCameraViewCenter->addComponent( trCameraViewCenter );
964 connect( camera, &Qt3DRender::QCamera::viewCenterChanged,
this, [trCameraViewCenter, camera]
966 trCameraViewCenter->setTranslation( camera->viewCenter() );
969 Qt3DExtras::QPhongMaterial *materialCameraViewCenter =
new Qt3DExtras::QPhongMaterial;
970 materialCameraViewCenter->setAmbient( Qt::red );
971 mEntityCameraViewCenter->addComponent( materialCameraViewCenter );
973 Qt3DExtras::QSphereMesh *rendererCameraViewCenter =
new Qt3DExtras::QSphereMesh;
974 rendererCameraViewCenter->setRadius( 10 );
975 mEntityCameraViewCenter->addComponent( rendererCameraViewCenter );
978 mEntityCameraViewCenter->setParent(
this );
988 if ( mSceneState == state )
994void Qgs3DMapScene::updateSceneState()
996 if ( mTerrainUpdateScheduled )
1002 for ( QgsChunkedEntity *entity : std::as_const( mChunkEntities ) )
1004 if ( entity->isEnabled() && entity->pendingJobsCount() > 0 )
1011 setSceneState(
Ready );
1014void Qgs3DMapScene::onSkyboxSettingsChanged()
1017 if ( mSkybox !=
nullptr )
1019 mSkybox->deleteLater();
1027 QMap<QString, QString> faces;
1033 faces[QStringLiteral(
"posX" )], faces[QStringLiteral(
"posY" )], faces[QStringLiteral(
"posZ" )],
1034 faces[QStringLiteral(
"negX" )], faces[QStringLiteral(
"negY" )], faces[QStringLiteral(
"negZ" )],
1045void Qgs3DMapScene::onShadowSettingsChanged()
1049 const QList< QgsLightSource * > lightSources = mMap.
lightSources();
1050 QList< QgsDirectionalLightSettings * > directionalLightSources;
1055 directionalLightSources << qgis::down_cast< QgsDirectionalLightSettings * >( source );
1061 if ( shadowSettings.
renderShadows() && selectedLight >= 0 && selectedLight < directionalLightSources.count() )
1073void Qgs3DMapScene::onAmbientOcclusionSettingsChanged()
1083void Qgs3DMapScene::onDebugShadowMapSettingsChanged()
1089void Qgs3DMapScene::onDebugDepthMapSettingsChanged()
1095void Qgs3DMapScene::onDebugOverlayEnabledChanged()
1101void Qgs3DMapScene::onEyeDomeShadingSettingsChanged()
1111void Qgs3DMapScene::onCameraMovementSpeedChanged()
1116void Qgs3DMapScene::onCameraNavigationModeChanged()
1123 QVector<QString> notParsedLayers;
1133 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); ++it )
1136 Qt3DCore::QEntity *rootEntity = it.value();
1138 switch ( layerType )
1140 case Qgis::LayerType::Vector:
1142 notParsedLayers.push_back( layer->
name() );
1144 case Qgis::LayerType::Raster:
1145 case Qgis::LayerType::Plugin:
1146 case Qgis::LayerType::Mesh:
1147 case Qgis::LayerType::VectorTile:
1148 case Qgis::LayerType::Annotation:
1149 case Qgis::LayerType::PointCloud:
1150 case Qgis::LayerType::Group:
1151 notParsedLayers.push_back( layer->
name() );
1161 if ( !notParsedLayers.empty() )
1163 QString message = tr(
"The following layers were not exported:" ) +
"\n";
1164 for (
const QString &layerName : notParsedLayers )
1165 message += layerName +
"\n";
1172 QVector<const QgsChunkNode *> chunks;
1173 if ( !mLayerEntities.contains( layer ) )
return chunks;
1174 if ( QgsChunkedEntity *
c = qobject_cast<QgsChunkedEntity *>( mLayerEntities[ layer ] ) )
1176 for ( QgsChunkNode *n :
c->activeNodes() )
1177 chunks.push_back( n );
1189 double yMin = std::numeric_limits< double >::max();
1190 double yMax = std::numeric_limits< double >::lowest();
1193 const QgsAABB bbox = mTerrain->rootNode()->bbox();
1194 yMin = std::min( yMin,
static_cast< double >( bbox.
yMin ) );
1195 yMax = std::max( yMax,
static_cast< double >( bbox.
yMax ) );
1198 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); it++ )
1201 if ( layer->
type() == Qgis::LayerType::PointCloud )
1205 yMin = std::min( yMin, zRange.
lower() );
1206 yMax = std::max( yMax, zRange.
upper() );
1209 const QgsDoubleRange yRange( std::min( yMin, std::numeric_limits<double>::max() ),
1210 std::max( yMax, std::numeric_limits<double>::lowest() ) );
1221 mEntityRotationCenter =
new Qt3DCore::QEntity;
1223 Qt3DCore::QTransform *trCameraViewCenter =
new Qt3DCore::QTransform;
1224 mEntityRotationCenter->addComponent( trCameraViewCenter );
1225 Qt3DExtras::QPhongMaterial *materialCameraViewCenter =
new Qt3DExtras::QPhongMaterial;
1226 materialCameraViewCenter->setAmbient( Qt::blue );
1227 mEntityRotationCenter->addComponent( materialCameraViewCenter );
1228 Qt3DExtras::QSphereMesh *rendererCameraViewCenter =
new Qt3DExtras::QSphereMesh;
1229 rendererCameraViewCenter->setRadius( 10 );
1230 mEntityRotationCenter->addComponent( rendererCameraViewCenter );
1231 mEntityRotationCenter->setEnabled(
true );
1232 mEntityRotationCenter->setParent(
this );
1236 trCameraViewCenter->setTranslation( center );
1247void Qgs3DMapScene::on3DAxisSettingsChanged()
1257 m3DAxis =
new Qgs3DAxis(
static_cast<Qt3DExtras::Qt3DWindow *
>(
engine->window() ),
LayerType
Types of layers that can be added to a map.
@ 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.
void unregisterPickHandler(Qgs3DMapScenePickHandler *pickHandler)
Unregisters previously registered pick handler. Pick handler is not deleted. Also removes object pick...
QVector< const QgsChunkNode * > getLayerActiveChunkNodes(QgsMapLayer *layer)
Returns the active chunk nodes of layer.
void exportScene(const Qgs3DMapExportSettings &exportSettings)
Exports the scene according to the scene export settings.
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.
QgsAbstract3DEngine * engine()
Returns the abstract 3D engine.
void fpsCountChanged(float fpsCount)
Emitted when the FPS count changes.
QgsRectangle sceneExtent()
Returns the scene extent in the map's CRS.
void setViewFrom2DExtent(const QgsRectangle &extent)
Resets camera view to show the extent extent (top view)
void registerPickHandler(Qgs3DMapScenePickHandler *pickHandler)
Registers an object that will get results of pick events on 3D entities. Does not take ownership of t...
Qgs3DMapScene(Qgs3DMapSettings &map, QgsAbstract3DEngine *engine)
Constructs a 3D scene based on map settings and Qt 3D renderer configuration.
QgsDoubleRange elevationRange() const
Returns the scene's elevation range.
SceneState
Enumeration of possible states of the 3D scene.
@ Ready
The scene is fully loaded/updated.
@ Updating
The scene is still being loaded/updated.
int totalPendingJobsCount() const
Returns number of pending jobs for all chunked entities.
void updateTemporal()
Updates the temporale entities.
static 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.
void sceneStateChanged()
Emitted when the scene's state has changed.
int terrainPendingJobsCount() const
Returns number of pending jobs of the terrain entity.
float worldSpaceError(float epsilon, float distance)
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.
QgsCameraController * cameraController()
Returns camera controller.
static std::function< QMap< QString, Qgs3DMapScene * >() > sOpenScenesFunction
Static function for returning open 3D map scenes.
QVector< QgsPointXY > viewFrustum2DExtent()
Calculates the 2D extent viewed by the 3D camera as the vertices of the viewed trapezoid.
void viewZoomFull()
Resets camera view to show the whole scene (top view)
void extentChanged()
Emitted when the 3d view's 2d extent has changed.
void mapTileResolutionChanged()
Emitted when the map tile resoulution has changed.
void terrainVerticalScaleChanged()
Emitted when the vertical scale of the terrain 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 renderersChanged()
Emitted when the list of map's extra renderers have been modified.
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.
void cameraNavigationModeChanged()
Emitted when the camera navigation mode was changed.
void shadowSettingsChanged()
Emitted when shadow rendering settings are changed.
float maxTerrainGroundError() const
Returns maximum ground error of terrain tiles in world units.
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.
QList< QgsAbstract3DRenderer * > renderers() const
Returns list of extra 3D renderers.
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 project's CRS.
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.
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)
void maxTerrainScreenErrorChanged()
Emitted when the maximum terrain screen error has changed.
int mapTileResolution() const
Returns resolution (in pixels) of the texture of a terrain tile.
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.
void maxTerrainGroundErrorChanged()
Emitted when the maximum terrain ground error 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.
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 save(const QString &sceneName, const QString &sceneFolderPath)
Saves the scene to a .obj file.
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 QgsRay3D rayFromScreenPoint(const QPoint &point, const QSize &windowSize, Qt3DRender::QCamera *camera)
Convert from clicked point on the screen to a ray in world coordinates.
void sizeChanged()
Emitted after a call to setSize()
virtual QSurface * surface() const =0
Returns the surface of the engine.
QgsShadowRenderingFrameGraph * frameGraph()
Returns the shadow rendering frame graph object used to render the scene.
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 ...
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(const Qgs3DMapSettings &map) const =0
Returns a 3D entity that will be used to show renderer's data in 3D scene.
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 ...
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 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.
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 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.
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.
virtual void showMessage(bool blocking=true)=0
display the message to the user and deletes itself
A skybox constructed from a panoramic image.
Shape shape() const
Returns 3D shape for points.
QVariantMap shapeProperties() const
Returns a key-value dictionary of point shape properties.
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.
T lower() const
Returns the lower bound of the range.
T upper() const
Returns the upper bound of the range.
A representation of a ray in 3D.
QVector3D origin() const
Returns the origin of the ray.
QVector3D direction() const
Returns the direction of the ray see setDirection()
A rectangle specified with double values.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
QgsPointXY center() const SIP_HOLDGIL
Returns the center point of the rectangle.
QList< QgsRuleBased3DRenderer::Rule * > RuleList
void setupDepthMapDebugging(bool enabled, Qt::Corner corner, double size)
Sets the depth map debugging view port.
Qt3DRender::QLayer * transparentObjectLayer()
Returns a layer object used to indicate that the object is transparent.
void setAmbientOcclusionThreshold(float threshold)
Sets the ambient occlusion threshold.
void setupShadowMapDebugging(bool enabled, Qt::Corner corner, double size)
Sets the shadow map debugging view port.
void setShadowBias(float shadowBias)
Sets the shadow bias value.
void setAmbientOcclusionIntensity(float intensity)
Sets the ambient occlusion intensity.
void setShadowMapResolution(int resolution)
Sets the resolution of the shadow map.
void setupEyeDomeLighting(bool enabled, double strength, int distance)
Sets eye dome lighting shading related settings.
void setAmbientOcclusionRadius(float radius)
Sets the ambient occlusion radius.
void setDebugOverlayEnabled(bool enabled)
Sets whether debug overlay is enabled.
void setAmbientOcclusionEnabled(bool enabled)
Sets whether Screen Space Ambient Occlusion will be enabled.
void setupDirectionalLight(const QgsDirectionalLightSettings &light, float maximumShadowRenderingDistance)
Sets shadow rendering to use a directional light.
void setShadowRenderingEnabled(bool enabled)
Sets whether the shadow rendering is enabled.
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.
bool isActive() const
Returns true if the temporal property is active.
virtual float rootChunkError(const Qgs3DMapSettings &map) const
Returns error of the root chunk in world coordinates.
virtual QgsAABB rootChunkBbox(const Qgs3DMapSettings &map) const
Returns bounding box of the root chunk.
virtual QgsRectangle rootChunkExtent() const =0
extent of the terrain's root chunk in terrain's CRS
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)
void addQLayerComponentsToHierarchy(Qt3DCore::QEntity *entity, const QVector< Qt3DRender::QLayer * > &layers)
QgsChunkedEntity::SceneState sceneState_(QgsAbstract3DEngine *engine)
void removeQLayerComponentsFromHierarchy(Qt3DCore::QEntity *entity)
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
#define QgsDebugMsgLevel(str, level)