30#include <Qt3DRender/QTexture>
31#include <Qt3DRender/QTechnique>
32#include <Qt3DRender/QCullFace>
36QgsTerrainTileLoader::QgsTerrainTileLoader( QgsTerrainEntity *terrain, QgsChunkNode *node )
37 : QgsChunkLoader( node )
41 const QgsChunkNodeId nodeId = node->tileId();
44 mTileDebugText = nodeId.text();
47void QgsTerrainTileLoader::loadTexture()
49 connect( mTerrain->textureGenerator(), &QgsTerrainTextureGenerator::tileReady,
this, &QgsTerrainTileLoader::onImageReady );
50 mTextureJobId = mTerrain->textureGenerator()->render( mExtentMapCrs, mNode->tileId(), mTileDebugText );
53void QgsTerrainTileLoader::createTextureComponent( QgsTerrainTileEntity *entity,
bool isShadingEnabled,
const QgsPhongMaterialSettings &shadingMaterial,
bool useTexture )
55 Qt3DRender::QTexture2D *texture = useTexture || !isShadingEnabled ? createTexture( entity ) : nullptr;
57 Qt3DRender::QMaterial *material =
nullptr;
60 if ( isShadingEnabled )
62 QgsPhongTexturedMaterial *phongTexturedMaterial =
new QgsPhongTexturedMaterial();
63 phongTexturedMaterial->setAmbient( shadingMaterial.
ambient() );
64 phongTexturedMaterial->setSpecular( shadingMaterial.
specular() );
65 phongTexturedMaterial->setShininess(
static_cast<float>( shadingMaterial.
shininess() ) );
66 phongTexturedMaterial->setDiffuseTexture( texture );
67 phongTexturedMaterial->setOpacity(
static_cast<float>( shadingMaterial.
opacity() ) );
68 material = phongTexturedMaterial;
72 QgsTextureMaterial *textureMaterial =
new QgsTextureMaterial;
73 textureMaterial->setTexture( texture );
74 material = textureMaterial;
85 const QVector<Qt3DRender::QTechnique *> techniques = material->effect()->techniques();
86 for ( Qt3DRender::QTechnique *technique : techniques )
88 const QVector<Qt3DRender::QRenderPass *> passes = technique->renderPasses();
89 for ( Qt3DRender::QRenderPass *pass : passes )
91 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
92 cullFace->setMode( Qt3DRender::QCullFace::NoCulling );
93 pass->addRenderState( cullFace );
97 entity->addComponent( material );
100Qt3DRender::QTexture2D *QgsTerrainTileLoader::createTexture( QgsTerrainTileEntity *entity )
102 Qt3DRender::QTexture2D *texture =
new Qt3DRender::QTexture2D;
103 QgsTerrainTextureImage *textureImage =
new QgsTerrainTextureImage( mTextureImage, mExtentMapCrs, mTileDebugText );
104 texture->addTextureImage( textureImage );
105 texture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
106 texture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
108 entity->setTextureImage( textureImage );
113void QgsTerrainTileLoader::onTextureLoaded()
118void QgsTerrainTileLoader::onImageReady(
int jobId,
const QImage &image )
120 if ( mTextureJobId == jobId )
122 mTextureImage = image;
QgsTerrainGenerator * terrainGenerator() const
Returns the terrain generator.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used in the 3D scene.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
static QgsRectangle tryReprojectExtent2D(const QgsRectangle &extent, const QgsCoordinateReferenceSystem &crs1, const QgsCoordinateReferenceSystem &crs2, const QgsCoordinateTransformContext &context)
Reprojects extent from crs1 to crs2 coordinate reference system with context context.
void setIsSelected(bool isSelected)
Sets whether the material should represent a selected state.
Qt3DRender::QMaterial * toMaterial(QgsMaterialSettingsRenderingTechnique technique, const QgsMaterialContext &context) const override
Creates a new QMaterial object representing the material settings.
double opacity() const
Returns the opacity of the surface.
QColor specular() const
Returns specular color component.
QColor ambient() const
Returns ambient color component.
double shininess() const
Returns shininess of the surface.
A rectangle specified with double values.
QgsCoordinateReferenceSystem crs() const
Returns CRS of the terrain.
const QgsTilingScheme & tilingScheme() const
Returns tiling scheme of the terrain.
QgsRectangle tileToExtent(int x, int y, int z) const
Returns map coordinates of the extent of a tile.
@ Triangles
Triangle based rendering (default)