24#include <QOpenGLTexture>
26#include <Qt3DExtras/QTextureMaterial>
27#include <Qt3DRender/QTextureDataUpdate>
29#include "moc_qgsmapoverlayentity.cpp"
36 , mMapSettings( mapSettings )
37 , mTextureGenerator( new QgsMapOverlayTextureGenerator( *mapSettings, SIZE() ) )
39 Qt3DRender::QTexture2D *mapTexture = mTextureParameter->value().value<Qt3DRender::QTexture2D *>();
40 mapTexture->setFormat( Qt3DRender::QAbstractTexture::RGBA8_UNorm );
41 mapTexture->setWidth( SIZE() );
42 mapTexture->setHeight( SIZE() );
43 mapTexture->setGenerateMipMaps(
false );
44 mapTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
45 mapTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
46 mapTexture->setWrapMode( Qt3DRender::QTextureWrapMode( Qt3DRender::QTextureWrapMode::ClampToEdge ) );
48 mIsDepth->setValue(
false );
49 mFlipTextureY->setValue(
false );
51 mImageDataPtr = Qt3DRender::QTextureImageDataPtr::create();
52 mImageDataPtr->setTarget( QOpenGLTexture::Target2D );
53 mImageDataPtr->setFormat( QOpenGLTexture::RGB8_UNorm );
54 mImageDataPtr->setPixelFormat( QOpenGLTexture::RGB );
55 mImageDataPtr->setPixelType( QOpenGLTexture::UInt8 );
57 mImageDataPtr->setWidth( SIZE() );
58 mImageDataPtr->setHeight( SIZE() );
59 mImageDataPtr->setDepth( 1 );
60 mImageDataPtr->setLayers( 1 );
61 mImageDataPtr->setMipLevels( 1 );
62 mImageDataPtr->setFaces( 1 );
67 connect( mTextureGenerator, &QgsMapOverlayTextureGenerator::textureReady,
this, &QgsMapOverlayEntity::onTextureReady );
69 connectToLayersRepaintRequest();
73QgsMapOverlayEntity::~QgsMapOverlayEntity()
75 delete mTextureGenerator;
78void QgsMapOverlayEntity::update(
const QgsRectangle &extent,
const QVector<QgsPointXY> &frustumExtent,
double rotationDegrees,
bool showFrustum )
83 mFrustumExtent = frustumExtent;
84 mRotation = rotationDegrees;
85 mShowFrustum = showFrustum;
86 mTextureGenerator->render( extent, frustumExtent, rotationDegrees, showFrustum );
90void QgsMapOverlayEntity::invalidateMapImage()
92 update( mExtent, mFrustumExtent, mRotation, mShowFrustum );
95void QgsMapOverlayEntity::onLayersChanged()
97 connectToLayersRepaintRequest();
101void QgsMapOverlayEntity::connectToLayersRepaintRequest()
103 for (
QgsMapLayer *layer : std::as_const( mLayers ) )
108 mLayers = mMapSettings->layers();
110 for (
QgsMapLayer *layer : std::as_const( mLayers ) )
116void QgsMapOverlayEntity::onTextureReady(
const QImage &image )
118 Qt3DRender::QTexture2D *mapTexture = mTextureParameter->value().value<Qt3DRender::QTexture2D *>();
121 mImageDataPtr->setImage( image );
122 Qt3DRender::QTextureDataUpdate textureDataUpdate;
123 textureDataUpdate.setData( mImageDataPtr );
124 mapTexture->updateData( textureDataUpdate );
128void QgsMapOverlayEntity::onSizeChanged()
130 QWindow *canvas = mEngine->window();
131 const float currentHeightF =
static_cast<float>( canvas->height() );
132 const float currentWidthF =
static_cast<float>( canvas->width() );
133 const float offsetDim = 20.;
134 const float textureDim =
static_cast<float>( SIZE() );
136 const QSizeF size( textureDim / currentWidthF, textureDim / currentHeightF );
137 const QSizeF offset( offsetDim / currentWidthF, offsetDim / currentHeightF );
138 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.