22#include <Qt3DCore/QEntity>
26QgsChunkNode::QgsChunkNode(
const QgsChunkNodeId &nodeId,
const QgsBox3D &box3D,
float error, QgsChunkNode *parent )
34QgsChunkNode::~QgsChunkNode()
36 Q_ASSERT( mState == Skeleton );
37 Q_ASSERT( !mLoaderQueueEntry );
38 Q_ASSERT( !mReplacementQueueEntry );
41 Q_ASSERT( !mUpdater );
42 Q_ASSERT( !mUpdaterFactory );
44 qDeleteAll( mChildren );
47bool QgsChunkNode::allChildChunksResident( QTime currentTime )
const
49 Q_ASSERT( mChildrenPopulated );
50 for (
int i = 0; i < childCount(); ++i )
52 if ( mChildren[i]->mHasData && !mChildren[i]->mEntity )
54 Q_UNUSED( currentTime )
61void QgsChunkNode::populateChildren(
const QVector<QgsChunkNode *> &children )
63 Q_ASSERT( !mChildrenPopulated );
64 mChildrenPopulated =
true;
68int QgsChunkNode::level()
const
71 QgsChunkNode *p = mParent;
80QList<QgsChunkNode *> QgsChunkNode::descendants()
82 QList<QgsChunkNode *> lst;
85 for (
int i = 0; i < childCount(); ++i )
87 lst << mChildren[i]->descendants();
93void QgsChunkNode::setQueuedForLoad( QgsChunkListEntry *entry )
95 Q_ASSERT( mState == Skeleton );
96 Q_ASSERT( !mLoaderQueueEntry );
99 mState = QgsChunkNode::QueuedForLoad;
100 mLoaderQueueEntry = entry;
103void QgsChunkNode::cancelQueuedForLoad()
105 Q_ASSERT( mState == QueuedForLoad );
106 Q_ASSERT( mLoaderQueueEntry );
108 delete mLoaderQueueEntry;
109 mLoaderQueueEntry =
nullptr;
111 mState = QgsChunkNode::Skeleton;
114void QgsChunkNode::setLoading( QgsChunkLoader *chunkLoader )
116 Q_ASSERT( mState == QueuedForLoad );
117 Q_ASSERT( !mLoader );
118 Q_ASSERT( mLoaderQueueEntry );
121 mLoader = chunkLoader;
122 mLoaderQueueEntry =
nullptr;
125void QgsChunkNode::cancelLoading()
127 Q_ASSERT( mState == QgsChunkNode::Loading );
129 Q_ASSERT( !mLoaderQueueEntry );
130 Q_ASSERT( !mEntity );
131 Q_ASSERT( !mReplacementQueueEntry );
135 mState = QgsChunkNode::Skeleton;
138void QgsChunkNode::setLoaded( Qt3DCore::QEntity *newEntity )
140 Q_ASSERT( mState == QgsChunkNode::Loading );
142 Q_ASSERT( !mLoaderQueueEntry );
143 Q_ASSERT( !mReplacementQueueEntry );
146 mEntityCreatedTime = QTime::currentTime();
150 mState = QgsChunkNode::Loaded;
151 mReplacementQueueEntry =
new QgsChunkListEntry(
this );
154void QgsChunkNode::unloadChunk()
156 Q_ASSERT( mState == QgsChunkNode::Loaded );
158 Q_ASSERT( mReplacementQueueEntry );
163 delete mReplacementQueueEntry;
164 mReplacementQueueEntry =
nullptr;
165 mState = QgsChunkNode::Skeleton;
168void QgsChunkNode::setQueuedForUpdate( QgsChunkListEntry *entry, QgsChunkQueueJobFactory *updateJobFactory )
170 Q_ASSERT( mState == QgsChunkNode::Loaded );
172 Q_ASSERT( mReplacementQueueEntry );
173 Q_ASSERT( !mLoaderQueueEntry );
174 Q_ASSERT( !mUpdater );
175 Q_ASSERT( !mUpdaterFactory );
177 mState = QueuedForUpdate;
178 mLoaderQueueEntry = entry;
179 mUpdaterFactory = updateJobFactory;
182void QgsChunkNode::cancelQueuedForUpdate()
184 Q_ASSERT( mState == QueuedForUpdate );
186 Q_ASSERT( mLoaderQueueEntry );
187 Q_ASSERT( mUpdaterFactory );
188 Q_ASSERT( !mUpdater );
191 mUpdaterFactory =
nullptr;
193 delete mLoaderQueueEntry;
194 mLoaderQueueEntry =
nullptr;
197void QgsChunkNode::setUpdating()
199 Q_ASSERT( mState == QgsChunkNode::QueuedForUpdate );
201 Q_ASSERT( mReplacementQueueEntry );
202 Q_ASSERT( mLoaderQueueEntry );
203 Q_ASSERT( !mUpdater );
204 Q_ASSERT( mUpdaterFactory );
207 mUpdater = mUpdaterFactory->createJob(
this );
208 mUpdaterFactory =
nullptr;
209 mLoaderQueueEntry =
nullptr;
212void QgsChunkNode::cancelUpdating()
214 Q_ASSERT( mState == QgsChunkNode::Updating );
215 Q_ASSERT( mUpdater );
216 Q_ASSERT( !mLoaderQueueEntry );
223void QgsChunkNode::setUpdated()
225 Q_ASSERT( mState == QgsChunkNode::Updating );
226 Q_ASSERT( mUpdater );
227 Q_ASSERT( !mLoaderQueueEntry );
228 Q_ASSERT( mReplacementQueueEntry );
232 mState = QgsChunkNode::Loaded;
235void QgsChunkNode::replaceEntity( Qt3DCore::QEntity *newEntity )
237 Q_ASSERT( mState == QgsChunkNode::Updating );
238 Q_ASSERT( mUpdater );
240 Q_ASSERT( newEntity );
242 mEntity->deleteLater();
246void QgsChunkNode::setExactBox3D(
const QgsBox3D &box3D )
253void QgsChunkNode::updateParentBoundingBoxesRecursively()
const
255 QgsChunkNode *currentNode = parent();
256 while ( currentNode )
258 QgsChunkNode *
const *currentNodeChildren = currentNode->children();
259 double xMin = std::numeric_limits<double>::max();
260 double xMax = -std::numeric_limits<double>::max();
261 double yMin = std::numeric_limits<double>::max();
262 double yMax = -std::numeric_limits<double>::max();
263 double zMin = std::numeric_limits<double>::max();
264 double zMax = -std::numeric_limits<double>::max();
266 for (
int i = 0; i < currentNode->childCount(); ++i )
268 const QgsBox3D childBox3D = currentNodeChildren[i]->box3D();
290 const QgsBox3D currentNodeBox3D = xMin > xMax || yMin > yMax || zMin > zMax ?
QgsBox3D() :
QgsBox3D( xMin, yMin, zMin, xMax, yMax, zMax );
292 currentNode->setExactBox3D( currentNodeBox3D );
293 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.