24#include <QOpenGLTexture>
26#include <Qt3DExtras/QTextureMaterial>
27#include <Qt3DRender/QParameter>
28#include <Qt3DRender/QTextureDataUpdate>
30#include "moc_qgsmapoverlayentity.cpp"
37 , mMapSettings( mapSettings )
38 , mTextureGenerator( std::make_unique<QgsMapOverlayTextureGenerator>( *mapSettings, SIZE() ) )
40 Qt3DRender::QTexture2D *mapTexture = mTextureParameter->value().value<Qt3DRender::QTexture2D *>();
41 mapTexture->setFormat( Qt3DRender::QAbstractTexture::RGBA8_UNorm );
42 mapTexture->setWidth( SIZE() );
43 mapTexture->setHeight( SIZE() );
44 mapTexture->setGenerateMipMaps(
false );
45 mapTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
46 mapTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
47 mapTexture->setWrapMode( Qt3DRender::QTextureWrapMode( Qt3DRender::QTextureWrapMode::ClampToEdge ) );
49 mIsDepth->setValue(
false );
50 mFlipTextureY->setValue(
false );
52 mImageDataPtr = Qt3DRender::QTextureImageDataPtr::create();
53 mImageDataPtr->setTarget( QOpenGLTexture::Target2D );
54 mImageDataPtr->setFormat( QOpenGLTexture::RGB8_UNorm );
55 mImageDataPtr->setPixelFormat( QOpenGLTexture::RGB );
56 mImageDataPtr->setPixelType( QOpenGLTexture::UInt8 );
58 mImageDataPtr->setWidth( SIZE() );
59 mImageDataPtr->setHeight( SIZE() );
60 mImageDataPtr->setDepth( 1 );
61 mImageDataPtr->setLayers( 1 );
62 mImageDataPtr->setMipLevels( 1 );
63 mImageDataPtr->setFaces( 1 );
68 connect( mTextureGenerator.get(), &QgsMapOverlayTextureGenerator::textureReady,
this, &QgsMapOverlayEntity::onTextureReady );
70 connectToLayersRepaintRequest();
74QgsMapOverlayEntity::~QgsMapOverlayEntity()
77void QgsMapOverlayEntity::update(
const QgsRectangle &extent,
const QVector<QgsPointXY> &frustumExtent,
double rotationDegrees,
bool showFrustum )
82 mFrustumExtent = frustumExtent;
83 mRotation = rotationDegrees;
84 mShowFrustum = showFrustum;
85 mTextureGenerator->render( extent, frustumExtent, rotationDegrees, showFrustum );
89void QgsMapOverlayEntity::invalidateMapImage()
91 update( mExtent, mFrustumExtent, mRotation, mShowFrustum );
94void QgsMapOverlayEntity::onLayersChanged()
96 connectToLayersRepaintRequest();
100void QgsMapOverlayEntity::connectToLayersRepaintRequest()
102 for (
QgsMapLayer *layer : std::as_const( mLayers ) )
107 mLayers = mMapSettings->layers();
109 for (
QgsMapLayer *layer : std::as_const( mLayers ) )
115void QgsMapOverlayEntity::onTextureReady(
const QImage &image )
117 Qt3DRender::QTexture2D *mapTexture = mTextureParameter->value().value<Qt3DRender::QTexture2D *>();
120 mImageDataPtr->setImage( image );
121 Qt3DRender::QTextureDataUpdate textureDataUpdate;
122 textureDataUpdate.setData( mImageDataPtr );
123 mapTexture->updateData( textureDataUpdate );
127void QgsMapOverlayEntity::onSizeChanged()
129 QWindow *canvas = mEngine->window();
130 const float currentHeightF =
static_cast<float>( canvas->height() );
131 const float currentWidthF =
static_cast<float>( canvas->width() );
132 const float offsetDim = 20.;
133 const float textureDim =
static_cast<float>( SIZE() );
135 const QSizeF size( textureDim / currentWidthF, textureDim / currentHeightF );
136 const QSizeF offset( offsetDim / currentWidthF, offsetDim / currentHeightF );
137 setPosition( Qt::Corner::BottomLeftCorner, size, offset );
void layersChanged()
Emitted when the list of map layers for 3d rendering has changed.
void sizeChanged()
Emitted after a call to setSize().
Base class for all map layer types.
void repaintRequested(bool deferredUpdate=false)
By emitting this signal the layer tells that either appearance or content have been changed and any v...
An entity responsible for rendering an overlay texture in 3D view.
Simple render view to preview overlay textures in 3D view.
A rectangle specified with double values.
On-screen 3D engine: it creates an OpenGL window (QWindow) and displays rendered 3D scenes there.