QGIS API Documentation 3.28.14-Firenze (exported)
Loading...
Searching...
No Matches
qgsflatterraingenerator.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsflatterraingenerator.cpp
3 --------------------------------------
4 Date : July 2017
5 Copyright : (C) 2017 by Martin Dobias
6 Email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include <Qt3DRender/QGeometryRenderer>
19#include <Qt3DCore/QTransform>
20
21#include "qgs3dmapsettings.h"
22#include "qgschunknode_p.h"
23#include "qgsterrainentity_p.h"
26
27
28//---------------
29
30
31FlatTerrainChunkLoader::FlatTerrainChunkLoader( QgsTerrainEntity *terrain, QgsChunkNode *node )
32 : QgsTerrainTileLoader( terrain, node )
33{
34 loadTexture();
35}
36
37
38Qt3DCore::QEntity *FlatTerrainChunkLoader::createEntity( Qt3DCore::QEntity *parent )
39{
40 QgsTerrainTileEntity *entity = new QgsTerrainTileEntity( mNode->tileId() );
41
42 // make geometry renderer
43
44 // simple quad geometry shared by all tiles
45 // QPlaneGeometry by default is 1x1 with mesh resolution QSize(2,2), centered at 0
46 // TODO: the geometry could be shared inside Terrain instance (within terrain-generator specific data?)
47 mTileGeometry = new Qt3DExtras::QPlaneGeometry;
48
49 Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer;
50 mesh->setGeometry( mTileGeometry ); // takes ownership if the component has no parent
51 entity->addComponent( mesh ); // takes ownership if the component has no parent
52
53 // create material
54
55 const Qgs3DMapSettings &map = terrain()->map3D();
56 createTextureComponent( entity, map.isTerrainShadingEnabled(), map.terrainShadingMaterial(), !map.layers().empty() );
57
58 // create transform
59
60 Qt3DCore::QTransform *transform = nullptr;
61 transform = new Qt3DCore::QTransform();
62 entity->addComponent( transform );
63
64 // set up transform according to the extent covered by the quad geometry
65 const QgsAABB bbox = mNode->bbox();
66 const double side = bbox.xMax - bbox.xMin;
67 const double half = side / 2;
68
69 transform->setScale( side );
70 transform->setTranslation( QVector3D( bbox.xMin + half, 0, bbox.zMin + half ) );
71
72 entity->setParent( parent );
73 return entity;
74}
75
77
78// ---------------
79
80QgsChunkLoader *QgsFlatTerrainGenerator::createChunkLoader( QgsChunkNode *node ) const
81{
82 return new FlatTerrainChunkLoader( mTerrain, node );
83}
84
86{
88 cloned->mCrs = mCrs;
89 cloned->mExtent = mExtent;
90 cloned->updateTilingScheme();
91 return cloned;
92}
93
98
103
104void QgsFlatTerrainGenerator::rootChunkHeightRange( float &hMin, float &hMax ) const
105{
106 hMin = 0;
107 hMax = 0;
108}
109
110void QgsFlatTerrainGenerator::writeXml( QDomElement &elem ) const
111{
112 const QgsRectangle r = mExtent;
113 QDomElement elemExtent = elem.ownerDocument().createElement( QStringLiteral( "extent" ) );
114 elemExtent.setAttribute( QStringLiteral( "xmin" ), QString::number( r.xMinimum() ) );
115 elemExtent.setAttribute( QStringLiteral( "xmax" ), QString::number( r.xMaximum() ) );
116 elemExtent.setAttribute( QStringLiteral( "ymin" ), QString::number( r.yMinimum() ) );
117 elemExtent.setAttribute( QStringLiteral( "ymax" ), QString::number( r.yMaximum() ) );
118 elem.appendChild( elemExtent );
119
120 // crs is not read/written - it should be the same as destination crs of the map
121}
122
123void QgsFlatTerrainGenerator::readXml( const QDomElement &elem )
124{
125 const QDomElement elemExtent = elem.firstChildElement( QStringLiteral( "extent" ) );
126 const double xmin = elemExtent.attribute( QStringLiteral( "xmin" ) ).toDouble();
127 const double xmax = elemExtent.attribute( QStringLiteral( "xmax" ) ).toDouble();
128 const double ymin = elemExtent.attribute( QStringLiteral( "ymin" ) ).toDouble();
129 const double ymax = elemExtent.attribute( QStringLiteral( "ymax" ) ).toDouble();
130
131 setExtent( QgsRectangle( xmin, ymin, xmax, ymax ) );
132
133 // crs is not read/written - it should be the same as destination crs of the map
134}
135
137{
138 mCrs = crs;
139 updateTilingScheme();
140}
141
143{
144 if ( mExtent == extent )
145 return;
146
147 mExtent = extent;
148 updateTilingScheme();
149
150 emit extentChanged();
151}
152
153void QgsFlatTerrainGenerator::updateTilingScheme()
154{
155 if ( mExtent.isNull() )
156 {
158 }
159 else
160 {
161 // the real extent will be a square where the given extent fully fits
162 mTerrainTilingScheme = QgsTilingScheme( mExtent, mCrs );
163 }
164}
bool isTerrainShadingEnabled() const
Returns whether terrain shading is enabled.
QgsPhongMaterialSettings terrainShadingMaterial() const
Returns terrain shading material.
QList< QgsMapLayer * > layers() const
Returns the list of 3D map layers to be rendered in the scene.
float xMax
Definition qgsaabb.h:84
float xMin
Definition qgsaabb.h:81
float zMin
Definition qgsaabb.h:83
This class represents a coordinate reference system (CRS).
QgsChunkLoader * createChunkLoader(QgsChunkNode *node) const override SIP_FACTORY
Type type() const override
What texture generator implementation is this.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets CRS of the terrain.
QgsRectangle extent() const override
extent of the terrain in terrain's CRS
void rootChunkHeightRange(float &hMin, float &hMax) const override
Returns height range of the root chunk in world coordinates.
QgsCoordinateReferenceSystem crs() const
Returns CRS of the terrain.
void writeXml(QDomElement &elem) const override
Write terrain generator's configuration to XML.
QgsTerrainGenerator * clone() const override SIP_FACTORY
Makes a copy of the current instance.
QgsFlatTerrainGenerator()=default
Creates flat terrain generator object.
void readXml(const QDomElement &elem) override
Read terrain generator's configuration from XML.
void setExtent(const QgsRectangle &extent) override
sets the extent of the terrain in terrain's CRS
A rectangle specified with double values.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double xMaximum() const
Returns the x maximum value (right side of rectangle).
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Type
Enumeration of the available terrain generators.
@ Flat
The whole terrain is flat area.
QgsTilingScheme mTerrainTilingScheme
Tiling scheme of the terrain.
void extentChanged()
Emitted when the terrain extent has changed.
QgsTerrainEntity * mTerrain
QgsRectangle tileToExtent(int x, int y, int z) const
Returns map coordinates of the extent of a tile.
const QgsCoordinateReferenceSystem & crs