75#include <QOpenGLContext>
76#include <QOpenGLFunctions>
81#include <Qt3DExtras/QDiffuseSpecularMaterial>
82#include <Qt3DExtras/QForwardRenderer>
83#include <Qt3DExtras/QPhongMaterial>
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 );
223 onBackgroundSettingsChanged();
228 onEyeDomeShadingSettingsChanged();
230 onDebugDepthMapSettingsChanged();
232 onAmbientOcclusionSettingsChanged();
234 onMsaaEnabledChanged();
236 onBloomSettingsChanged();
238 onColorGradingSettingsChanged();
243 mOverlayUpdateTimer =
new QTimer(
this );
244 mOverlayUpdateTimer->setSingleShot(
true );
245 mOverlayUpdateTimer->setInterval( 250 );
246 connect( mOverlayUpdateTimer, &QTimer::timeout,
this, &Qgs3DMapScene::applyPendingOverlayUpdate );
249 onShowMapOverlayChanged();
251 onCameraMovementSpeedChanged();
253 on3DAxisSettingsChanged();
260 mCameraController->resetGlobe( 10'000'000 );
266 const double side = std::max( extent.
width(), extent.
height() );
267 double d = side / 2 / std::tan(
cameraController()->camera()->fieldOfView() / 2 * M_PI / 180 );
269 mCameraController->resetView(
static_cast<float>( d ) );
280 const double xSide = std::abs( p1.
x() - p2.
x() );
281 const double ySide = std::abs( p1.
y() - p2.
y() );
282 const double side = std::max( xSide, ySide );
284 const double fov = qDegreesToRadians(
cameraController()->camera()->fieldOfView() );
285 double distance = side / 2.0f / std::tan( fov / 2.0f );
290 distance += zRange.
upper();
294 mCameraController->setViewFromTop(
295 static_cast<float>( center.
x() - origin.
x() ),
296 static_cast<float>( center.
y() - origin.
y() ),
297 static_cast<float>( distance )
304 Qt3DRender::QCamera *camera = mCameraController->camera();
305 QVector<QgsPointXY> extent;
306 QVector<int> pointsOrder = { 0, 1, 3, 2 };
307 for (
int i : pointsOrder )
309 const QPoint p( ( ( i >> 0 ) & 1 ) ? 0 : mEngine->size().width(), ( ( i >> 1 ) & 1 ) ? 0 : mEngine->size().height() );
312 if ( dir.z() == 0.0 )
313 dir.setZ( 0.000001 );
314 double t = -ray.
origin().z() / dir.z();
318 t = camera->farPlane();
323 t = std::min<float>( t, camera->farPlane() );
325 QVector3D planePoint = ray.
origin() + t * dir;
326 QgsVector3D pMap = mMap.worldToMapCoordinates( planePoint );
335 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
336 count += entity->pendingJobsCount();
342 Qt3DRender::QCamera *camera = mCameraController->camera();
343 const double fov = camera->fieldOfView();
344 const QSize size = mEngine->size();
345 const int screenSizePx = std::max( size.width(), size.height() );
349 const double frustumWidthAtDistance = 2 * distance * tan( fov / 2 );
350 const double err = frustumWidthAtDistance * epsilon / screenSizePx;
354void Qgs3DMapScene::onCameraChanged()
357 updateCameraNearFarPlanes();
359 onShadowSettingsChanged();
363 schedule2DMapOverlayUpdate();
371 constexpr float ORIGIN_SHIFT_THRESHOLD = 10'000;
372 if ( mSceneOriginShiftEnabled && mEngine->
camera()->position().length() > ORIGIN_SHIFT_THRESHOLD )
380bool Qgs3DMapScene::updateScene(
bool forceUpdate )
382 if ( !mSceneUpdatesEnabled )
388 QgsScopedEvent traceEvent( u
"3D"_s, forceUpdate ? u
"Force update scene"_s : u
"Update scene"_s );
390 Qgs3DMapSceneEntity::SceneContext sceneContext;
391 Qt3DRender::QCamera *camera = mEngine->camera();
392 sceneContext.cameraFov = camera->fieldOfView();
393 sceneContext.cameraPos = camera->position();
394 const QSize size = mEngine->size();
395 sceneContext.screenSizePx = std::max( size.width(), size.height() );
403 QMatrix4x4 projMatrix;
404 switch ( mMap.projectionType() )
406 case Qt3DRender::QCameraLens::PerspectiveProjection:
408 float fovRadians = ( camera->fieldOfView() / 2.0f ) *
static_cast<float>( M_PI ) / 180.0f;
409 float fovCotan = std::cos( fovRadians ) / std::sin( fovRadians );
412 fovCotan / camera->aspectRatio(), 0, 0, 0,
420 case Qt3DRender::QCameraLens::OrthographicProjection:
422 Qt3DRender::QCameraLens *lens = camera->lens();
425 2.0f / ( lens->right() - lens->left() ), 0, 0, 0,
426 0, 2.0f / ( lens->top() - lens->bottom() ), 0, 0,
428 -( lens->left() + lens->right() ) / ( lens->right() - lens->left() ), -( lens->top() + lens->bottom() ) / ( lens->top() - lens->bottom() ), -1.0f, 1.0f
435 projMatrix = camera->projectionMatrix();
437 sceneContext.viewProjectionMatrix = projMatrix * camera->viewMatrix();
440 bool anyUpdated =
false;
441 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
443 if ( forceUpdate || ( entity->isEnabled() && entity->needsUpdate() ) )
446 entity->handleSceneUpdate( sceneContext );
447 if ( entity->hasReachedGpuMemoryLimit() )
457bool Qgs3DMapScene::updateCameraNearFarPlanes()
472 QMatrix4x4 viewMatrix = camera->viewMatrix();
478 for ( Qgs3DMapSceneEntity *se : std::as_const( mSceneEntities ) )
480 const QgsRange<float> depthRange = se->getNearFarPlaneRange( viewMatrix );
482 fnear = std::min( fnear, depthRange.
lower() );
483 ffar = std::max( ffar, depthRange.
upper() );
492 if ( fnear == 1e9 && ffar == 0 )
495 sceneZRange = sceneZRange.
isInfinite() ? QgsDoubleRange( 0.0, 0.0 ) : sceneZRange;
502 std::swap( fnear, ffar );
505 float newFar = ffar * 2;
506 float newNear = fnear / 2;
509 camera->setFarPlane( newFar );
510 camera->setNearPlane( newNear );
517void Qgs3DMapScene::onFrameTriggered(
float dt )
522 QgsEventTracing::addEventToQgisTrace( QgsEventTracing::EventType::Instant, u
"3D"_s, u
"Frame begins"_s );
524 mCameraController->frameTriggered( dt );
529 updateCameraNearFarPlanes();
532 static int frameCount = 0;
533 static float accumulatedTime = 0.0f;
535 if ( !mMap.isFpsCounterEnabled() )
543 accumulatedTime += dt;
544 if ( accumulatedTime >= 0.2f )
546 float fps = ( float ) frameCount / accumulatedTime;
548 accumulatedTime = 0.0f;
553void Qgs3DMapScene::update2DMapOverlay(
const QVector<QgsPointXY> &extent2DAsPoints )
555 QgsFrameGraph *frameGraph = mEngine->frameGraph();
558 if ( !mMap.is2DMapOverlayEnabled() )
560 if ( mMapOverlayEntity )
562 mMapOverlayEntity.reset();
564 overlayRenderView.
setEnabled( mMap.debugDepthMapEnabled() );
568 if ( !mMapOverlayEntity )
570 QgsWindow3DEngine *
engine = qobject_cast<QgsWindow3DEngine *>( mEngine );
571 mMapOverlayEntity.reset(
new QgsMapOverlayEntity(
engine, &overlayRenderView, &mMap,
this ) );
572 mMapOverlayEntity->setEnabled(
true );
577 Qt3DRender::QCamera *camera = mEngine->camera();
578 const QgsVector3D extentCenter3D = mMap.worldToMapCoordinates( camera->position() );
579 const QgsPointXY extentCenter2D( extentCenter3D.
x(), extentCenter3D.
y() );
586 double minHalfExtent = std::numeric_limits<double>::max();
587 double maxHalfExtent = 0.0;
588 for (
const QgsPointXY &extentPoint : extent2DAsPoints )
590 const double distance = extentCenter2D.distance( extentPoint );
591 minHalfExtent = std::min( minHalfExtent, distance );
592 maxHalfExtent = std::max( maxHalfExtent, distance );
596 const double sceneHalfExtent = 0.6 * std::max( fullExtent.
width(), fullExtent.
height() );
598 minHalfExtent = std::min( 50., minHalfExtent );
599 maxHalfExtent = std::min( 100., maxHalfExtent );
600 const double smoothFactor = std::sin( mCameraController->pitch() / 90.0 * M_PI_2 );
603 const double adjustedHalfExtent = std::min( 3.0 * ( minHalfExtent + smoothFactor * maxHalfExtent ), sceneHalfExtent );
606 const bool showFrustum = mMap.viewFrustumVisualizationEnabled();
607 mMapOverlayEntity->update( overviewExtent, extent2DAsPoints, mCameraController->yaw(), showFrustum );
610void Qgs3DMapScene::createTerrain()
614 mSceneEntities.removeOne( mTerrain );
622 mSceneEntities.removeOne( mGlobe );
628 if ( !mTerrainUpdateScheduled )
631 QTimer::singleShot( 0,
this, &Qgs3DMapScene::createTerrainDeferred );
632 mTerrainUpdateScheduled =
true;
641void Qgs3DMapScene::createTerrainDeferred()
643 QgsChunkedEntity *terrainOrGlobe =
nullptr;
647 mGlobe =
new QgsGlobeEntity( &mMap );
648 terrainOrGlobe = mGlobe;
650 else if ( mMap.sceneMode() ==
Qgis::SceneMode::Local && mMap.terrainRenderingEnabled() && mMap.terrainGenerator() )
652 double tile0width = mMap.terrainGenerator()->rootChunkExtent().width();
653 int maxZoomLevel =
Qgs3DUtils::maxZoomLevel( tile0width, mMap.terrainSettings()->mapTileResolution(), mMap.terrainSettings()->maximumGroundError() );
654 const QgsBox3D rootBox3D = mMap.terrainGenerator()->rootChunkBox3D( mMap );
655 float rootError = mMap.terrainGenerator()->rootChunkError( mMap );
656 const QgsBox3D clippingBox3D( mMap.extent(), rootBox3D.
zMinimum(), rootBox3D.
zMaximum() );
657 mMap.terrainGenerator()->setupQuadtree( rootBox3D, rootError, maxZoomLevel, clippingBox3D );
659 mTerrain =
new QgsTerrainEntity( &mMap );
660 mTerrain->setObjectName( u
"Terrain"_s );
661 terrainOrGlobe = mTerrain;
664 if ( terrainOrGlobe )
667 QgsFrameGraph *frameGraph = mEngine->frameGraph();
671 terrainOrGlobe->setParent(
this );
672 terrainOrGlobe->setShowBoundingBoxes( mMap.showTerrainBoundingBoxes() );
674 mSceneEntities << terrainOrGlobe;
677 connect( terrainOrGlobe, &Qgs3DMapSceneEntity::newEntityCreated,
this, [
this]( Qt3DCore::QEntity *entity ) {
679 const QList<QgsGeoTransform *> transforms = entity->findChildren<QgsGeoTransform *>();
680 for ( QgsGeoTransform *transform : transforms )
682 transform->setOrigin( mMap.origin() );
686 handleClippingOnEntity( entity );
691 const QList<QgsMapLayer *>
layers = mMap.layers();
692 for ( QgsMapLayer *layer :
layers )
695 removeLayerEntity( layer );
698 addLayerEntity( layer );
703 mTerrainUpdateScheduled =
false;
706void Qgs3DMapScene::onBackgroundColorChanged()
708 mEngine->setClearColor( mMap.backgroundColor() );
711void Qgs3DMapScene::updateLights()
713 for ( Qt3DCore::QEntity *entity : std::as_const( mLightEntities ) )
714 entity->deleteLater();
715 mLightEntities.clear();
717 QgsFrameGraph *frameGraph = mEngine->frameGraph();
718 const QList<QgsLightSource *> newLights = mMap.lightSources();
719 for (
const QgsLightSource *source : newLights )
721 Qt3DCore::QEntity *entity = source->createEntity( mMap,
this );
723 mLightEntities.append( entity );
726 onShadowSettingsChanged();
729void Qgs3DMapScene::updateCameraLens()
731 mEngine->camera()->lens()->setFieldOfView(
static_cast< float >( mMap.fieldOfView() ) );
732 mEngine->camera()->lens()->setProjectionType( mMap.projectionType() );
736void Qgs3DMapScene::onLayerRenderer3DChanged()
738 QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
742 removeLayerEntity( layer );
745 addLayerEntity( layer );
748void Qgs3DMapScene::onLayersChanged()
750 QSet<QgsMapLayer *> layersBefore = qgis::listToSet( mLayerEntities.keys() );
751 QList<QgsMapLayer *> layersAdded;
752 const QList<QgsMapLayer *>
layers = mMap.layers();
753 for ( QgsMapLayer *layer :
layers )
755 if ( !layersBefore.contains( layer ) )
757 layersAdded << layer;
761 layersBefore.remove( layer );
766 for ( QgsMapLayer *layer : std::as_const( layersBefore ) )
768 removeLayerEntity( layer );
771 for ( QgsMapLayer *layer : std::as_const( layersAdded ) )
773 addLayerEntity( layer );
779 const QList<QgsMapLayer *>
layers = mLayerEntities.keys();
784 if ( temporalProperties->isActive() )
786 removeLayerEntity( layer );
787 addLayerEntity( layer );
795 Q_ASSERT( sceneNewEntity );
797 mSceneEntities.append( sceneNewEntity );
799 sceneNewEntity->setParent(
this );
801 finalizeNewEntity( sceneNewEntity );
803 connect( sceneNewEntity, &Qgs3DMapSceneEntity::newEntityCreated,
this, [
this]( Qt3DCore::QEntity *entity ) {
804 finalizeNewEntity( entity );
806 updateCameraNearFarPlanes();
816 Q_ASSERT( sceneEntity );
818 mSceneEntities.removeOne( sceneEntity );
820 sceneEntity->deleteLater();
824void Qgs3DMapScene::addLayerEntity(
QgsMapLayer *layer )
836 if ( renderer->
type() ==
"vector"_L1 )
844 mModelVectorLayers.append( layer );
848 else if ( renderer->
type() ==
"rulebased"_L1 )
851 for (
auto rule : rules )
853 const QgsPoint3DSymbol *pointSymbol =
dynamic_cast<const QgsPoint3DSymbol *
>( rule->symbol() );
856 mModelVectorLayers.append( layer );
861 else if ( renderer->
type() ==
"categorized"_L1 )
863 const Qgs3DCategoryList categories =
static_cast<QgsCategorized3DRenderer *
>( renderer )->categories();
864 for (
const Qgs3DRendererCategory &category : categories )
866 const QgsPoint3DSymbol *pointSymbol =
dynamic_cast<const QgsPoint3DSymbol *
>( category.symbol() );
869 mModelVectorLayers.append( layer );
877 QgsMeshLayer3DRenderer *meshRenderer =
static_cast<QgsMeshLayer3DRenderer *
>( renderer );
878 meshRenderer->
setLayer(
static_cast<QgsMeshLayer *
>( layer ) );
882 QgsMesh3DSymbol *sym = meshRenderer->
symbol()->
clone();
888 QgsPointCloudLayer3DRenderer *pointCloudRenderer =
static_cast<QgsPointCloudLayer3DRenderer *
>( renderer );
889 pointCloudRenderer->
setLayer(
static_cast<QgsPointCloudLayer *
>( layer ) );
893 QgsTiledSceneLayer3DRenderer *tiledSceneRenderer =
static_cast<QgsTiledSceneLayer3DRenderer *
>( renderer );
894 tiledSceneRenderer->
setLayer(
static_cast<QgsTiledSceneLayer *
>( layer ) );
898 auto annotationLayerRenderer = qgis::down_cast<QgsAnnotationLayer3DRenderer *>( renderer );
899 annotationLayerRenderer->setLayer( qobject_cast<QgsAnnotationLayer *>( layer ) );
902 Qt3DCore::QEntity *newEntity = renderer->
createEntity( &mMap );
906 newEntity->setObjectName( u
"%1 3D entity"_s.arg( layer->
name() ) );
908 mLayerEntities.insert( layer, newEntity );
910 if ( Qgs3DMapSceneEntity *sceneNewEntity = qobject_cast<Qgs3DMapSceneEntity *>( newEntity ) )
917 newEntity->setParent(
this );
918 finalizeNewEntity( newEntity );
927 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
940 QgsPointCloudLayer *pclayer = qobject_cast<QgsPointCloudLayer *>( layer );
946void Qgs3DMapScene::removeLayerEntity(
QgsMapLayer *layer )
948 Qt3DCore::QEntity *entity = mLayerEntities.take( layer );
950 if ( Qgs3DMapSceneEntity *sceneEntity = qobject_cast<Qgs3DMapSceneEntity *>( entity ) )
958 entity->deleteLater();
965 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
969 mModelVectorLayers.removeAll( layer );
979 QgsPointCloudLayer *pclayer = qobject_cast<QgsPointCloudLayer *>( layer );
986void Qgs3DMapScene::finalizeNewEntity( Qt3DCore::QEntity *newEntity )
989 const QList<QgsGeoTransform *> transforms = newEntity->findChildren<QgsGeoTransform *>();
990 for ( QgsGeoTransform *transform : transforms )
992 transform->setOrigin( mMap.origin() );
996 handleClippingOnEntity( newEntity );
1000 const QList<Qt3DRender::QMaterial *> childMaterials = newEntity->findChildren<Qt3DRender::QMaterial *>();
1004 for ( Qt3DRender::QMaterial *material : childMaterials )
1006 if (
auto lm = qobject_cast< QgsLineMaterial * >( material ) )
1009 lm->setViewportSize( mEngine->size() );
1011 else if (
auto bm = qobject_cast< QgsPoint3DBillboardMaterial * >( material ) )
1014 bm->setViewportSize( mEngine->size() );
1018 QgsFrameGraph *frameGraph = mEngine->frameGraph();
1022 const QVector<Qt3DRender::QLayer *>
layers = newEntity->componentsOfType<Qt3DRender::QLayer>();
1031 for ( Qt3DRender::QMaterial *material : childMaterials )
1035 auto materialEntity = qobject_cast<Qt3DCore::QEntity *>( material->parent() );
1036 if ( !materialEntity )
1039 bool materialCastsShadows =
false;
1040 if (
auto qgsMaterial = qobject_cast< QgsMaterial * >( material ) )
1042 if ( qgsMaterial->castsShadows() )
1044 materialCastsShadows =
true;
1050 materialCastsShadows =
true;
1053 if ( materialCastsShadows && !materialEntity->components().contains( shadowCastingEntityLayer ) )
1055 materialEntity->addComponent( shadowCastingEntityLayer );
1061 if (
auto ph = qobject_cast<Qt3DExtras::QDiffuseSpecularMaterial *>( material ) )
1063 if ( ph->diffuse().value<QColor>().alphaF() != 1.0f )
1065 if ( !materialEntity->components().contains( transparentLayer ) )
1067 materialEntity->addComponent( transparentLayer );
1088 else if (
auto billboardMaterial = qobject_cast<QgsPoint3DBillboardMaterial *>( material ) )
1090 Qt3DCore::QEntity *entity = qobject_cast<Qt3DCore::QEntity *>( billboardMaterial->parent() );
1091 if ( !materialEntity->components().contains( transparentLayer ) )
1093 materialEntity->addComponent( transparentLayer );
1100 if ( Qt3DRender::QEffect *effect = material->effect() )
1102 const QVector<Qt3DRender::QParameter *> parameters = effect->parameters();
1103 for (
const Qt3DRender::QParameter *parameter : parameters )
1105 if ( parameter->name() ==
"opacity" && parameter->value() != 1.0f )
1107 if ( !materialEntity->components().contains( transparentLayer ) )
1109 materialEntity->addComponent( transparentLayer );
1118 if ( childMaterials.empty() )
1121 newEntity->addComponent( shadowCastingEntityLayer );
1125int Qgs3DMapScene::maximumTextureSize()
const
1127 QSurface *surface = mEngine->surface();
1128 QOpenGLContext context;
1130 bool success = context.makeCurrent( surface );
1134 QOpenGLFunctions openglFunctions = QOpenGLFunctions( &context );
1137 openglFunctions.initializeOpenGLFunctions();
1138 openglFunctions.glGetIntegerv( GL_MAX_TEXTURE_SIZE, &size );
1147void Qgs3DMapScene::addCameraViewCenterEntity( Qt3DRender::QCamera *camera )
1149 mEntityCameraViewCenter =
new Qt3DCore::QEntity;
1151 Qt3DCore::QTransform *trCameraViewCenter =
new Qt3DCore::QTransform;
1152 mEntityCameraViewCenter->addComponent( trCameraViewCenter );
1153 connect( camera, &Qt3DRender::QCamera::viewCenterChanged,
this, [trCameraViewCenter, camera] { trCameraViewCenter->setTranslation( camera->viewCenter() ); } );
1155 Qt3DExtras::QPhongMaterial *materialCameraViewCenter =
new Qt3DExtras::QPhongMaterial;
1156 materialCameraViewCenter->setAmbient( Qt::red );
1157 mEntityCameraViewCenter->addComponent( materialCameraViewCenter );
1159 Qt3DExtras::QSphereMesh *rendererCameraViewCenter =
new Qt3DExtras::QSphereMesh;
1160 rendererCameraViewCenter->setRadius( 10 );
1161 mEntityCameraViewCenter->addComponent( rendererCameraViewCenter );
1163 mEntityCameraViewCenter->setEnabled( mMap.showCameraViewCenter() );
1164 mEntityCameraViewCenter->setParent(
this );
1171 if ( mSceneState == state )
1173 mSceneState = state;
1177void Qgs3DMapScene::updateSceneState()
1179 if ( mTerrainUpdateScheduled )
1185 for ( Qgs3DMapSceneEntity *entity : std::as_const( mSceneEntities ) )
1187 if ( entity->isEnabled() && entity->pendingJobsCount() > 0 )
1194 setSceneState(
Ready );
1197void Qgs3DMapScene::onBackgroundSettingsChanged()
1199 if ( mBackgroundEntity )
1201 mBackgroundEntity->deleteLater();
1202 mBackgroundEntity =
nullptr;
1205 const QgsAbstract3DMapBackgroundSettings *settings = mMap.backgroundSettings();
1212 QgsFrameGraph *frameGraph = mEngine->frameGraph();
1216 const QgsSkyboxSettings *skyboxSettings =
dynamic_cast<const QgsSkyboxSettings *
>( settings );
1219 =
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 );
1220 qgis::down_cast< QgsSkyboxEntity * >( mBackgroundEntity )->updateEnvironmentLight( mEnvironmentLight );
1225 const QgsFixedGradientBackgroundSettings *gradientSettings =
dynamic_cast<const QgsFixedGradientBackgroundSettings *
>( settings );
1226 mBackgroundEntity =
new QgsGradientBackgroundEntity( gradientSettings->
topColor(), gradientSettings->
bottomColor(),
this );
1238void Qgs3DMapScene::onShadowSettingsChanged()
1243void Qgs3DMapScene::onAmbientOcclusionSettingsChanged()
1245 mEngine->frameGraph()->updateAmbientOcclusionSettings( mMap.ambientOcclusionSettings() );
1248void Qgs3DMapScene::onBloomSettingsChanged()
1250 mEngine->frameGraph()->updateBloomSettings( mMap.bloomSettings() );
1253void Qgs3DMapScene::onColorGradingSettingsChanged()
1255 mEngine->frameGraph()->updateColorGradingSettings( mMap.colorGradingSettings() );
1258void Qgs3DMapScene::onDebugDepthMapSettingsChanged()
1260 mEngine->frameGraph()->updateDebugDepthMapSettings( mMap );
1263void Qgs3DMapScene::onDebugOverlayEnabledChanged()
1265 mEngine->frameGraph()->setDebugOverlayEnabled( mMap.isDebugOverlayEnabled() );
1266 mEngine->renderSettings()->setRenderPolicy( mMap.isDebugOverlayEnabled() ? Qt3DRender::QRenderSettings::Always : Qt3DRender::QRenderSettings::OnDemand );
1269void Qgs3DMapScene::onEyeDomeShadingSettingsChanged()
1271 mEngine->frameGraph()->updateEyeDomeSettings( mMap );
1274void Qgs3DMapScene::onMsaaEnabledChanged()
1276 mEngine->frameGraph()->setMsaaEnabled( mMap.isMsaaEnabled() );
1279void Qgs3DMapScene::onShowMapOverlayChanged()
1282 update2DMapOverlay( extent2D );
1285void Qgs3DMapScene::onCameraMovementSpeedChanged()
1287 mCameraController->setCameraMovementSpeed( mMap.cameraMovementSpeed() );
1290void Qgs3DMapScene::onCameraNavigationModeChanged()
1292 mCameraController->setCameraNavigationMode( mMap.cameraNavigationMode() );
1297 QVector<QString> notParsedLayers;
1308 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); ++it )
1311 Qt3DCore::QEntity *rootEntity = it.value();
1313 switch ( layerType )
1317 notParsedLayers.push_back( layer->
name() );
1327 notParsedLayers.push_back( layer->
name() );
1341 if ( !notParsedLayers.empty() )
1343 QString message = tr(
"The following layers were not exported:" ) +
"\n";
1344 for (
const QString &layerName : notParsedLayers )
1345 message += layerName +
"\n";
1354 QVector<const QgsChunkNode *> chunks;
1355 if ( !mLayerEntities.contains( layer ) )
1357 if ( QgsChunkedEntity *
c = qobject_cast<QgsChunkedEntity *>( mLayerEntities[layer] ) )
1359 const QList<QgsChunkNode *> activeNodes =
c->activeNodes();
1360 for ( QgsChunkNode *n : activeNodes )
1361 chunks.push_back( n );
1368 return mMap.extent();
1373 double zMin = std::numeric_limits<double>::max();
1374 double zMax = std::numeric_limits<double>::lowest();
1375 if ( mMap.terrainRenderingEnabled() && mTerrain && !ignoreTerrain )
1377 const QgsBox3D box3D = mTerrain->rootNode()->box3D();
1378 zMin = std::min( zMin, box3D.
zMinimum() );
1379 zMax = std::max( zMax, box3D.
zMaximum() );
1382 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); it++ )
1385 switch ( layer->
type() )
1391 zMin = std::min( zMin, zRange.
lower() );
1392 zMax = std::max( zMax, zRange.
upper() );
1397 QgsMeshLayer *meshLayer = qobject_cast<QgsMeshLayer *>( layer );
1405 zMin = std::min( zMin, verticalGroupMetadata.
minimum() * verticalScale );
1406 zMax = std::max( zMax, verticalGroupMetadata.
maximum() * verticalScale );
1416 zMin = std::min( zMin, zRange.
lower() );
1417 zMax = std::max( zMax, zRange.
upper() );
1430 const QgsDoubleRange zRange( std::min( zMin, std::numeric_limits<double>::max() ), std::max( zMax, std::numeric_limits<double>::lowest() ) );
1441 mEntityRotationCenter =
new Qt3DCore::QEntity;
1443 Qt3DCore::QTransform *trRotationCenter =
new Qt3DCore::QTransform;
1444 mEntityRotationCenter->addComponent( trRotationCenter );
1445 Qt3DExtras::QPhongMaterial *materialRotationCenter =
new Qt3DExtras::QPhongMaterial;
1446 materialRotationCenter->setAmbient( Qt::blue );
1447 mEntityRotationCenter->addComponent( materialRotationCenter );
1448 Qt3DExtras::QSphereMesh *rendererRotationCenter =
new Qt3DExtras::QSphereMesh;
1449 rendererRotationCenter->setRadius( 10 );
1450 mEntityRotationCenter->addComponent( rendererRotationCenter );
1451 mEntityRotationCenter->setEnabled(
false );
1452 mEntityRotationCenter->setParent(
this );
1459void Qgs3DMapScene::on3DAxisSettingsChanged()
1463 m3DAxis->onAxisSettingsChanged();
1467 if ( QgsWindow3DEngine *
engine =
dynamic_cast<QgsWindow3DEngine *
>( mEngine ) )
1469 m3DAxis =
new Qgs3DAxis(
static_cast<Qgs3DMapCanvas *
>(
engine->window() ),
engine->root(),
this, mCameraController, &mMap );
1474void Qgs3DMapScene::onOriginChanged()
1476 const QList<QgsGeoTransform *> geoTransforms = findChildren<QgsGeoTransform *>();
1477 for ( QgsGeoTransform *transform : geoTransforms )
1479 transform->setOrigin( mMap.origin() );
1482 const QList<QgsGeoTransform *> rubberBandGeoTransforms = mEngine->frameGraph()->rubberBandsRootEntity()->findChildren<QgsGeoTransform *>();
1483 for ( QgsGeoTransform *transform : rubberBandGeoTransforms )
1485 transform->setOrigin( mMap.origin() );
1488 const QgsVector3D oldOrigin = mCameraController->origin();
1489 mCameraController->setOrigin( mMap.origin() );
1491 if ( !mClipPlanesEquations.isEmpty() )
1500 QList<QVector4D> newPlanes;
1501 QgsVector3D originShift = mMap.origin() - oldOrigin;
1502 for ( QVector4D plane : std::as_const( mClipPlanesEquations ) )
1504 plane.setW( originShift.
x() * plane.x() + originShift.
y() * plane.y() + originShift.
z() * plane.z() + plane.w() );
1505 newPlanes.append( plane );
1511void Qgs3DMapScene::handleClippingOnEntity( QEntity *entity )
const
1513 if ( mClipPlanesEquations.isEmpty() )
1515 for ( QgsMaterial *material : entity->componentsOfType<QgsMaterial>() )
1517 material->disableClipping();
1522 for ( QgsMaterial *material : entity->componentsOfType<QgsMaterial>() )
1524 material->enableClipping( mClipPlanesEquations );
1530 for ( QObject *child : entity->children() )
1532 Qt3DCore::QEntity *childEntity = qobject_cast<Qt3DCore::QEntity *>( child );
1535 handleClippingOnEntity( childEntity );
1540void Qgs3DMapScene::handleClippingOnAllEntities()
const
1544 for (
auto it = mLayerEntities.constBegin(); it != mLayerEntities.constEnd(); ++it )
1546 handleClippingOnEntity( it.value() );
1550 handleClippingOnEntity( mTerrain );
1554 handleClippingOnEntity( mGlobe );
1562 QgsDebugMsgLevel( u
"Qgs3DMapScene::enableClipping: it is not possible to use more than %1 clipping planes."_s.arg( mMaxClipPlanes ), 2 );
1570 handleClippingOnAllEntities();
1575 mClipPlanesEquations.clear();
1578 mEngine->frameGraph()->removeClipPlanes();
1581 handleClippingOnAllEntities();
1584void Qgs3DMapScene::onStopUpdatesChanged()
1589void Qgs3DMapScene::schedule2DMapOverlayUpdate()
1592 if ( mMap.is2DMapOverlayEnabled() && mOverlayUpdateTimer && !mOverlayUpdateTimer->isActive() )
1594 mOverlayUpdateTimer->start();
1598void Qgs3DMapScene::applyPendingOverlayUpdate()
1600 if ( mMap.is2DMapOverlayEnabled() )
1603 update2DMapOverlay( extent2D );
@ DistinctTextureSkybox
Skybox with 6 distinct textures for different faces.
@ FixedGradientBackground
Two color gradient, fixed in place.
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.
@ 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 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.
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.
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 cameraChanged()
Emitted when camera has been updated.
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.
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 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.
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)