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( new 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, &QgsMapOverlayTextureGenerator::textureReady,
this, &QgsMapOverlayEntity::onTextureReady );
70 connectToLayersRepaintRequest();
74QgsMapOverlayEntity::~QgsMapOverlayEntity()
76 delete mTextureGenerator;
79void QgsMapOverlayEntity::update(
const QgsRectangle &extent,
const QVector<QgsPointXY> &frustumExtent,
double rotationDegrees,
bool showFrustum )
84 mFrustumExtent = frustumExtent;
85 mRotation = rotationDegrees;
86 mShowFrustum = showFrustum;
87 mTextureGenerator->render( extent, frustumExtent, rotationDegrees, showFrustum );
91void QgsMapOverlayEntity::invalidateMapImage()
93 update( mExtent, mFrustumExtent, mRotation, mShowFrustum );
96void QgsMapOverlayEntity::onLayersChanged()
98 connectToLayersRepaintRequest();
102void QgsMapOverlayEntity::connectToLayersRepaintRequest()
104 for (
QgsMapLayer *layer : std::as_const( mLayers ) )
109 mLayers = mMapSettings->layers();
111 for (
QgsMapLayer *layer : std::as_const( mLayers ) )
117void QgsMapOverlayEntity::onTextureReady(
const QImage &image )
119 Qt3DRender::QTexture2D *mapTexture = mTextureParameter->value().value<Qt3DRender::QTexture2D *>();
122 mImageDataPtr->setImage( image );
123 Qt3DRender::QTextureDataUpdate textureDataUpdate;
124 textureDataUpdate.setData( mImageDataPtr );
125 mapTexture->updateData( textureDataUpdate );
129void QgsMapOverlayEntity::onSizeChanged()
131 QWindow *canvas = mEngine->window();
132 const float currentHeightF =
static_cast<float>( canvas->height() );
133 const float currentWidthF =
static_cast<float>( canvas->width() );
134 const float offsetDim = 20.;
135 const float textureDim =
static_cast<float>( SIZE() );
137 const QSizeF size( textureDim / currentWidthF, textureDim / currentHeightF );
138 const QSizeF offset( offsetDim / currentWidthF, offsetDim / currentHeightF );
139 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.