76#include <QOpenGLContext>
77#include <QOpenGLFunctions>
82#include <Qt3DExtras/QDiffuseSpecularMaterial>
83#include <Qt3DExtras/QForwardRenderer>
84#include <Qt3DExtras/QSphereMesh>
85#include <Qt3DLogic/QFrameAction>
86#include <Qt3DRender/QCamera>
87#include <Qt3DRender/QCullFace>
88#include <Qt3DRender/QDepthTest>
89#include <Qt3DRender/QEffect>
90#include <Qt3DRender/QMaterial>
91#include <Qt3DRender/QMesh>
92#include <Qt3DRender/QRenderPass>
93#include <Qt3DRender/QRenderSettings>
94#include <Qt3DRender/QRenderState>
95#include <Qt3DRender/QSceneLoader>
96#include <Qt3DRender/QTechnique>
100#include "tracy/Tracy.hpp"
103#include "moc_qgs3dmapscene.cpp"
105using namespace Qt::StringLiterals;
114 onBackgroundColorChanged();
119 mEngine->renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::OnDemand );
121 QRect viewportRect( QPoint( 0, 0 ), mEngine->size() );
127 float aspectRatio = ( float ) viewportRect.width() / viewportRect.height();
128 mEngine->camera()->lens()->setPerspectiveProjection(
static_cast< float >( mMap.fieldOfView() ), aspectRatio, 10.f, 10000.0f );
130 mFrameAction =
new Qt3DLogic::QFrameAction();
131 connect( mFrameAction, &Qt3DLogic::QFrameAction::triggered,
this, &Qgs3DMapScene::onFrameTriggered );
132 addComponent( mFrameAction );
138 mCameraController->resetGlobe( 10'000'000 );
140 mCameraController->resetView( 1000 );
142 addCameraViewCenterEntity( mEngine->camera() );
143 addCameraRotationCenterEntity( mCameraController );
148 createTerrainDeferred();
181 const QList<QgsMapLayer *> modelVectorLayers = mModelVectorLayers;
187 if ( renderer->
type() ==
"vector"_L1 )
190 if ( pointSymbol && pointSymbol->
shapeProperty( u
"model"_s ).toString() == url )
192 removeLayerEntity( layer );
193 addLayerEntity( layer );
196 else if ( renderer->
type() ==
"rulebased"_L1 )
202 if ( pointSymbol && pointSymbol->
shapeProperty( u
"model"_s ).toString() == url )
204 removeLayerEntity( layer );
205 addLayerEntity( layer );
224 onBackgroundSettingsChanged();
229 onEyeDomeShadingSettingsChanged();
231 onDebugDepthMapSettingsChanged();
233 onAmbientOcclusionSettingsChanged();
235 onMsaaEnabledChanged();
237 onBloomSettingsChanged();
239 onColorGradingSettingsChanged();
244 mOverlayUpdateTimer =
new QTimer(
this );
245 mOverlayUpdateTimer->setSingleShot(
true );
246 mOverlayUpdateTimer->setInterval( 250 );
247 connect( mOverlayUpdateTimer, &QTimer::timeout,
this, &Qgs3DMapScene::applyPendingOverlayUpdate );
250 onShowMapOverlayChanged();
252 onCameraMovementSpeedChanged();
254 on3DAxisSettingsChanged();
256 mDepthBufferRefreshTimer =
new QTimer(
this );
257 mDepthBufferRefreshTimer->setSingleShot(
true );
258 mDepthBufferRefreshTimer->setInterval( 100 );
266 mCameraController->resetGlobe( 10'000'000 );
272 const double side = std::max( extent.
width(), extent.
height() );
273 double d = side / 2 / std::tan(
cameraController()->camera()->fieldOfView() / 2 * M_PI / 180 );
275 mCameraController->resetView(
static_cast<float>( d ) );
286 const double xSide = std::abs( p1.
x() - p2.
x() );
287 const double ySide = std::abs( p1.
y() - p2.
y() );
288 const double side = std::max( xSide, ySide );
290 const double fov = qDegreesToRadians(
cameraController()->camera()->fieldOfView() );
291 double distance = side / 2.0f / std::tan( fov / 2.0f );
296 distance += zRange.
upper();
300 mCameraController->setViewFromTop(
301 static_cast<float>( center.
x() - origin.
x() ),
302 static_cast<float>( center.
y() - origin.
y() ),
303 static_cast<float>( distance )
310 Qt3DRender::QCamera *camera = mCameraController->camera();
311 QVector<QgsPointXY> extent;
313 const QSize size = mEngine->size();
315 const QPoint center( size.width() / 2, size.height() / 2 );
318 const float centerZ = centerWorldPos.z();
319 const QVector3D cameraPosition = camera->position();
321 QVector<int> pointsOrder = { 0, 1, 3, 2 };
322 for (
int i : pointsOrder )
324 const QPoint p( ( ( i >> 0 ) & 1 ) ? 0 : size.width(), ( ( i >> 1 ) & 1 ) ? 0 : size.height() );
327 const QVector3D rayDir = ( edgePoint - cameraPosition ).normalized();
330 if ( std::abs( rayDir.z() ) > 0 )
332 float t = ( centerZ - cameraPosition.z() ) / rayDir.z();
334 t = camera->farPlane();
336 t = std::min<float>( t, camera->farPlane() );
337 worldPos = cameraPosition + t * rayDir;
341 worldPos = cameraPosition + camera->farPlane() * rayDir;
342 worldPos.setZ( centerZ );
345 QgsVector3D mapPos = mMap.worldToMapCoordinates( worldPos );
346 extent.push_back(
QgsPointXY( mapPos.
x(), mapPos.
y() ) );
354 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
355 count += entity->pendingJobsCount();
361 Qt3DRender::QCamera *camera = mCameraController->camera();
362 const double fov = camera->fieldOfView();
363 const QSize size = mEngine->size();
364 const int screenSizePx = std::max( size.width(), size.height() );
368 const double frustumWidthAtDistance = 2 * distance * tan( fov / 2 );
369 const double err = frustumWidthAtDistance * epsilon / screenSizePx;
373void Qgs3DMapScene::onCameraChanged()
375 if ( mDepthBufferRefreshTimer )
376 mDepthBufferRefreshTimer->start();
379 updateCameraNearFarPlanes();
381 onShadowSettingsChanged();
385 schedule2DMapOverlayUpdate();
393 constexpr float ORIGIN_SHIFT_THRESHOLD = 10'000;
394 if ( mSceneOriginShiftEnabled && mEngine->
camera()->position().length() > ORIGIN_SHIFT_THRESHOLD )
402void Qgs3DMapScene::onViewed2DExtentFrom3DChanged()
404 const QSize size = mEngine->size();
405 const QPoint center( size.width() / 2, size.height() / 2 );
407 const double sampledDepth = mCameraController->sampleDepthBuffer( center.x(), center.y() );
409 if ( sampledDepth != 1.0 )
410 mLastCenterDepth = sampledDepth;
416bool Qgs3DMapScene::updateScene(
bool forceUpdate )
418 if ( !mSceneUpdatesEnabled )
424 QgsScopedEvent traceEvent( u
"3D"_s, forceUpdate ? u
"Force update scene"_s : u
"Update scene"_s );
426 Qgs3DMapSceneEntity::SceneContext sceneContext;
427 Qt3DRender::QCamera *camera = mEngine->camera();
428 sceneContext.cameraFov = camera->fieldOfView();
429 sceneContext.cameraPos = camera->position();
430 const QSize size = mEngine->size();
431 sceneContext.screenSizePx = std::max( size.width(), size.height() );
439 QMatrix4x4 projMatrix;
440 switch ( mMap.projectionType() )
444 float fovRadians = ( camera->fieldOfView() / 2.0f ) *
static_cast<float>( M_PI ) / 180.0f;
445 float fovCotan = std::cos( fovRadians ) / std::sin( fovRadians );
448 fovCotan / camera->aspectRatio(), 0, 0, 0,
458 Qt3DRender::QCameraLens *lens = camera->lens();
461 2.0f / ( lens->right() - lens->left() ), 0, 0, 0,
462 0, 2.0f / ( lens->top() - lens->bottom() ), 0, 0,
464 -( lens->left() + lens->right() ) / ( lens->right() - lens->left() ), -( lens->top() + lens->bottom() ) / ( lens->top() - lens->bottom() ), -1.0f, 1.0f
471 projMatrix = camera->projectionMatrix();
473 sceneContext.viewProjectionMatrix = projMatrix * camera->viewMatrix();
476 bool anyUpdated =
false;
477 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
479 if ( forceUpdate || ( entity->isEnabled() && entity->needsUpdate() ) )
482 entity->handleSceneUpdate( sceneContext );
483 if ( entity->hasReachedGpuMemoryLimit() )
493bool Qgs3DMapScene::updateCameraNearFarPlanes()
508 QMatrix4x4 viewMatrix = camera->viewMatrix();
514 for ( Qgs3DMapSceneEntity *se : std::as_const( mSceneEntities ) )
516 const QgsRange<float> depthRange = se->getNearFarPlaneRange( viewMatrix );
518 fnear = std::min( fnear, depthRange.
lower() );
519 ffar = std::max( ffar, depthRange.
upper() );
528 if ( fnear == 1e9 && ffar == 0 )
531 sceneZRange = sceneZRange.
isInfinite() ? QgsDoubleRange( 0.0, 0.0 ) : sceneZRange;
538 std::swap( fnear, ffar );
541 float newFar = ffar * 2;
542 float newNear = fnear / 2;
545 camera->setFarPlane( newFar );
546 camera->setNearPlane( newNear );
553void Qgs3DMapScene::onFrameTriggered(
float dt )
558 QgsEventTracing::addEventToQgisTrace( QgsEventTracing::EventType::Instant, u
"3D"_s, u
"Frame begins"_s );
560 mCameraController->frameTriggered( dt );
565 updateCameraNearFarPlanes();
568 static int frameCount = 0;
569 static float accumulatedTime = 0.0f;
579 accumulatedTime += dt;
580 if ( accumulatedTime >= 0.2f )
582 float fps = ( float ) frameCount / accumulatedTime;
584 accumulatedTime = 0.0f;
589void Qgs3DMapScene::update2DMapOverlay(
const QVector<QgsPointXY> &extent2DAsPoints )
591 QgsFrameGraph *frameGraph = mEngine->frameGraph();
594 if ( !mMap.is2DMapOverlayEnabled() )
596 if ( mMapOverlayEntity )
598 mMapOverlayEntity.reset();
600 overlayRenderView.
setEnabled( mMap.debugDepthMapEnabled() );
604 if ( !mMapOverlayEntity )
606 QgsWindow3DEngine *
engine = qobject_cast<QgsWindow3DEngine *>( mEngine );
608 mMapOverlayEntity->setEnabled(
true );
613 Qt3DRender::QCamera *camera = mEngine->camera();
614 const QgsVector3D extentCenter3D = mMap.worldToMapCoordinates( camera->position() );
615 const QgsPointXY extentCenter2D( extentCenter3D.
x(), extentCenter3D.
y() );
622 double minHalfExtent = std::numeric_limits<double>::max();
623 double maxHalfExtent = 0.0;
624 for (
const QgsPointXY &extentPoint : extent2DAsPoints )
626 const double distance = extentCenter2D.distance( extentPoint );
627 minHalfExtent = std::min( minHalfExtent, distance );
628 maxHalfExtent = std::max( maxHalfExtent, distance );
632 const double sceneHalfExtent = 0.6 * std::max( fullExtent.
width(), fullExtent.
height() );
634 minHalfExtent = std::min( 50., minHalfExtent );
635 maxHalfExtent = std::min( 100., maxHalfExtent );
636 const double smoothFactor = std::sin( mCameraController->pitch() / 90.0 * M_PI_2 );
639 const double adjustedHalfExtent = std::min( 3.0 * ( minHalfExtent + smoothFactor * maxHalfExtent ), sceneHalfExtent );
642 const bool showFrustum = mMap.viewFrustumVisualizationEnabled();
643 mMapOverlayEntity->update( overviewExtent, extent2DAsPoints, mCameraController->yaw(), showFrustum );
646void Qgs3DMapScene::createTerrain()
650 mSceneEntities.removeOne( mTerrain );
658 mSceneEntities.removeOne( mGlobe );
664 if ( !mTerrainUpdateScheduled )
667 QTimer::singleShot( 0,
this, &Qgs3DMapScene::createTerrainDeferred );
668 mTerrainUpdateScheduled =
true;
677void Qgs3DMapScene::createTerrainDeferred()
679 QgsChunkedEntity *terrainOrGlobe =
nullptr;
683 mGlobe =
new QgsGlobeEntity( &mMap );
684 terrainOrGlobe = mGlobe;
686 else if ( mMap.sceneMode() ==
Qgis::SceneMode::Local && mMap.terrainRenderingEnabled() && mMap.terrainGenerator() )
688 double tile0width = mMap.terrainGenerator()->rootChunkExtent().width();
689 int maxZoomLevel =
Qgs3DUtils::maxZoomLevel( tile0width, mMap.terrainSettings()->mapTileResolution(), mMap.terrainSettings()->maximumGroundError() );
690 const QgsBox3D rootBox3D = mMap.terrainGenerator()->rootChunkBox3D( mMap );
691 float rootError = mMap.terrainGenerator()->rootChunkError( mMap );
692 const QgsBox3D clippingBox3D( mMap.extent(), rootBox3D.
zMinimum(), rootBox3D.
zMaximum() );
693 mMap.terrainGenerator()->setupQuadtree( rootBox3D, rootError, maxZoomLevel, clippingBox3D );
695 mTerrain =
new QgsTerrainEntity( &mMap );
696 mTerrain->setObjectName( u
"Terrain"_s );
697 terrainOrGlobe = mTerrain;
700 if ( terrainOrGlobe )
703 QgsFrameGraph *frameGraph = mEngine->frameGraph();
707 terrainOrGlobe->setParent(
this );
710 mSceneEntities << terrainOrGlobe;
713 connect( terrainOrGlobe, &Qgs3DMapSceneEntity::newEntityCreated,
this, [
this]( Qt3DCore::QEntity *entity ) {
715 const QList<QgsGeoTransform *> transforms = entity->findChildren<QgsGeoTransform *>();
716 for ( QgsGeoTransform *transform : transforms )
718 transform->setOrigin( mMap.origin() );
722 handleClippingOnEntity( entity );
727 const QList<QgsMapLayer *>
layers = mMap.layers();
728 for ( QgsMapLayer *layer :
layers )
731 removeLayerEntity( layer );
734 addLayerEntity( layer );
739 mTerrainUpdateScheduled =
false;
742void Qgs3DMapScene::onBackgroundColorChanged()
744 mEngine->setClearColor( mMap.backgroundColor() );
747void Qgs3DMapScene::updateLights()
749 for ( Qt3DCore::QEntity *entity : std::as_const( mLightEntities ) )
750 entity->deleteLater();
751 mLightEntities.clear();
753 QgsFrameGraph *frameGraph = mEngine->frameGraph();
754 const QList<QgsLightSource *> newLights = mMap.lightSources();
755 for (
const QgsLightSource *source : newLights )
757 Qt3DCore::QEntity *entity = source->createEntity( mMap,
this );
759 mLightEntities.append( entity );
762 onShadowSettingsChanged();
765void Qgs3DMapScene::updateCameraLens()
767 mEngine->camera()->lens()->setFieldOfView(
static_cast< float >( mMap.fieldOfView() ) );
768 mEngine->camera()->lens()->setProjectionType(
static_cast<Qt3DRender::QCameraLens::ProjectionType
>( mMap.projectionType() ) );
772void Qgs3DMapScene::onLayerRenderer3DChanged()
774 QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
778 removeLayerEntity( layer );
781 addLayerEntity( layer );
784void Qgs3DMapScene::onLayersChanged()
786 QSet<QgsMapLayer *> layersBefore = qgis::listToSet( mLayerEntities.keys() );
787 QList<QgsMapLayer *> layersAdded;
788 const QList<QgsMapLayer *>
layers = mMap.layers();
789 for ( QgsMapLayer *layer :
layers )
791 if ( !layersBefore.contains( layer ) )
793 layersAdded << layer;
797 layersBefore.remove( layer );
802 for ( QgsMapLayer *layer : std::as_const( layersBefore ) )
804 removeLayerEntity( layer );
807 for ( QgsMapLayer *layer : std::as_const( layersAdded ) )
809 addLayerEntity( layer );
815 const QList<QgsMapLayer *>
layers = mLayerEntities.keys();
820 if ( temporalProperties->isActive() )
822 removeLayerEntity( layer );
823 addLayerEntity( layer );
831 Q_ASSERT( sceneNewEntity );
833 mSceneEntities.append( sceneNewEntity );
835 sceneNewEntity->setParent(
this );
837 finalizeNewEntity( sceneNewEntity );
839 connect( sceneNewEntity, &Qgs3DMapSceneEntity::newEntityCreated,
this, [
this]( Qt3DCore::QEntity *entity ) {
840 finalizeNewEntity( entity );
842 updateCameraNearFarPlanes();
852 Q_ASSERT( sceneEntity );
854 mSceneEntities.removeOne( sceneEntity );
856 sceneEntity->deleteLater();
860void Qgs3DMapScene::addLayerEntity(
QgsMapLayer *layer )
872 if ( renderer->
type() ==
"vector"_L1 )
880 mModelVectorLayers.append( layer );
884 else if ( renderer->
type() ==
"rulebased"_L1 )
887 for (
auto rule : rules )
889 const QgsPoint3DSymbol *pointSymbol =
dynamic_cast<const QgsPoint3DSymbol *
>( rule->symbol() );
892 mModelVectorLayers.append( layer );
897 else if ( renderer->
type() ==
"categorized"_L1 )
899 const Qgs3DCategoryList categories =
static_cast<QgsCategorized3DRenderer *
>( renderer )->categories();
900 for (
const Qgs3DRendererCategory &category : categories )
902 const QgsPoint3DSymbol *pointSymbol =
dynamic_cast<const QgsPoint3DSymbol *
>( category.symbol() );
905 mModelVectorLayers.append( layer );
913 QgsMeshLayer3DRenderer *meshRenderer =
static_cast<QgsMeshLayer3DRenderer *
>( renderer );
914 meshRenderer->
setLayer(
static_cast<QgsMeshLayer *
>( layer ) );
918 QgsMesh3DSymbol *sym = meshRenderer->
symbol()->
clone();
924 QgsPointCloudLayer3DRenderer *pointCloudRenderer =
static_cast<QgsPointCloudLayer3DRenderer *
>( renderer );
925 pointCloudRenderer->
setLayer(
static_cast<QgsPointCloudLayer *
>( layer ) );
929 QgsTiledSceneLayer3DRenderer *tiledSceneRenderer =
static_cast<QgsTiledSceneLayer3DRenderer *
>( renderer );
930 tiledSceneRenderer->
setLayer(
static_cast<QgsTiledSceneLayer *
>( layer ) );
934 auto annotationLayerRenderer = qgis::down_cast<QgsAnnotationLayer3DRenderer *>( renderer );
935 annotationLayerRenderer->setLayer( qobject_cast<QgsAnnotationLayer *>( layer ) );
938 Qt3DCore::QEntity *newEntity = renderer->
createEntity( &mMap );
942 newEntity->setObjectName( u
"%1 3D entity"_s.arg( layer->
name() ) );
944 mLayerEntities.insert( layer, newEntity );
946 if ( Qgs3DMapSceneEntity *sceneNewEntity = qobject_cast<Qgs3DMapSceneEntity *>( newEntity ) )
953 newEntity->setParent(
this );
954 finalizeNewEntity( newEntity );
963 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
976 QgsPointCloudLayer *pclayer = qobject_cast<QgsPointCloudLayer *>( layer );
982void Qgs3DMapScene::removeLayerEntity(
QgsMapLayer *layer )
984 Qt3DCore::QEntity *entity = mLayerEntities.take( layer );
986 if ( Qgs3DMapSceneEntity *sceneEntity = qobject_cast<Qgs3DMapSceneEntity *>( entity ) )
994 entity->deleteLater();
1001 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
1005 mModelVectorLayers.removeAll( layer );
1015 QgsPointCloudLayer *pclayer = qobject_cast<QgsPointCloudLayer *>( layer );
1022void Qgs3DMapScene::finalizeNewEntity( Qt3DCore::QEntity *newEntity )
1025 const QList<QgsGeoTransform *> transforms = newEntity->findChildren<QgsGeoTransform *>();
1026 for ( QgsGeoTransform *transform : transforms )
1028 transform->setOrigin( mMap.origin() );
1032 handleClippingOnEntity( newEntity );
1036 const QList<Qt3DRender::QMaterial *> childMaterials = newEntity->findChildren<Qt3DRender::QMaterial *>();
1040 for ( Qt3DRender::QMaterial *material : childMaterials )
1042 if (
auto lm = qobject_cast< QgsLineMaterial * >( material ) )
1045 lm->setViewportSize( mEngine->size() );
1047 else if (
auto bm = qobject_cast< QgsPoint3DBillboardMaterial * >( material ) )
1050 bm->setViewportSize( mEngine->size() );
1054 QgsFrameGraph *frameGraph = mEngine->frameGraph();
1058 const QVector<Qt3DRender::QLayer *>
layers = newEntity->componentsOfType<Qt3DRender::QLayer>();
1067 for ( Qt3DRender::QMaterial *material : childMaterials )
1071 auto materialEntity = qobject_cast<Qt3DCore::QEntity *>( material->parent() );
1072 if ( !materialEntity )
1075 bool materialCastsShadows =
false;
1076 if (
auto qgsMaterial = qobject_cast< QgsMaterial * >( material ) )
1078 if ( qgsMaterial->castsShadows() )
1080 materialCastsShadows =
true;
1086 materialCastsShadows =
true;
1089 if ( materialCastsShadows && !materialEntity->components().contains( shadowCastingEntityLayer ) )
1091 materialEntity->addComponent( shadowCastingEntityLayer );
1097 if (
auto ph = qobject_cast<Qt3DExtras::QDiffuseSpecularMaterial *>( material ) )
1099 if ( ph->diffuse().value<QColor>().alphaF() != 1.0f )
1101 if ( !materialEntity->components().contains( transparentLayer ) )
1103 materialEntity->addComponent( transparentLayer );
1124 else if (
auto billboardMaterial = qobject_cast<QgsPoint3DBillboardMaterial *>( material ) )
1126 Qt3DCore::QEntity *entity = qobject_cast<Qt3DCore::QEntity *>( billboardMaterial->parent() );
1127 if ( !materialEntity->components().contains( transparentLayer ) )
1129 materialEntity->addComponent( transparentLayer );
1136 if ( Qt3DRender::QEffect *effect = material->effect() )
1138 const QVector<Qt3DRender::QParameter *> parameters = effect->parameters();
1139 for (
const Qt3DRender::QParameter *parameter : parameters )
1141 if ( parameter->name() ==
"opacity" && parameter->value() != 1.0f )
1143 if ( !materialEntity->components().contains( transparentLayer ) )
1145 materialEntity->addComponent( transparentLayer );
1154 if ( childMaterials.empty() )
1157 newEntity->addComponent( shadowCastingEntityLayer );
1161int Qgs3DMapScene::maximumTextureSize()
const
1163 QSurface *surface = mEngine->surface();
1164 QOpenGLContext context;
1166 bool success = context.makeCurrent( surface );
1170 QOpenGLFunctions openglFunctions = QOpenGLFunctions( &context );
1173 openglFunctions.initializeOpenGLFunctions();
1174 openglFunctions.glGetIntegerv( GL_MAX_TEXTURE_SIZE, &size );
1183void Qgs3DMapScene::addCameraViewCenterEntity( Qt3DRender::QCamera *camera )
1185 mEntityCameraViewCenter =
new Qt3DCore::QEntity;
1187 Qt3DCore::QTransform *trCameraViewCenter =
new Qt3DCore::QTransform;
1188 mEntityCameraViewCenter->addComponent( trCameraViewCenter );
1189 connect( camera, &Qt3DRender::QCamera::viewCenterChanged,
this, [trCameraViewCenter, camera] { trCameraViewCenter->setTranslation( camera->viewCenter() ); } );
1191 auto materialCameraViewCenter =
new QgsUnlitMaterial();
1192 materialCameraViewCenter->setColor( Qt::red );
1193 materialCameraViewCenter->setCastsShadows(
false );
1194 mEntityCameraViewCenter->addComponent( materialCameraViewCenter );
1196 Qt3DExtras::QSphereMesh *rendererCameraViewCenter =
new Qt3DExtras::QSphereMesh;
1197 rendererCameraViewCenter->setRadius( 10 );
1198 mEntityCameraViewCenter->addComponent( rendererCameraViewCenter );
1201 mEntityCameraViewCenter->setParent(
this );
1203 QgsFrameGraph *frameGraph = mEngine->frameGraph();
1211 if ( mSceneState == state )
1213 mSceneState = state;
1217void Qgs3DMapScene::updateSceneState()
1219 if ( mTerrainUpdateScheduled )
1225 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
1227 if ( entity->isEnabled() && entity->pendingJobsCount() > 0 )
1234 setSceneState(
Ready );
1237void Qgs3DMapScene::onBackgroundSettingsChanged()
1239 if ( mBackgroundEntity )
1241 mBackgroundEntity->deleteLater();
1242 mBackgroundEntity =
nullptr;
1245 const QgsAbstract3DMapBackgroundSettings *settings = mMap.backgroundSettings();
1252 QgsFrameGraph *frameGraph = mEngine->frameGraph();
1256 const QgsSkyboxSettings *skyboxSettings =
dynamic_cast<const QgsSkyboxSettings *
>( settings );
1259 =
new QgsCubeFacesSkyboxEntity( skyboxSettings->
cubeMapping(), faces[u
"posX"_s], faces[u
"posY"_s], faces[u
"posZ"_s], faces[u
"negX"_s], faces[u
"negY"_s], faces[u
"negZ"_s], skyboxSettings->
environmentalLightingEnabled(),
this );
1260 qgis::down_cast< QgsSkyboxEntity * >( mBackgroundEntity )->updateEnvironmentLight( mEnvironmentLight );
1265 const QgsFixedGradientBackgroundSettings *gradientSettings =
dynamic_cast<const QgsFixedGradientBackgroundSettings *
>( settings );
1266 mBackgroundEntity =
new QgsGradientBackgroundEntity( gradientSettings->
topColor(), gradientSettings->
bottomColor(),
this );
1278void Qgs3DMapScene::onShadowSettingsChanged()
1283void Qgs3DMapScene::onAmbientOcclusionSettingsChanged()
1285 mEngine->frameGraph()->updateAmbientOcclusionSettings( mMap.ambientOcclusionSettings() );
1288void Qgs3DMapScene::onBloomSettingsChanged()
1290 mEngine->frameGraph()->updateBloomSettings( mMap.bloomSettings() );
1293void Qgs3DMapScene::onColorGradingSettingsChanged()
1295 mEngine->frameGraph()->updateColorGradingSettings( mMap.colorGradingSettings() );
1298void Qgs3DMapScene::onDebugDepthMapSettingsChanged()
1300 mEngine->frameGraph()->updateDebugDepthMapSettings( mMap );
1303void Qgs3DMapScene::onDebugOverlayEnabledChanged()
1305 mEngine->frameGraph()->setDebugOverlayEnabled( mMap.isDebugOverlayEnabled() );
1306 mEngine->renderSettings()->setRenderPolicy( mMap.isDebugOverlayEnabled() ? Qt3DRender::QRenderSettings::Always : Qt3DRender::QRenderSettings::OnDemand );
1309void Qgs3DMapScene::onEyeDomeShadingSettingsChanged()
1311 mEngine->frameGraph()->updateEyeDomeSettings( mMap );
1314void Qgs3DMapScene::onMsaaEnabledChanged()
1316 mEngine->frameGraph()->setMsaaEnabled( mMap.isMsaaEnabled() );
1319void Qgs3DMapScene::onShowMapOverlayChanged()
1322 update2DMapOverlay( extent2D );
1325void Qgs3DMapScene::onCameraMovementSpeedChanged()
1327 mCameraController->setCameraMovementSpeed( mMap.cameraMovementSpeed() );
1330void Qgs3DMapScene::onCameraNavigationModeChanged()
1332 mCameraController->setCameraNavigationMode( mMap.cameraNavigationMode() );
1337 QVector<QString> notParsedLayers;
1348 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); ++it )
1351 Qt3DCore::QEntity *rootEntity = it.value();
1353 switch ( layerType )
1357 notParsedLayers.push_back( layer->
name() );
1367 notParsedLayers.push_back( layer->
name() );
1381 if ( !notParsedLayers.empty() )
1383 QString message = tr(
"The following layers were not exported:" ) +
"\n";
1384 for (
const QString &layerName : notParsedLayers )
1385 message += layerName +
"\n";
1394 QVector<const QgsChunkNode *> chunks;
1395 if ( !mLayerEntities.contains( layer ) )
1397 if ( QgsChunkedEntity *
c = qobject_cast<QgsChunkedEntity *>( mLayerEntities[layer] ) )
1399 const QList<QgsChunkNode *> activeNodes =
c->activeNodes();
1400 for ( QgsChunkNode *n : activeNodes )
1401 chunks.push_back( n );
1408 return mMap.extent();
1413 double zMin = std::numeric_limits<double>::max();
1414 double zMax = std::numeric_limits<double>::lowest();
1415 if ( mMap.terrainRenderingEnabled() && mTerrain && !ignoreTerrain )
1417 const QgsBox3D box3D = mTerrain->rootNode()->box3D();
1418 zMin = std::min( zMin, box3D.
zMinimum() );
1419 zMax = std::max( zMax, box3D.
zMaximum() );
1422 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); it++ )
1425 switch ( layer->
type() )
1431 zMin = std::min( zMin, zRange.
lower() );
1432 zMax = std::max( zMax, zRange.
upper() );
1437 QgsMeshLayer *meshLayer = qobject_cast<QgsMeshLayer *>( layer );
1445 zMin = std::min( zMin, verticalGroupMetadata.
minimum() * verticalScale );
1446 zMax = std::max( zMax, verticalGroupMetadata.
maximum() * verticalScale );
1456 zMin = std::min( zMin, zRange.
lower() );
1457 zMax = std::max( zMax, zRange.
upper() );
1470 const QgsDoubleRange zRange( std::min( zMin, std::numeric_limits<double>::max() ), std::max( zMax, std::numeric_limits<double>::lowest() ) );
1481 mEntityRotationCenter =
new Qt3DCore::QEntity;
1483 Qt3DCore::QTransform *trRotationCenter =
new Qt3DCore::QTransform;
1484 mEntityRotationCenter->addComponent( trRotationCenter );
1486 auto materialRotationCenter =
new QgsUnlitMaterial();
1487 materialRotationCenter->setColor( Qt::blue );
1488 materialRotationCenter->setCastsShadows(
false );
1490 mEntityRotationCenter->addComponent( materialRotationCenter );
1491 Qt3DExtras::QSphereMesh *rendererRotationCenter =
new Qt3DExtras::QSphereMesh;
1492 rendererRotationCenter->setRadius( 10 );
1493 mEntityRotationCenter->addComponent( rendererRotationCenter );
1494 mEntityRotationCenter->setEnabled(
false );
1495 mEntityRotationCenter->setParent(
this );
1507void Qgs3DMapScene::on3DAxisSettingsChanged()
1511 m3DAxis->onAxisSettingsChanged();
1515 if ( QgsWindow3DEngine *
engine =
dynamic_cast<QgsWindow3DEngine *
>( mEngine ) )
1517 m3DAxis =
new Qgs3DAxis(
static_cast<Qgs3DMapCanvas *
>(
engine->window() ),
engine->root(),
this, mCameraController, &mMap );
1522void Qgs3DMapScene::onOriginChanged()
1524 const QList<QgsGeoTransform *> geoTransforms = findChildren<QgsGeoTransform *>();
1525 for ( QgsGeoTransform *transform : geoTransforms )
1527 transform->setOrigin( mMap.origin() );
1530 const QList<QgsGeoTransform *> rubberBandGeoTransforms = mEngine->frameGraph()->rubberBandsRootEntity()->findChildren<QgsGeoTransform *>();
1531 for ( QgsGeoTransform *transform : rubberBandGeoTransforms )
1533 transform->setOrigin( mMap.origin() );
1536 const QgsVector3D oldOrigin = mCameraController->origin();
1537 mCameraController->setOrigin( mMap.origin() );
1539 if ( !mClipPlanesEquations.isEmpty() )
1548 QList<QVector4D> newPlanes;
1549 QgsVector3D originShift = mMap.origin() - oldOrigin;
1550 for ( QVector4D plane : std::as_const( mClipPlanesEquations ) )
1552 plane.setW( originShift.
x() * plane.x() + originShift.
y() * plane.y() + originShift.
z() * plane.z() + plane.w() );
1553 newPlanes.append( plane );
1559void Qgs3DMapScene::handleClippingOnEntity( QEntity *entity )
const
1561 if ( mClipPlanesEquations.isEmpty() )
1563 for ( QgsMaterial *material : entity->componentsOfType<QgsMaterial>() )
1565 material->disableClipping();
1570 for ( QgsMaterial *material : entity->componentsOfType<QgsMaterial>() )
1572 material->enableClipping( mClipPlanesEquations );
1578 for ( QObject *child : entity->children() )
1580 Qt3DCore::QEntity *childEntity = qobject_cast<Qt3DCore::QEntity *>( child );
1583 handleClippingOnEntity( childEntity );
1588void Qgs3DMapScene::handleClippingOnAllEntities()
const
1592 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); ++it )
1594 handleClippingOnEntity( it.value() );
1598 handleClippingOnEntity( mTerrain );
1602 handleClippingOnEntity( mGlobe );
1610 QgsDebugMsgLevel( u
"Qgs3DMapScene::enableClipping: it is not possible to use more than %1 clipping planes."_s.arg( mMaxClipPlanes ), 2 );
1618 handleClippingOnAllEntities();
1623 mClipPlanesEquations.clear();
1626 mEngine->frameGraph()->removeClipPlanes();
1629 handleClippingOnAllEntities();
1632void Qgs3DMapScene::onStopUpdatesChanged()
1637void Qgs3DMapScene::schedule2DMapOverlayUpdate()
1640 if ( mMap.is2DMapOverlayEnabled() && mOverlayUpdateTimer && !mOverlayUpdateTimer->isActive() )
1642 mOverlayUpdateTimer->start();
1646void Qgs3DMapScene::applyPendingOverlayUpdate()
1648 if ( mMap.is2DMapOverlayEnabled() )
1651 update2DMapOverlay( extent2D );
@ DistinctTextureSkybox
Skybox with 6 distinct textures for different faces.
@ FixedGradientBackground
Two color gradient, fixed in place.
@ ShowCameraViewCenter
Shows the camera's view center as a sphere.
@ ShowFPS
Shows the frames per second (FPS).
@ ShowCameraRotationCenter
Shows the camera's rotation center as a sphere.
@ ShowTerrainBoundingBoxes
Displays bounding boxes of terrain tiles.
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.
@ Orthographic
Orthogonal projection.
@ Perspective
Perspective projection.
@ Globe
Scene is represented as a globe using a geocentric CRS.
@ Local
Local scene based on a projected CRS.
Manages the various settings the user can choose from when exporting a 3D scene.
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.
bool terrainExportEnabled() const
Returns whether terrain export is enabled.
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.
Qgis::Export3DSceneFormat exportFormat() const
Returns the export format for the 3D scene.
void viewed2DExtentFrom3DChanged(QVector< QgsPointXY > extent)
Emitted when the viewed 2D extent seen by the 3D camera has changed.
QList< QVector4D > clipPlaneEquations() const
Returns list of clipping planes if clipping is enabled, otherwise an empty list.
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.
QVector< const QgsChunkNode * > getLayerActiveChunkNodes(QgsMapLayer *layer) SIP_SKIP
Returns the active chunk nodes of layer.
void gpuMemoryLimitReached()
Emitted when one of the entities reaches its GPU memory limit and it is not possible to lower the GPU...
static Q_DECL_DEPRECATED QMap< QString, Qgs3DMapScene * > openScenes() SIP_DEPRECATED
Returns a map of 3D map scenes (by name) open in the QGIS application.
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.
QList< QgsMapLayer * > layers() const SIP_SKIP
Returns the layers that contain chunked entities.
void addSceneEntity(Qgs3DMapSceneEntity *entity) SIP_SKIP
Adds a 3D map scene entity to the scene.
void updateTemporal()
Updates the temporale entities.
void totalPendingJobsCountChanged()
Emitted when the total number of pending jobs changes.
Qgs3DMapScene(Qgs3DMapSettings &map, QgsAbstract3DEngine *engine) SIP_SKIP
Constructs a 3D scene based on map settings and Qt 3D renderer configuration.
void fpsCounterEnabledChanged(bool fpsCounterEnabled)
Emitted when the FPS counter is activated or deactivated.
void removeSceneEntity(Qgs3DMapSceneEntity *entity) SIP_SKIP
Removes a 3D scene entity for the scene.
QgsDoubleRange elevationRange(bool ignoreTerrain=false) const
Returns the scene's elevation range.
QgsRectangle sceneExtent() const
Returns the scene extent in the map's CRS.
void sceneStateChanged()
Emitted when the scene's state has changed.
QgsAbstract3DEngine * engine() const SIP_SKIP
Returns the abstract 3D engine.
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.
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).
double worldSpaceError(double epsilon, double distance) const
Given screen error (in pixels) and distance from camera (in 3D world coordinates),...
void extentChanged()
Emitted when the 3d view's 2d extent has changed.
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.
void bloomSettingsChanged()
Emitted when the bloom lighting effect settings are changed.
void debugDepthMapSettingsChanged()
Emitted when depth map debugging has changed.
void backgroundSettingsChanged()
Emitted when background settings are changed.
void backgroundColorChanged()
Emitted when the background color has changed.
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.
void show2DMapOverlayChanged()
Emitted when the 2D map overlay is enabled or disabled.
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 setOrigin(const QgsVector3D &origin)
Sets coordinates in map CRS at which our 3D world has origin (0,0,0).
void msaaEnabledChanged()
Emitted when the MSAA enabled flag has changed.
void projectionTypeChanged()
Emitted when the camera lens projection type changes.
void stopUpdatesChanged()
Emitted when the flag whether to keep updating scene has changed.
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.
void terrainSettingsChanged()
Emitted when the terrain settings are changed.
void colorGradingSettingsChanged()
Emitted when the color grading settings are changed.
void fpsCounterEnabledChanged(bool fpsCounterEnabled)
Emitted when the FPS counter is enabled or disabled.
void axisSettingsChanged()
Emitted when 3d axis rendering settings are changed.
void viewFrustumVisualizationEnabledChanged()
Emitted when the camera's view frustum visualization on the main 2D map canvas is enabled or disabled...
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.
void cameraMovementSpeedChanged()
Emitted when the camera movement speed was changed.
void fieldOfViewChanged()
Emitted when the camera lens field of view changes.
void terrainGeneratorChanged()
Emitted when the terrain generator 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).
Entity that handles the exporting of 3D scenes.
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.
bool save(QString sceneName, QString sceneFolderPath, const Qgis::Export3DSceneFormat &exportFormat=Qgis::Export3DSceneFormat::Obj, int precision=6) const
Saves the scene to a file Returns false if the operation failed.
void setExportNormals(bool exportNormals)
Sets whether the normals will be exported.
void setSmoothEdges(bool smoothEdges)
Sets whether the triangles will look smooth.
void setTerrainExportEnabled(bool enabled)
Sets whether terrain export is enabled.
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 QVector3D screenPointToWorldPos(const QPoint &screenPoint, double depth, const QSize &screenSize, Qt3DRender::QCamera *camera)
Converts the clicked mouse position to the corresponding 3D world coordinates.
static int openGlMaxClipPlanes(QSurface *surface)
Gets the maximum number of clip planes that can be used.
Base class for 3D engine implementation.
void sizeChanged()
Emitted after a call to setSize().
virtual Qt3DRender::QCamera * camera()=0
Returns pointer to the engine's camera entity.
QgsFrameGraph * frameGraph()
Returns the shadow rendering frame graph object used to render the scene.
virtual Qgis::Map3DBackgroundType type() const =0
Returns the unique type for this background settings class.
Base class for all renderers that participate in 3D views.
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.
virtual void setEnabled(bool enable)
Enable or disable via enable the render view sub tree.
Base class for 3D renderers that are based on vector layers.
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.
Object that controls camera movement based on user input.
Qt3DRender::QCamera * camera() const
Returns camera that is being controlled.
void requestDepthBufferCapture()
Emitted to ask for the depth buffer image.
void cameraChanged()
Emitted when camera has been updated.
void depthBufferReady()
Emitted after the depth buffer has been captured and is ready to sample.
void cameraRotationCenterChanged(QVector3D position)
Emitted when the camera rotation center changes.
QgsRange which stores a range of double values.
bool isInfinite() const
Returns true if the range consists of all possible values.
An environment light entity.
@ Disabled
No environment lighting.
QColor topColor() const
Returns the color at the top of the gradient.
QColor bottomColor() const
Returns the color at the bottom of the gradient.
Qt3DRender::QLayer * renderLayer()
Returns a layer object used to indicate that the object is transparent.
Qt3DRender::QLayer * transparentObjectLayer()
Returns a layer object used to indicate that the object is transparent.
Qt3DRender::QLayer * backgroundLayer()
Returns a layer object used for skybox and background gradient entities.
Container class that holds different objects related to frame graphs of 3D scenes.
void updateShadowSettings(const Qgs3DMapSettings &mapSettings)
Updates shadow bias, light and texture size according to shadowSettings and lightSources.
QgsHighlightsRenderView & highlightsRenderView()
Returns the highlights renderview, used for rendering highlight overlays of identified features.
QgsForwardRenderView & forwardRenderView()
Returns forward renderview.
QgsOverlayTextureRenderView & overlayTextureRenderView()
Returns overlay texture renderview.
QgsShadowRenderView & shadowRenderView()
Returns shadow renderview.
Qt3DRender::QLayer * highlightsLayer()
Returns a layer that should be attached to entities meant to be rendered by QgsHighlightsRenderView.
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
3D symbol that draws point geometries as 3D objects using one of the predefined shapes.
Qgis::Point3DShape shape() const
Returns 3D shape for points.
QVariant shapeProperty(const QString &property) const
Returns the value for a specific shape property.
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.
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 rectangle specified with double values.
static QgsRectangle fromCenterAndSize(const QgsPointXY ¢er, double width, double height)
Creates a new rectangle, given the specified center point and width and height.
A child rule for a QgsRuleBased3DRenderer.
QList< QgsRuleBased3DRenderer::Rule * > RuleList
Qt3DRender::QLayer * entityCastingShadowsLayer() const
Returns the layer to be used by entities to be included in this renderview.
bool environmentalLightingEnabled() const
Returns true if the skybox should generate environmental lighting effects.
QMap< QString, QString > cubeMapFacesPaths() const
Returns a map containing the path of each texture specified by the user.
double environmentalLightStrength() const
Returns the environmental light strength, as a factor between 0 and 1.
Qgis::SkyboxCubeMapping cubeMapping() const
Returns the cube face mapping scheme.
void remoteSourceFetched(const QString &url)
Emitted when the cache has finished retrieving a 3D model from a remote url.
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.
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
double y() const
Returns Y coordinate.
double z() const
Returns Z coordinate.
QString toString(int precision=17) const
Returns a string representation of the 3D vector.
double x() const
Returns X coordinate.
3D renderer that renders all features of a vector layer with the same 3D symbol.
const QgsAbstract3DSymbol * symbol() const
Returns 3D symbol associated with the renderer.
Represents a vector layer which manages a vector based dataset.
void subsetStringChanged()
Emitted when the layer's subset string has changed.
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).
QList< Qgs3DRendererCategory > Qgs3DCategoryList
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
constexpr QObjectUniquePtr< Tp > make_qobject_unique(Args &&...args)
Create an object owned by a QObjectUniquePtr.