Skip to content

Commit 04b00aa

Browse files
committedSep 15, 2017
Update layer 3D entities when terrain generator or scale change
1 parent 2e03f5d commit 04b00aa

File tree

9 files changed

+42
-22
lines changed

9 files changed

+42
-22
lines changed
 

‎src/3d/map3d.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ Map3D::Map3D()
1717
, originY( 0 )
1818
, originZ( 0 )
1919
, backgroundColor( Qt::black )
20-
, zExaggeration( 1 )
2120
, tileTextureSize( 512 )
2221
, maxTerrainError( 3.f )
2322
, skybox( false )
23+
, mTerrainVerticalScale( 1 )
2424
, mShowTerrainBoundingBoxes( false )
2525
, mShowTerrainTileInfo( false )
2626
{
@@ -33,12 +33,12 @@ Map3D::Map3D( const Map3D &other )
3333
, originZ( other.originZ )
3434
, crs( other.crs )
3535
, backgroundColor( other.backgroundColor )
36-
, zExaggeration( other.zExaggeration )
3736
, tileTextureSize( other.tileTextureSize )
3837
, maxTerrainError( other.maxTerrainError )
3938
, skybox( other.skybox )
4039
, skyboxFileBase( other.skyboxFileBase )
4140
, skyboxFileExtension( other.skyboxFileExtension )
41+
, mTerrainVerticalScale( other.mTerrainVerticalScale )
4242
, mTerrainGenerator( other.mTerrainGenerator ? other.mTerrainGenerator->clone() : nullptr )
4343
, mShowTerrainBoundingBoxes( other.mShowTerrainBoundingBoxes )
4444
, mShowTerrainTileInfo( other.mShowTerrainTileInfo )
@@ -68,7 +68,7 @@ void Map3D::readXml( const QDomElement &elem, const QgsReadWriteContext &context
6868
crs.readXml( elemCrs );
6969

7070
QDomElement elemTerrain = elem.firstChildElement( "terrain" );
71-
zExaggeration = elemTerrain.attribute( "exaggeration", "1" ).toFloat();
71+
mTerrainVerticalScale = elemTerrain.attribute( "exaggeration", "1" ).toFloat();
7272
tileTextureSize = elemTerrain.attribute( "texture-size", "512" ).toInt();
7373
maxTerrainError = elemTerrain.attribute( "max-terrain-error", "3" ).toFloat();
7474
QDomElement elemMapLayers = elemTerrain.firstChildElement( "layers" );
@@ -149,7 +149,7 @@ QDomElement Map3D::writeXml( QDomDocument &doc, const QgsReadWriteContext &conte
149149
elem.appendChild( elemCrs );
150150

151151
QDomElement elemTerrain = doc.createElement( "terrain" );
152-
elemTerrain.setAttribute( "exaggeration", QString::number( zExaggeration ) );
152+
elemTerrain.setAttribute( "exaggeration", QString::number( mTerrainVerticalScale ) );
153153
elemTerrain.setAttribute( "texture-size", tileTextureSize );
154154
elemTerrain.setAttribute( "max-terrain-error", QString::number( maxTerrainError ) );
155155
QDomElement elemMapLayers = doc.createElement( "layers" );
@@ -208,6 +208,20 @@ void Map3D::resolveReferences( const QgsProject &project )
208208
}
209209
}
210210

211+
void Map3D::setTerrainVerticalScale( double zScale )
212+
{
213+
if ( zScale == mTerrainVerticalScale )
214+
return;
215+
216+
mTerrainVerticalScale = zScale;
217+
emit terrainVerticalScaleChanged();
218+
}
219+
220+
double Map3D::terrainVerticalScale() const
221+
{
222+
return mTerrainVerticalScale;
223+
}
224+
211225
void Map3D::setLayers( const QList<QgsMapLayer *> &layers )
212226
{
213227
QList<QgsMapLayerRef> lst;

‎src/3d/map3d.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ class _3D_EXPORT Map3D : public QObject
4545
// terrain related config
4646
//
4747

48-
double zExaggeration; //!< Multiplier of terrain heights to make the terrain shape more pronounced
48+
void setTerrainVerticalScale( double zScale );
49+
double terrainVerticalScale() const;
4950

5051
void setLayers( const QList<QgsMapLayer *> &layers );
5152
QList<QgsMapLayer *> layers() const;
@@ -75,10 +76,12 @@ class _3D_EXPORT Map3D : public QObject
7576
signals:
7677
void layersChanged();
7778
void terrainGeneratorChanged();
79+
void terrainVerticalScaleChanged();
7880
void showTerrainBoundingBoxesChanged();
7981
void showTerrainTilesInfoChanged();
8082

8183
private:
84+
double mTerrainVerticalScale; //!< Multiplier of terrain heights to make the terrain shape more pronounced
8285
std::unique_ptr<TerrainGenerator> mTerrainGenerator; //!< Implementation of the terrain generation
8386
bool mShowTerrainBoundingBoxes; //!< Whether to show bounding boxes of entities - useful for debugging
8487
bool mShowTerrainTileInfo; //!< Whether to draw extra information about terrain tiles to the textures - useful for debugging

‎src/3d/pointentity.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ PointEntity::PointEntity( const Map3D &map, QgsVectorLayer *layer, const Point3D
5353
{
5454
QgsPoint *pt = static_cast<QgsPoint *>( g );
5555
// TODO: use Z coordinates if the point is 3D
56-
float h = map.terrainGenerator()->heightAt( pt->x(), pt->y(), map ) * map.zExaggeration;
56+
float h = map.terrainGenerator()->heightAt( pt->x(), pt->y(), map ) * map.terrainVerticalScale();
5757
positions.append( QVector3D( pt->x() - map.originX, h, -( pt->y() - map.originY ) ) );
5858
//qDebug() << positions.last();
5959
}

‎src/3d/scene.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ Scene::Scene( const Map3D &map, Qt3DExtras::QForwardRenderer *defaultFrameGraph,
5656

5757
createTerrain();
5858
connect( &map, &Map3D::terrainGeneratorChanged, this, &Scene::createTerrain );
59+
connect( &map, &Map3D::terrainVerticalScaleChanged, this, &Scene::createTerrain );
5960

6061
// create entities of renderers
6162

@@ -65,14 +66,6 @@ Scene::Scene( const Map3D &map, Qt3DExtras::QForwardRenderer *defaultFrameGraph,
6566
p->setParent( this );
6667
}
6768

68-
// create entities of renderers of layers
69-
70-
Q_FOREACH ( QgsMapLayer *layer, map.layers() )
71-
{
72-
addLayerEntity( layer );
73-
// TODO: connect( layer, &QgsMapLayer::willBeDeleted, this, &Scene::onLayerWillBeDeleted );
74-
}
75-
7669
// listen to changes of layers in order to add/remove 3D renderer entities
7770
connect( &map, &Map3D::layersChanged, this, &Scene::onLayersChanged );
7871

@@ -200,6 +193,16 @@ void Scene::createTerrain()
200193
chunkEntities << mTerrain;
201194

202195
onCameraChanged(); // force update of the new terrain
196+
197+
// make sure that renderers for layers are re-created as well
198+
Q_FOREACH ( QgsMapLayer *layer, mMap.layers() )
199+
{
200+
// remove old entity - if any
201+
removeLayerEntity( layer );
202+
203+
// add new entity - if any 3D renderer
204+
addLayerEntity( layer );
205+
}
203206
}
204207

205208
void Scene::onLayerRenderer3DChanged()

‎src/3d/terrain/demterraingenerator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ class DemTerrainChunkLoader : public TerrainChunkLoader
9393
double side = extent.width();
9494
double half = side / 2;
9595

96-
transform->setScale3D( QVector3D( side, map.zExaggeration, side ) );
96+
transform->setScale3D( QVector3D( side, map.terrainVerticalScale(), side ) );
9797
transform->setTranslation( QVector3D( x0 + half, 0, - ( y0 + half ) ) );
9898

99-
node->setExactBbox( AABB( x0, zMin * map.zExaggeration, -y0, x0 + side, zMax * map.zExaggeration, -( y0 + side ) ) );
99+
node->setExactBbox( AABB( x0, zMin * map.terrainVerticalScale(), -y0, x0 + side, zMax * map.terrainVerticalScale(), -( y0 + side ) ) );
100100

101101
entity->setEnabled( false );
102102
entity->setParent( parent );

‎src/3d/terrain/terraingenerator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ AABB TerrainGenerator::rootChunkBbox( const Map3D &map ) const
1212

1313
float hMin, hMax;
1414
rootChunkHeightRange( hMin, hMax );
15-
return AABB( te.xMinimum() - map.originX, hMin * map.zExaggeration, -te.yMaximum() + map.originY,
16-
te.xMaximum() - map.originX, hMax * map.zExaggeration, -te.yMinimum() + map.originY );
15+
return AABB( te.xMinimum() - map.originX, hMin * map.terrainVerticalScale(), -te.yMaximum() + map.originY,
16+
te.xMaximum() - map.originX, hMax * map.terrainVerticalScale(), -te.yMinimum() + map.originY );
1717
}
1818

1919
float TerrainGenerator::rootChunkError( const Map3D &map ) const

‎src/3d/testapp/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ int main( int argc, char *argv[] )
6767
Map3D map;
6868
map.setLayers( QList<QgsMapLayer *>() << rlSat );
6969
map.crs = rlSat->crs();
70-
map.zExaggeration = 3;
70+
map.setTerrainVerticalScale( 3 );
7171
map.setShowTerrainBoundingBoxes( true );
7272
map.setShowTerrainTilesInfo( true );
7373

‎src/3d/utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void Utils::clampAltitudes( QgsLineString *lineString, AltitudeClamping altClamp
7474
if ( altClamp == AltClampAbsolute || altClamp == AltClampRelative )
7575
geomZ = lineString->zAt( i );
7676

77-
float z = ( terrainZ + geomZ ) * map.zExaggeration + height;
77+
float z = ( terrainZ + geomZ ) * map.terrainVerticalScale() + height;
7878
lineString->setZAt( i, z );
7979
}
8080
}

‎src/app/3d/qgs3dmapconfigwidget.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Qgs3DMapConfigWidget::Qgs3DMapConfigWidget( Map3D *map, QgsMapCanvas *mainCanvas
3535
spinTerrainResolution->setValue( 16 );
3636
}
3737

38-
spinTerrainScale->setValue( mMap->zExaggeration );
38+
spinTerrainScale->setValue( mMap->terrainVerticalScale() );
3939
spinMapResolution->setValue( mMap->tileTextureSize );
4040
spinScreenError->setValue( mMap->maxTerrainError );
4141
chkShowTileInfo->setChecked( mMap->showTerrainTilesInfo() );
@@ -68,7 +68,7 @@ void Qgs3DMapConfigWidget::apply()
6868
mMap->setTerrainGenerator( flatTerrainGen );
6969
}
7070

71-
mMap->zExaggeration = spinTerrainScale->value();
71+
mMap->setTerrainVerticalScale( spinTerrainScale->value() );
7272
mMap->tileTextureSize = spinMapResolution->value();
7373
mMap->maxTerrainError = spinScreenError->value();
7474
mMap->setShowTerrainTilesInfo( chkShowTileInfo->isChecked() );

0 commit comments

Comments
 (0)
Please sign in to comment.