19#include <Qt3DCore/QEntity> 
   20#include <Qt3DExtras/QText2DEntity> 
   21#include <Qt3DRender/QCamera> 
   22#include <Qt3DRender/QViewport> 
   23#include <Qt3DRender/QPickEvent> 
   24#include <Qt3DRender/QScreenRayCaster> 
   25#include <Qt3DRender/qsubtreeenabler.h> 
   26#include <Qt3DRender/QSortPolicy> 
   32#include <Qt3DRender/QLayer> 
   33#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) 
   34#include <Qt3DRender/QBuffer> 
   37#include <Qt3DCore/QBuffer> 
   40#include <Qt3DRender/QGeometryRenderer> 
   54  , mMapSettings( settings )
 
   58  mViewport->setObjectName( 
mViewName + 
"::Viewport" );
 
   60  mObjectLayer = 
new Qt3DRender::QLayer;
 
   61  mObjectLayer->setObjectName( 
mViewName + 
"::ObjectLayer" );
 
   62  mObjectLayer->setRecursive( 
true );
 
   64  mLabelLayer = 
new Qt3DRender::QLayer;
 
   65  mLabelLayer->setObjectName( 
mViewName + 
"::LabelLayer" );
 
   66  mLabelLayer->setRecursive( 
true );
 
   69  Qt3DRender::QLayerFilter *objectFilter = 
new Qt3DRender::QLayerFilter( mViewport );
 
   70  objectFilter->addLayer( mObjectLayer );
 
   72  mObjectCamera = 
new Qt3DRender::QCamera;
 
   73  mObjectCamera->setObjectName( 
mViewName + 
"::ObjectCamera" );
 
   74  mObjectCamera->setProjectionType( cameraCtrl->
camera()->projectionType() );
 
   75  mObjectCamera->lens()->setFieldOfView( cameraCtrl->
camera()->lens()->fieldOfView() * 0.5f );
 
   77  Qt3DRender::QCameraSelector *cameraSelector = 
new Qt3DRender::QCameraSelector( objectFilter );
 
   78  cameraSelector->setCamera( mObjectCamera );
 
   82  Qt3DRender::QSortPolicy *objectSortPolicy = 
new Qt3DRender::QSortPolicy( cameraSelector );
 
   83  QVector<Qt3DRender::QSortPolicy::SortType> objectSortTypes = QVector<Qt3DRender::QSortPolicy::SortType>();
 
   84  objectSortTypes << Qt3DRender::QSortPolicy::BackToFront;
 
   85  objectSortPolicy->setSortTypes( objectSortTypes );
 
   87  Qt3DRender::QClearBuffers *objectClearBuffers = 
new Qt3DRender::QClearBuffers( objectSortPolicy );
 
   88  objectClearBuffers->setBuffers( Qt3DRender::QClearBuffers::DepthBuffer );
 
   90  Qt3DRender::QLayerFilter *labelFilter = 
new Qt3DRender::QLayerFilter( mViewport );
 
   91  labelFilter->addLayer( mLabelLayer );
 
   93  mLabelCamera = 
new Qt3DRender::QCamera;
 
   94  mLabelCamera->setObjectName( 
mViewName + 
"::LabelCamera" );
 
   95  mLabelCamera->setProjectionType( Qt3DRender::QCameraLens::ProjectionType::OrthographicProjection );
 
   97  Qt3DRender::QCameraSelector *labelCameraSelector = 
new Qt3DRender::QCameraSelector( labelFilter );
 
   98  labelCameraSelector->setCamera( mLabelCamera );
 
  102  Qt3DRender::QSortPolicy *labelSortPolicy = 
new Qt3DRender::QSortPolicy( labelCameraSelector );
 
  103  QVector<Qt3DRender::QSortPolicy::SortType> labelSortTypes = QVector<Qt3DRender::QSortPolicy::SortType>();
 
  104  labelSortTypes << Qt3DRender::QSortPolicy::BackToFront;
 
  105  labelSortPolicy->setSortTypes( labelSortTypes );
 
  107  Qt3DRender::QClearBuffers *clearBuffers = 
new Qt3DRender::QClearBuffers( labelSortPolicy );
 
  108  clearBuffers->setBuffers( Qt3DRender::QClearBuffers::DepthBuffer );
 
 
  131  return mObjectCamera;
 
 
  148  double windowWidth = 
static_cast<double>( width < 0 ? mCanvas->width() : width );
 
  149  double windowHeight = 
static_cast<double>( height < 0 ? mCanvas->height() : height );
 
  154    QgsDebugMsgLevel( QString( 
"onViewportSizeUpdate window w/h: %1px / %2px" ).arg( windowWidth ).arg( windowHeight ), 2 );
 
  155    QgsDebugMsgLevel( QString( 
"onViewportSizeUpdate window physicalDpi %1 (%2, %3)" ).arg( mCanvas->screen()->physicalDotsPerInch() ).arg( mCanvas->screen()->physicalDotsPerInchX() ).arg( mCanvas->screen()->physicalDotsPerInchY() ), 2 );
 
  156    QgsDebugMsgLevel( QString( 
"onViewportSizeUpdate window logicalDotsPerInch %1 (%2, %3)" ).arg( mCanvas->screen()->logicalDotsPerInch() ).arg( mCanvas->screen()->logicalDotsPerInchX() ).arg( mCanvas->screen()->logicalDotsPerInchY() ), 2 );
 
  158    QgsDebugMsgLevel( QString( 
"onViewportSizeUpdate window pixel ratio %1" ).arg( mCanvas->screen()->devicePixelRatio() ), 2 );
 
  166  double defaultViewportPixelSize = ( ( double ) settings.
defaultViewportSize() / 25.4 ) * 92.0;
 
  170  double viewportPixelSize = defaultViewportPixelSize + ( ( double ) settings.
defaultViewportSize() / 25.4 ) * ( mCanvas->screen()->physicalDotsPerInch() - 92.0 ) * 0.7;
 
  171  QgsDebugMsgLevel( QString( 
"onViewportSizeUpdate viewportPixelSize %1" ).arg( viewportPixelSize ), 2 );
 
  172  double widthRatio = viewportPixelSize / windowWidth;
 
  173  double heightRatio = widthRatio * windowWidth / windowHeight;
 
  175  QgsDebugMsgLevel( QString( 
"3DAxis viewport ratios width: %1% / height: %2%" ).arg( widthRatio * 100.0 ).arg( heightRatio * 100.0 ), 2 );
 
  177  if ( heightRatio * windowHeight < viewportPixelSize )
 
  179    heightRatio = viewportPixelSize / windowHeight;
 
  180    widthRatio = heightRatio * windowHeight / windowWidth;
 
  181    QgsDebugMsgLevel( QString( 
"3DAxis viewport, height too small, ratios adjusted to width: %1% / height: %2%" ).arg( widthRatio * 100.0 ).arg( heightRatio * 100.0 ), 2 );
 
  186    QgsDebugMsgLevel( QString( 
"3DAxis viewport takes too much place into the 3d view, disabling it (maxViewportRatio: %1)." ).arg( settings.
maxViewportRatio() ), 2 );
 
  188    mViewport->setEnabled( 
false );
 
  193    if ( !mViewport->isEnabled() )
 
  198    mViewport->setEnabled( 
true );
 
  205      xRatio = 0.5f - 
static_cast<float>( widthRatio ) / 2.0f;
 
  207      xRatio = 1.0f - 
static_cast<float>( widthRatio );
 
  211    else if ( settings.
verticalPosition() == Qt::AnchorPoint::AnchorVerticalCenter )
 
  212      yRatio = 0.5f - 
static_cast<float>( heightRatio ) / 2.0f;
 
  214      yRatio = 1.0f - 
static_cast<float>( heightRatio );
 
  216    QgsDebugMsgLevel( QString( 
"Qgs3DAxis: update viewport: %1 x %2 x %3 x %4" ).arg( xRatio ).arg( yRatio ).arg( widthRatio ).arg( heightRatio ), 2 );
 
  217    mViewport->setNormalizedRect( QRectF( xRatio, yRatio, widthRatio, heightRatio ) );
 
  221      const float halfWidthSize = 
static_cast<float>( windowWidth * widthRatio / 2.0 );
 
  222      const float halfHeightSize = 
static_cast<float>( windowWidth * widthRatio / 2.0 );
 
  223      mLabelCamera->lens()->setOrthographicProjection(
 
  224        -halfWidthSize, halfWidthSize,
 
  225        -halfHeightSize, halfHeightSize,
 
  226        mLabelCamera->lens()->nearPlane(), mLabelCamera->lens()->farPlane()
 
 
Qt3DRender::QLayer * labelLayer() const
Returns the layer to be used by entities to be included in the label renderpass.
 
void onVerticalPositionChanged(Qt::AnchorPoint position)
Updates viewport vertical position.
 
Qt3DRender::QCamera * labelCamera() const
Returns camera used for billboarded labels.
 
Qt3DRender::QLayer * objectLayer() const
Returns main object layer.
 
Qgs3DAxisRenderView(const QString &viewName, Qgs3DMapCanvas *canvas, QgsCameraController *cameraCtrl, Qgs3DMapSettings *settings, Qgs3DAxis *axis3D)
Constructor for Qgs3DAxisRenderView with the specified parent object.
 
Qt3DRender::QViewport * viewport() const
Returns the viewport associated to this renderview.
 
void onViewportSizeUpdate(int width=-1, int height=-1)
Updates viewport size. Uses canvas size by default.
 
Qt3DRender::QCamera * objectCamera() const
Returns main object camera (used for axis or cube)
 
virtual void updateWindowResize(int width, int height) override
Called when 3D window is resized.
 
void onHorizontalPositionChanged(Qt::AnchorPoint position)
Updates viewport horizontal position.
 
Contains the configuration of a 3d axis.
 
double maxViewportRatio() const
Returns the maximal axis viewport ratio (see Qt3DRender::QViewport::normalizedRect())
 
@ Crs
Respect CRS directions.
 
Qt::AnchorPoint verticalPosition() const
Returns the vertical position for the 3d axis.
 
void setHorizontalPosition(Qt::AnchorPoint position)
Sets the horizontal position for the 3d axis.
 
int defaultViewportSize() const
Returns the default axis viewport size in millimeters.
 
Qgs3DAxisSettings::Mode mode() const
Returns the type of the 3daxis.
 
Qt::AnchorPoint horizontalPosition() const
Returns the horizontal position for the 3d axis.
 
void setVerticalPosition(Qt::AnchorPoint position)
Sets the vertical position for the 3d axis.
 
Display 3D ortho axis in the main 3D view.
 
void onViewportScaleFactorChanged(double scaleFactor)
Used as callback from renderview when viewport scale factor changes.
 
Convenience wrapper to simplify the creation of a 3D window ready to be used with QGIS.
 
Qgs3DAxisSettings get3DAxisSettings() const
Returns the current configuration of 3d axis.
 
void set3DAxisSettings(const Qgs3DAxisSettings &axisSettings, bool force=false)
Sets the current configuration of 3d axis.
 
Base class for 3D render view.
 
Qt3DRender::QSubtreeEnabler * mRendererEnabler
 
Object that controls camera movement based on user input.
 
Qt3DRender::QCamera * camera() const
Returns camera that is being controlled.
 
static int debugLevel()
Reads the environment variable QGIS_DEBUG and converts it to int.
 
Contains configuration for rendering maps.
 
double dpiTarget() const
Returns the target DPI (dots per inch) to be taken into consideration when rendering.
 
float devicePixelRatio() const
Returns the device pixel ratio.
 
double outputDpi() const
Returns the DPI (dots per inch) used for conversion between real world units (e.g.
 
Qt3DCore::QBuffer Qt3DQBuffer
 
#define QgsDebugMsgLevel(str, level)