Navigation Menu

Skip to content

Commit

Permalink
filter children with aabb intersection
Browse files Browse the repository at this point in the history
  • Loading branch information
uclaros authored and nyalldawson committed Jan 23, 2023
1 parent 3977470 commit f384411
Show file tree
Hide file tree
Showing 14 changed files with 27 additions and 20 deletions.
7 changes: 3 additions & 4 deletions src/3d/chunks/qgschunkloader_p.cpp
Expand Up @@ -24,11 +24,12 @@ QgsQuadtreeChunkLoaderFactory::QgsQuadtreeChunkLoaderFactory() = default;

QgsQuadtreeChunkLoaderFactory::~QgsQuadtreeChunkLoaderFactory() = default;

void QgsQuadtreeChunkLoaderFactory::setupQuadtree( const QgsAABB &rootBbox, float rootError, int maxLevel )
void QgsQuadtreeChunkLoaderFactory::setupQuadtree( const QgsAABB &rootBbox, float rootError, int maxLevel, const QgsAABB &clippingBbox )
{
mRootBbox = rootBbox;
mRootError = rootError;
mMaxLevel = maxLevel;
mClippingBbox = clippingBbox;
}

QgsChunkNode *QgsQuadtreeChunkLoaderFactory::createRootNode() const
Expand Down Expand Up @@ -62,9 +63,7 @@ QVector<QgsChunkNode *> QgsQuadtreeChunkLoaderFactory::createChildren( QgsChunkN
const float chYMin = bbox.yMin;
const float chYMax = bbox.yMax;
const QgsAABB childBbox = QgsAABB( chXMin, chYMin, chZMin, chXMax, chYMax, chZMax );
const QgsPointXY center = mExtent.center();
QgsRectangle childRect = Qgs3DUtils::worldToMapExtent( childBbox, QgsVector3D( center.x(), center.y(), 0 ) );
if ( mExtent.intersects( childRect ) )
if ( mClippingBbox.isEmpty() || childBbox.intersects( mClippingBbox ) )
children << new QgsChunkNode( childId, childBbox, childError, node );
}
return children;
Expand Down
3 changes: 2 additions & 1 deletion src/3d/chunks/qgschunkloader_p.h
Expand Up @@ -100,13 +100,14 @@ class _3D_EXPORT QgsQuadtreeChunkLoaderFactory : public QgsChunkLoaderFactory
virtual ~QgsQuadtreeChunkLoaderFactory();

//! Initializes the root node setup (bounding box and error) and tree depth
void setupQuadtree( const QgsAABB &rootBbox, float rootError, int maxLevel );
void setupQuadtree( const QgsAABB &rootBbox, float rootError, int maxLevel, const QgsAABB &clippingBbox = QgsAABB() );

virtual QgsChunkNode *createRootNode() const override;
virtual QVector<QgsChunkNode *> createChildren( QgsChunkNode *node ) const override;

protected:
QgsAABB mRootBbox;
QgsAABB mClippingBbox;
float mRootError;
//! maximum allowed depth of quad tree
int mMaxLevel;
Expand Down
2 changes: 1 addition & 1 deletion src/3d/mesh/qgsmeshterraingenerator.cpp
Expand Up @@ -122,7 +122,7 @@ QgsTerrainGenerator *QgsMeshTerrainGenerator::clone() const

QgsTerrainGenerator::Type QgsMeshTerrainGenerator::type() const {return QgsTerrainGenerator::Mesh;}

QgsRectangle QgsMeshTerrainGenerator::extent() const
QgsRectangle QgsMeshTerrainGenerator::rootChunkExtent() const
{
return mTriangularMesh.extent();
}
Expand Down
2 changes: 1 addition & 1 deletion src/3d/mesh/qgsmeshterraingenerator.h
Expand Up @@ -82,7 +82,7 @@ class _3D_EXPORT QgsMeshTerrainGenerator: public QgsTerrainGenerator
void resolveReferences( const QgsProject &project ) override;
QgsTerrainGenerator *clone() const override SIP_FACTORY;
Type type() const override;
QgsRectangle extent() const override;
QgsRectangle rootChunkExtent() const override;
void writeXml( QDomElement &elem ) const override;
void readXml( const QDomElement &elem ) override;
float heightAt( double x, double y, const Qgs3DMapSettings & ) const override;
Expand Down
7 changes: 4 additions & 3 deletions src/3d/qgs3dmapscene.cpp
Expand Up @@ -621,11 +621,12 @@ void Qgs3DMapScene::createTerrainDeferred()
{
if ( mMap.terrainRenderingEnabled() && mMap.terrainGenerator() )
{
double tile0width = mMap.terrainGenerator()->extent().width();
double tile0width = mMap.terrainGenerator()->rootChunkExtent().width();
int maxZoomLevel = Qgs3DUtils::maxZoomLevel( tile0width, mMap.mapTileResolution(), mMap.maxTerrainGroundError() );
QgsAABB rootBbox = mMap.terrainGenerator()->rootChunkBbox( mMap );
float rootError = mMap.terrainGenerator()->rootChunkError( mMap );
mMap.terrainGenerator()->setupQuadtree( rootBbox, rootError, maxZoomLevel );
const QgsAABB clippingBbox = Qgs3DUtils::mapToWorldExtent( mMap.extent(), rootBbox.zMin, rootBbox.zMax, mMap.origin() );
mMap.terrainGenerator()->setupQuadtree( rootBbox, rootError, maxZoomLevel, clippingBbox );

mTerrain = new QgsTerrainEntity( mMap );
mTerrain->setParent( this );
Expand Down Expand Up @@ -1237,7 +1238,7 @@ QgsRectangle Qgs3DMapScene::sceneExtent()
{
if ( QgsTerrainGenerator *terrainGenerator = mMap.terrainGenerator() )
{
QgsRectangle terrainExtent = terrainGenerator->extent();
QgsRectangle terrainExtent = terrainGenerator->rootChunkExtent();
QgsCoordinateTransform terrainToMapTransform( terrainGenerator->crs(), mMap.crs(), QgsProject::instance() );
terrainToMapTransform.setBallparkTransformsAreAppropriate( true );
terrainExtent = terrainToMapTransform.transformBoundingBox( terrainExtent );
Expand Down
3 changes: 3 additions & 0 deletions src/3d/qgsaabb.h
Expand Up @@ -78,6 +78,9 @@ class _3D_EXPORT QgsAABB
//! Returns text representation of the bounding box
QString toString() const;

//! Returns true if any of xExtent(), yExtent() or zExtent() is zero, false otherwise
bool isEmpty() const { return xMin == xMax || yMin == yMax || zMin == zMax; }

float xMin = 0.0f;
float yMin = 0.0f;
float zMin = 0.0f;
Expand Down
2 changes: 1 addition & 1 deletion src/3d/terrain/qgsdemterraingenerator.cpp
Expand Up @@ -61,7 +61,7 @@ QgsTerrainGenerator::Type QgsDemTerrainGenerator::type() const
return QgsTerrainGenerator::Dem;
}

QgsRectangle QgsDemTerrainGenerator::extent() const
QgsRectangle QgsDemTerrainGenerator::rootChunkExtent() const
{
return mTerrainTilingScheme.tileToExtent( 0, 0, 0 );
}
Expand Down
2 changes: 1 addition & 1 deletion src/3d/terrain/qgsdemterraingenerator.h
Expand Up @@ -70,7 +70,7 @@ class _3D_EXPORT QgsDemTerrainGenerator : public QgsTerrainGenerator

QgsTerrainGenerator *clone() const override SIP_FACTORY;
Type type() const override;
QgsRectangle extent() const override;
QgsRectangle rootChunkExtent() const override;
void setExtent( const QgsRectangle &extent ) override;
float heightAt( double x, double y, const Qgs3DMapSettings &map ) const override;
void writeXml( QDomElement &elem ) const override;
Expand Down
2 changes: 1 addition & 1 deletion src/3d/terrain/qgsflatterraingenerator.cpp
Expand Up @@ -108,7 +108,7 @@ QgsTerrainGenerator::Type QgsFlatTerrainGenerator::type() const
return QgsTerrainGenerator::Flat;
}

QgsRectangle QgsFlatTerrainGenerator::extent() const
QgsRectangle QgsFlatTerrainGenerator::rootChunkExtent() const
{
return mTerrainTilingScheme.tileToExtent( 0, 0, 0 );
}
Expand Down
2 changes: 1 addition & 1 deletion src/3d/terrain/qgsflatterraingenerator.h
Expand Up @@ -60,7 +60,7 @@ class _3D_EXPORT QgsFlatTerrainGenerator : public QgsTerrainGenerator

QgsTerrainGenerator *clone() const override SIP_FACTORY;
Type type() const override;
QgsRectangle extent() const override;
QgsRectangle rootChunkExtent() const override;
void setExtent( const QgsRectangle &extent ) override;
void rootChunkHeightRange( float &hMin, float &hMax ) const override;
void writeXml( QDomElement &elem ) const override;
Expand Down
2 changes: 1 addition & 1 deletion src/3d/terrain/qgsonlineterraingenerator.cpp
Expand Up @@ -44,7 +44,7 @@ QgsTerrainGenerator::Type QgsOnlineTerrainGenerator::type() const
return QgsTerrainGenerator::Online;
}

QgsRectangle QgsOnlineTerrainGenerator::extent() const
QgsRectangle QgsOnlineTerrainGenerator::rootChunkExtent() const
{
return mTerrainTilingScheme.tileToExtent( 0, 0, 0 );
}
Expand Down
2 changes: 1 addition & 1 deletion src/3d/terrain/qgsonlineterraingenerator.h
Expand Up @@ -62,7 +62,7 @@ class _3D_EXPORT QgsOnlineTerrainGenerator : public QgsTerrainGenerator

QgsTerrainGenerator *clone() const override SIP_FACTORY;
Type type() const override;
QgsRectangle extent() const override;
QgsRectangle rootChunkExtent() const override;
void setExtent( const QgsRectangle &extent ) override;
float heightAt( double x, double y, const Qgs3DMapSettings &map ) const override;
void writeXml( QDomElement &elem ) const override;
Expand Down
4 changes: 2 additions & 2 deletions src/3d/terrain/qgsterraingenerator.cpp
Expand Up @@ -21,7 +21,7 @@

QgsAABB QgsTerrainGenerator::rootChunkBbox( const Qgs3DMapSettings &map ) const
{
QgsRectangle te = extent();
QgsRectangle te = rootChunkExtent();
QgsCoordinateTransform terrainToMapTransform( crs(), map.crs(), map.transformContext() );
terrainToMapTransform.setBallparkTransformsAreAppropriate( true );
te = terrainToMapTransform.transformBoundingBox( te );
Expand All @@ -34,7 +34,7 @@ QgsAABB QgsTerrainGenerator::rootChunkBbox( const Qgs3DMapSettings &map ) const

float QgsTerrainGenerator::rootChunkError( const Qgs3DMapSettings &map ) const
{
QgsRectangle te = extent();
QgsRectangle te = rootChunkExtent();
QgsCoordinateTransform terrainToMapTransform( crs(), map.crs(), map.transformContext() );
terrainToMapTransform.setBallparkTransformsAreAppropriate( true );
te = terrainToMapTransform.transformBoundingBox( te );
Expand Down
7 changes: 5 additions & 2 deletions src/3d/terrain/qgsterraingenerator.h
Expand Up @@ -69,12 +69,15 @@ class _3D_EXPORT QgsTerrainGenerator : public QgsQuadtreeChunkLoaderFactory
//! What texture generator implementation is this
virtual Type type() const = 0;

//! extent of the terrain in terrain's CRS
virtual QgsRectangle extent() const = 0;
//! extent of the terrain in terrain's CRS, might be non-square and smaller than rootChunkExtent()
virtual QgsRectangle extent() const { return mExtent; }

//! sets the extent of the terrain in terrain's CRS
virtual void setExtent( const QgsRectangle &extent ) { Q_UNUSED( extent ) }

//! extent of the terrain's root chunk in terrain's CRS
virtual QgsRectangle rootChunkExtent() const = 0;

//! Returns bounding box of the root chunk
virtual QgsAABB rootChunkBbox( const Qgs3DMapSettings &map ) const;

Expand Down

0 comments on commit f384411

Please sign in to comment.