23#include "moc_qgschunkloader.cpp"
27const QgsChunkLoaderResult QgsChunkLoaderResult::sEmpty = QgsChunkLoaderResult( []( Qt3DCore::QEntity * ) {
32QFuture<QgsChunkLoaderResult> QgsChunkLoader::updateChunk( QgsChunkNode *node )
34 return loadChunk( node );
37QgsQuadtreeChunkLoader::QgsQuadtreeChunkLoader() =
default;
39QgsQuadtreeChunkLoader::~QgsQuadtreeChunkLoader() =
default;
41void QgsQuadtreeChunkLoader::setupQuadtree(
const QgsBox3D &rootBox3D,
float rootError,
int maxLevel,
const QgsBox3D &clippingBox3D )
43 mRootBox3D = rootBox3D;
44 mRootError = rootError;
46 mClippingBox3D = clippingBox3D;
49QgsChunkNode *QgsQuadtreeChunkLoader::createRootNode()
const
51 return new QgsChunkNode( QgsChunkNodeId( 0, 0, 0 ), mRootBox3D, mRootError );
54QFuture<QVector<QgsChunkNode *>> QgsQuadtreeChunkLoader::createChildren( QgsChunkNode *node )
56 QVector<QgsChunkNode *> children;
59 if ( mMaxLevel != -1 && node->level() >= mMaxLevel )
60 return QtFuture::makeReadyValueFuture( children );
62 const QgsBox3D box3D = node->box3D();
66 return QtFuture::makeReadyValueFuture( children );
68 const QgsChunkNodeId nodeId = node->tileId();
69 const float childError = node->error() / 2;
70 QgsVector3D center = box3D.
center();
74 const bool skipDx = box3D.
height() > box3D.
width() * 2;
75 const bool skipDy = box3D.
width() > box3D.
height() * 2;
76 for (
int i = 0; i < 4; ++i )
78 int dx = i & 1, dy = !!( i & 2 );
85 const QgsChunkNodeId childId( nodeId.d + 1, nodeId.x * 2 + dx, nodeId.y * 2 + dy );
87 const double chXMin = dx ? center.
x() : box3D.
xMinimum();
88 const double chXMax = dx || skipDx ? box3D.
xMaximum() : center.
x();
89 const double chYMin = dy ? center.
y() : box3D.
yMinimum();
90 const double chYMax = dy || skipDy ? box3D.
yMaximum() : center.
y();
91 const double chZMin = box3D.
zMinimum();
92 const double chZMax = box3D.
zMaximum();
93 const QgsBox3D childBox3D( chXMin, chYMin, chZMin, chXMax, chYMax, chZMax );
96 if ( mClippingBox3D.isNull() || childBox3D.intersects( mClippingBox3D ) )
97 children <<
new QgsChunkNode( childId, childBox3D, childError, node );
99 return QtFuture::makeReadyValueFuture( children );
A 3-dimensional box composed of x, y, z coordinates.
double yMaximum() const
Returns the maximum y value.
double xMinimum() const
Returns the minimum x value.
double zMaximum() const
Returns the maximum z value.
QgsVector3D center() const
Returns the center of the box as a vector.
double xMaximum() const
Returns the maximum x value.
double width() const
Returns the width of the box.
double zMinimum() const
Returns the minimum z value.
double yMinimum() const
Returns the minimum y value.
double height() const
Returns the height of the box.
bool isNull() const
Test if the box is null (holding no spatial information).
double y() const
Returns Y coordinate.
double x() const
Returns X coordinate.
#define QGIS_CHECK_MAIN_THREAD_ACCESS