22#include <Qt3DCore/QEntity>
26QgsChunkNode::QgsChunkNode(
const QgsChunkNodeId &nodeId,
const QgsBox3D &box3D,
float error, QgsChunkNode *parent )
33QgsChunkNode::~QgsChunkNode()
35 Q_ASSERT( mState == Skeleton );
36 Q_ASSERT( !mLoaderQueueEntry );
37 Q_ASSERT( !mReplacementQueueEntry );
40 Q_ASSERT( !mUpdater );
41 Q_ASSERT( !mUpdaterFactory );
43 qDeleteAll( mChildren );
46bool QgsChunkNode::allChildChunksResident( QTime currentTime )
const
48 Q_ASSERT( mChildrenPopulated );
49 for (
int i = 0; i < childCount(); ++i )
51 if ( mChildren[i]->mHasData && !mChildren[i]->mEntity )
53 Q_UNUSED( currentTime )
60void QgsChunkNode::populateChildren(
const QVector<QgsChunkNode *> &children )
62 Q_ASSERT( !mChildrenPopulated );
63 mChildrenPopulated =
true;
67int QgsChunkNode::level()
const
70 QgsChunkNode *p = mParent;
79QList<QgsChunkNode *> QgsChunkNode::descendants()
81 QList<QgsChunkNode *> lst;
84 for (
int i = 0; i < childCount(); ++i )
86 lst << mChildren[i]->descendants();
92void QgsChunkNode::setQueuedForLoad( QgsChunkListEntry *entry )
94 Q_ASSERT( mState == Skeleton );
95 Q_ASSERT( !mLoaderQueueEntry );
98 mState = QgsChunkNode::QueuedForLoad;
99 mLoaderQueueEntry = entry;
102void QgsChunkNode::cancelQueuedForLoad()
104 Q_ASSERT( mState == QueuedForLoad );
105 Q_ASSERT( mLoaderQueueEntry );
107 delete mLoaderQueueEntry;
108 mLoaderQueueEntry =
nullptr;
110 mState = QgsChunkNode::Skeleton;
113void QgsChunkNode::setLoading( QgsChunkLoader *chunkLoader )
115 Q_ASSERT( mState == QueuedForLoad );
116 Q_ASSERT( !mLoader );
117 Q_ASSERT( mLoaderQueueEntry );
120 mLoader = chunkLoader;
121 mLoaderQueueEntry =
nullptr;
124void QgsChunkNode::cancelLoading()
126 Q_ASSERT( mState == QgsChunkNode::Loading );
128 Q_ASSERT( !mLoaderQueueEntry );
129 Q_ASSERT( !mEntity );
130 Q_ASSERT( !mReplacementQueueEntry );
134 mState = QgsChunkNode::Skeleton;
137void QgsChunkNode::setLoaded( Qt3DCore::QEntity *newEntity )
139 Q_ASSERT( mState == QgsChunkNode::Loading );
141 Q_ASSERT( !mLoaderQueueEntry );
142 Q_ASSERT( !mReplacementQueueEntry );
145 mEntityCreatedTime = QTime::currentTime();
149 mState = QgsChunkNode::Loaded;
150 mReplacementQueueEntry =
new QgsChunkListEntry(
this );
153void QgsChunkNode::unloadChunk()
155 Q_ASSERT( mState == QgsChunkNode::Loaded );
157 Q_ASSERT( mReplacementQueueEntry );
162 delete mReplacementQueueEntry;
163 mReplacementQueueEntry =
nullptr;
164 mState = QgsChunkNode::Skeleton;
167void QgsChunkNode::setQueuedForUpdate( QgsChunkListEntry *entry, QgsChunkQueueJobFactory *updateJobFactory )
169 Q_ASSERT( mState == QgsChunkNode::Loaded );
171 Q_ASSERT( mReplacementQueueEntry );
172 Q_ASSERT( !mLoaderQueueEntry );
173 Q_ASSERT( !mUpdater );
174 Q_ASSERT( !mUpdaterFactory );
176 mState = QueuedForUpdate;
177 mLoaderQueueEntry = entry;
178 mUpdaterFactory = updateJobFactory;
181void QgsChunkNode::cancelQueuedForUpdate()
183 Q_ASSERT( mState == QueuedForUpdate );
185 Q_ASSERT( mLoaderQueueEntry );
186 Q_ASSERT( mUpdaterFactory );
187 Q_ASSERT( !mUpdater );
190 mUpdaterFactory =
nullptr;
192 delete mLoaderQueueEntry;
193 mLoaderQueueEntry =
nullptr;
196void QgsChunkNode::setUpdating()
198 Q_ASSERT( mState == QgsChunkNode::QueuedForUpdate );
200 Q_ASSERT( mReplacementQueueEntry );
201 Q_ASSERT( mLoaderQueueEntry );
202 Q_ASSERT( !mUpdater );
203 Q_ASSERT( mUpdaterFactory );
206 mUpdater = mUpdaterFactory->createJob(
this );
207 mUpdaterFactory =
nullptr;
208 mLoaderQueueEntry =
nullptr;
211void QgsChunkNode::cancelUpdating()
213 Q_ASSERT( mState == QgsChunkNode::Updating );
214 Q_ASSERT( mUpdater );
215 Q_ASSERT( !mLoaderQueueEntry );
222void QgsChunkNode::setUpdated()
224 Q_ASSERT( mState == QgsChunkNode::Updating );
225 Q_ASSERT( mUpdater );
226 Q_ASSERT( !mLoaderQueueEntry );
227 Q_ASSERT( mReplacementQueueEntry );
231 mState = QgsChunkNode::Loaded;
234void QgsChunkNode::replaceEntity( Qt3DCore::QEntity *newEntity )
236 Q_ASSERT( mState == QgsChunkNode::Updating );
237 Q_ASSERT( mUpdater );
239 Q_ASSERT( newEntity );
241 mEntity->deleteLater();
245void QgsChunkNode::setExactBox3D(
const QgsBox3D &box3D )
252void QgsChunkNode::updateParentBoundingBoxesRecursively()
const
254 QgsChunkNode *currentNode = parent();
255 while ( currentNode )
257 QgsChunkNode *
const *currentNodeChildren = currentNode->children();
258 double xMin = std::numeric_limits<double>::max();
259 double xMax = -std::numeric_limits<double>::max();
260 double yMin = std::numeric_limits<double>::max();
261 double yMax = -std::numeric_limits<double>::max();
262 double zMin = std::numeric_limits<double>::max();
263 double zMax = -std::numeric_limits<double>::max();
265 for (
int i = 0; i < currentNode->childCount(); ++i )
267 const QgsBox3D childBox3D = currentNodeChildren[i]->box3D();
289 const QgsBox3D currentNodeBox3D = xMin > xMax || yMin > yMax || zMin > zMax ?
QgsBox3D() :
QgsBox3D( xMin, yMin, zMin, xMax, yMax, zMax );
291 currentNode->setExactBox3D( currentNodeBox3D );
292 currentNode = currentNode->parent();
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.
double xMaximum() const
Returns the maximum x value.
double zMinimum() const
Returns the minimum z value.
double yMinimum() const
Returns the minimum y value.
bool isEmpty() const
Returns true if the box is empty.