16#include <Qt3DCore/QAspectEngine> 
   17#include <Qt3DCore/QEntity> 
   18#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 
   19#include <Qt3DCore/QCoreAspect> 
   21#include <Qt3DExtras/QForwardRenderer> 
   22#include <Qt3DRender/QRenderSettings> 
   23#include <Qt3DRender/QRenderAspect> 
   24#include <Qt3DInput/QInputAspect> 
   25#include <Qt3DInput/QInputSettings> 
   26#include <Qt3DLogic/QLogicAspect> 
   27#include <Qt3DRender/QCamera> 
   31#include <Qt3DLogic/QFrameAction> 
   39  : m_aspectEngine( new 
Qt3DCore::QAspectEngine )
 
   40  , m_renderAspect( new 
Qt3DRender::QRenderAspect )
 
   41  , m_inputAspect( new 
Qt3DInput::QInputAspect )
 
   42  , m_logicAspect( new 
Qt3DLogic::QLogicAspect )
 
   43  , m_renderSettings( new 
Qt3DRender::QRenderSettings )
 
   45  , m_inputSettings( new 
Qt3DInput::QInputSettings )
 
   47  , m_userRoot( nullptr )
 
   48  , m_initialized( false )
 
   50  setSurfaceType( QSurface::OpenGLSurface );
 
   53#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 
   54  m_aspectEngine->registerAspect( 
new Qt3DCore::QCoreAspect );
 
   56  m_aspectEngine->registerAspect( m_renderAspect );
 
   57  m_aspectEngine->registerAspect( m_inputAspect );
 
   58  m_aspectEngine->registerAspect( m_logicAspect );
 
   60  m_defaultCamera->setParent( m_root );
 
   61  m_inputSettings->setEventSource( 
this );
 
   68    image.save( mCaptureFileName, mCaptureFileFormat.toLocal8Bit().data() );
 
   73  setCursor( Qt::OpenHandCursor );
 
   74  installEventFilter( 
this );
 
 
   82  mScene->deleteLater();
 
   84  mMapSettings->deleteLater();
 
   85  mMapSettings = 
nullptr;
 
   88  delete m_aspectEngine;
 
 
   93  if ( m_userRoot != root )
 
   95    if ( m_userRoot != 
nullptr )
 
   96      m_userRoot->setParent( 
static_cast<Qt3DCore::QNode *
>( 
nullptr ) );
 
   97    if ( root != 
nullptr )
 
   98      root->setParent( m_root );
 
 
  110  return m_renderSettings->activeFrameGraph();
 
 
  115  return m_defaultCamera;
 
 
  120  return m_renderSettings;
 
 
  125  if ( !m_initialized )
 
  127    m_root->addComponent( m_renderSettings );
 
  128    m_root->addComponent( m_inputSettings );
 
  129    m_aspectEngine->setRootEntity( Qt3DCore::QEntityPtr( m_root ) );
 
  131    m_initialized = 
true;
 
  133  QWindow::showEvent( e );
 
 
  138  m_defaultCamera->setAspectRatio( 
float( width() ) / std::max( 1.f, 
static_cast<float>( height() ) ) );
 
 
  146  Q_ASSERT( !mMapSettings );
 
  156    mScene->deleteLater();
 
  170    QCursor::setPos( mapToGlobal( point ) );
 
 
  200  const float worldX = center.
x() - mMapSettings->
origin().
x();
 
  201  const float worldY = center.
y() - mMapSettings->
origin().
y();
 
 
  207  if ( !mScene || fileName.isEmpty() )
 
  210  mCaptureFileName = fileName;
 
  211  mCaptureFileFormat = fileFormat;
 
  214  Qt3DLogic::QFrameAction *screenCaptureFrameAction = 
new Qt3DLogic::QFrameAction;
 
  215  mScene->addComponent( screenCaptureFrameAction );
 
  217  connect( screenCaptureFrameAction, &Qt3DLogic::QFrameAction::triggered, 
this, [ = ]( 
float )
 
  220    mScene->removeComponent( screenCaptureFrameAction );
 
  221    screenCaptureFrameAction->deleteLater();
 
 
  225void Qgs3DMapCanvas::captureDepthBuffer()
 
  231  Qt3DLogic::QFrameAction *screenCaptureFrameAction = 
new Qt3DLogic::QFrameAction;
 
  232  mScene->addComponent( screenCaptureFrameAction );
 
  234  connect( screenCaptureFrameAction, &Qt3DLogic::QFrameAction::triggered, 
this, [ = ]( 
float )
 
  237    mScene->removeComponent( screenCaptureFrameAction );
 
  238    screenCaptureFrameAction->deleteLater();
 
  247  if ( tool == mMapTool )
 
  251  if ( mMapTool && !tool )
 
  254    setCursor( Qt::OpenHandCursor );
 
  256  else if ( !mMapTool && tool )
 
  269    setCursor( mMapTool->
cursor() );
 
 
  276  if ( watched != 
this )
 
  279  if ( event->type() == QEvent::ShortcutOverride )
 
  295  switch ( event->type() )
 
  297    case QEvent::MouseButtonPress:
 
  300    case QEvent::MouseButtonRelease:
 
  303    case QEvent::MouseMove:
 
  306    case QEvent::KeyPress:
 
  307      mMapTool->
keyPressEvent( 
static_cast<QKeyEvent *
>( event ) );
 
 
  317  if ( mTemporalController )
 
  320  mTemporalController = temporalController;
 
 
  324void Qgs3DMapCanvas::updateTemporalRange( 
const QgsDateTimeRange &temporalrange )
 
NavigationMode
The navigation mode used by 3D cameras.
 
void saveAsImage(const QString &fileName, const QString &fileFormat)
Saves the current scene as an image.
 
QVector< QgsPointXY > viewFrustum2DExtent()
Calculates the 2D extent viewed by the 3D camera as the vertices of the viewed trapezoid.
 
Qgs3DMapSettings * mapSettings()
Returns access to the 3D scene configuration.
 
void setTemporalController(QgsTemporalController *temporalController)
Sets the temporal controller.
 
void mapSettingsChanged()
Emitted when the the map setting is changed.
 
Qt3DRender::QCamera * camera() const
Returns the default camera of the 3D Window.
 
void viewed2DExtentFrom3DChanged(QVector< QgsPointXY > extent)
Emitted when the viewed 2D extent seen by the 3D camera has changed.
 
void fpsCountChanged(float fpsCount)
Emitted when the FPS count changes (at most every frame)
 
void setRootEntity(Qt3DCore::QEntity *root)
Sets the specified root entity of the scene.
 
void setViewFromTop(const QgsPointXY ¢er, float distance, float rotation=0)
Sets camera position to look down at the given point (in map coordinates) in given distance from plan...
 
void setActiveFrameGraph(Qt3DRender::QFrameGraphNode *activeFrameGraph)
Activates the specified activeFrameGraph.
 
void setMapSettings(Qgs3DMapSettings *mapSettings)
Configure map scene being displayed. Takes ownership.
 
void showEvent(QShowEvent *e) override
Manages the display events specified in e.
 
void cameraNavigationSpeedChanged(double speed)
Emitted when the camera navigation speed is changed.
 
Qt3DRender::QRenderSettings * renderSettings() const
Returns the render settings of the 3D Window.
 
~Qgs3DMapCanvas()
Destructor for Qgs3DMapCanvas.
 
Qt3DRender::QFrameGraphNode * activeFrameGraph() const
Returns the node of the active frame graph.
 
void setMapTool(Qgs3DMapTool *tool)
Sets the active map tool that will receive events from the 3D canvas.
 
void setViewFrom2DExtent(const QgsRectangle &extent)
Resets camera view to show the extent (top view)
 
Qgs3DMapCanvas()
Constructor for Qgs3DMapCanvas.
 
void resizeEvent(QResizeEvent *) override
Resets the aspect ratio of the 3D window.
 
void resetView()
Resets camera position to the default: looking down at the origin of world coordinates.
 
void savedAsImage(const QString &fileName)
Emitted when the 3D map canvas was successfully saved as image.
 
void fpsCounterEnabledChanged(bool enabled)
Emitted when the FPS counter is enabled or disabeld.
 
QgsCameraController * cameraController()
Returns access to the view's camera controller. Returns nullptr if the scene has not been initialized...
 
bool eventFilter(QObject *watched, QEvent *event) override
 
void viewed2DExtentFrom3DChanged(QVector< QgsPointXY > extent)
Emitted when the viewed 2D extent seen by the 3D camera has changed.
 
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)
 
QgsCameraController * cameraController() const
Returns camera controller.
 
void updateTemporal()
Updates the temporale entities.
 
void fpsCounterEnabledChanged(bool fpsCounterEnabled)
Emitted when the FPS counter is activated or deactivated.
 
QVector< QgsPointXY > viewFrustum2DExtent() const
Calculates the 2D extent viewed by the 3D camera as the vertices of the viewed trapezoid.
 
void viewZoomFull()
Resets camera view to show the whole scene (top view)
 
void setCameraNavigationMode(Qgis::NavigationMode navigationMode)
Sets the navigation mode for the camera.
 
void setCameraMovementSpeed(double movementSpeed)
Sets the camera movement speed.
 
QgsVector3D origin() const
Returns coordinates in map CRS at which 3D scene has origin (0,0,0)
 
void requestCaptureImage()
Starts a request for an image rendered by the engine.
 
void requestDepthBufferCapture()
Starts a request for an image containing the depth buffer data of the engine.
 
void imageCaptured(const QImage &image)
Emitted after a call to requestCaptureImage() to return the captured image.
 
void depthBufferCaptured(const QImage &image)
Emitted after a call to requestDepthBufferCapture() to return the captured depth buffer.
 
void setRenderCaptureEnabled(bool enabled)
Sets whether it will be possible to render to an image.
 
void navigationModeChanged(Qgis::NavigationMode mode)
Emitted when the navigation mode is changed using the hotkey ctrl + ~.
 
void requestDepthBufferCapture()
Emitted to ask for the depth buffer image.
 
void cameraMovementSpeedChanged(double speed)
Emitted whenever the camera movement speed is changed by the controller.
 
void setViewFromTop(float worldX, float worldY, float distance, float yaw=0)
Sets camera to look down towards given point in world coordinate, in given distance from plane with z...
 
void depthBufferCaptured(const QImage &depthImage)
Sets the depth buffer image used by the camera controller to calculate world position from a pixel's ...
 
void setCursorPosition(QPoint point)
Emitted when the mouse cursor position should be moved to the specified point on the map viewport.
 
A class to represent a 2D point.
 
A rectangle specified with double values.
 
This class is a composition of two QSettings instances:
 
A controller base class for temporal objects, contains a signal for notifying updates of the objects ...
 
void updateTemporalRange(const QgsDateTimeRange &range)
Signals that a temporal range has changed and needs to be updated in all connected objects.
 
void setTemporalRange(const QgsDateTimeRange &range)
Sets the temporal range for the object.
 
double y() const
Returns Y coordinate.
 
double x() const
Returns X coordinate.
 
void setRootEntity(Qt3DCore::QEntity *root) override
Sets root entity of the 3D scene.
 
void setSize(QSize s) override
Sets the size of the rendering area (in pixels)