22#include <Qt3DCore/QEntity>
26QgsChunkNode::QgsChunkNode(
const QgsChunkNodeId &nodeId,
const QgsBox3D &box3D,
float error, QgsChunkNode *parent )
32 , mLoaderQueueEntry( nullptr )
33 , mReplacementQueueEntry( nullptr )
36 , mUpdaterFactory( nullptr )
41QgsChunkNode::~QgsChunkNode()
43 Q_ASSERT( mState == Skeleton );
44 Q_ASSERT( !mLoaderQueueEntry );
45 Q_ASSERT( !mReplacementQueueEntry );
48 Q_ASSERT( !mUpdater );
49 Q_ASSERT( !mUpdaterFactory );
51 qDeleteAll( mChildren );
54bool QgsChunkNode::allChildChunksResident( QTime currentTime )
const
56 Q_ASSERT( mChildrenPopulated );
57 for (
int i = 0; i < childCount(); ++i )
59 if ( mChildren[i]->mHasData && !mChildren[i]->mEntity )
61 Q_UNUSED( currentTime )
68void QgsChunkNode::populateChildren(
const QVector<QgsChunkNode *> &children )
70 Q_ASSERT( !mChildrenPopulated );
71 mChildrenPopulated =
true;
75int QgsChunkNode::level()
const
78 QgsChunkNode *p = mParent;
87QList<QgsChunkNode *> QgsChunkNode::descendants()
89 QList<QgsChunkNode *> lst;
92 for (
int i = 0; i < childCount(); ++i )
94 lst << mChildren[i]->descendants();
100void QgsChunkNode::setQueuedForLoad( QgsChunkListEntry *entry )
102 Q_ASSERT( mState == Skeleton );
103 Q_ASSERT( !mLoaderQueueEntry );
104 Q_ASSERT( !mLoader );
106 mState = QgsChunkNode::QueuedForLoad;
107 mLoaderQueueEntry = entry;
110void QgsChunkNode::cancelQueuedForLoad()
112 Q_ASSERT( mState == QueuedForLoad );
113 Q_ASSERT( mLoaderQueueEntry );
115 delete mLoaderQueueEntry;
116 mLoaderQueueEntry =
nullptr;
118 mState = QgsChunkNode::Skeleton;
121void QgsChunkNode::setLoading( QgsChunkLoader *chunkLoader )
123 Q_ASSERT( mState == QueuedForLoad );
124 Q_ASSERT( !mLoader );
125 Q_ASSERT( mLoaderQueueEntry );
128 mLoader = chunkLoader;
129 mLoaderQueueEntry =
nullptr;
132void QgsChunkNode::cancelLoading()
134 Q_ASSERT( mState == QgsChunkNode::Loading );
136 Q_ASSERT( !mLoaderQueueEntry );
137 Q_ASSERT( !mEntity );
138 Q_ASSERT( !mReplacementQueueEntry );
142 mState = QgsChunkNode::Skeleton;
145void QgsChunkNode::setLoaded( Qt3DCore::QEntity *newEntity )
147 Q_ASSERT( mState == QgsChunkNode::Loading );
149 Q_ASSERT( !mLoaderQueueEntry );
150 Q_ASSERT( !mReplacementQueueEntry );
153 mEntityCreatedTime = QTime::currentTime();
157 mState = QgsChunkNode::Loaded;
158 mReplacementQueueEntry =
new QgsChunkListEntry(
this );
161void QgsChunkNode::unloadChunk()
163 Q_ASSERT( mState == QgsChunkNode::Loaded );
165 Q_ASSERT( mReplacementQueueEntry );
170 delete mReplacementQueueEntry;
171 mReplacementQueueEntry =
nullptr;
172 mState = QgsChunkNode::Skeleton;
175void QgsChunkNode::setQueuedForUpdate( QgsChunkListEntry *entry, QgsChunkQueueJobFactory *updateJobFactory )
177 Q_ASSERT( mState == QgsChunkNode::Loaded );
179 Q_ASSERT( mReplacementQueueEntry );
180 Q_ASSERT( !mLoaderQueueEntry );
181 Q_ASSERT( !mUpdater );
182 Q_ASSERT( !mUpdaterFactory );
184 mState = QueuedForUpdate;
185 mLoaderQueueEntry = entry;
186 mUpdaterFactory = updateJobFactory;
189void QgsChunkNode::cancelQueuedForUpdate()
191 Q_ASSERT( mState == QueuedForUpdate );
193 Q_ASSERT( mLoaderQueueEntry );
194 Q_ASSERT( mUpdaterFactory );
195 Q_ASSERT( !mUpdater );
198 mUpdaterFactory =
nullptr;
200 delete mLoaderQueueEntry;
201 mLoaderQueueEntry =
nullptr;
204void QgsChunkNode::setUpdating()
206 Q_ASSERT( mState == QgsChunkNode::QueuedForUpdate );
208 Q_ASSERT( mReplacementQueueEntry );
209 Q_ASSERT( mLoaderQueueEntry );
210 Q_ASSERT( !mUpdater );
211 Q_ASSERT( mUpdaterFactory );
214 mUpdater = mUpdaterFactory->createJob(
this );
215 mUpdaterFactory =
nullptr;
216 mLoaderQueueEntry =
nullptr;
219void QgsChunkNode::cancelUpdating()
221 Q_ASSERT( mState == QgsChunkNode::Updating );
222 Q_ASSERT( mUpdater );
223 Q_ASSERT( !mLoaderQueueEntry );
230void QgsChunkNode::setUpdated()
232 Q_ASSERT( mState == QgsChunkNode::Updating );
233 Q_ASSERT( mUpdater );
234 Q_ASSERT( !mLoaderQueueEntry );
235 Q_ASSERT( mReplacementQueueEntry );
239 mState = QgsChunkNode::Loaded;
242void QgsChunkNode::replaceEntity( Qt3DCore::QEntity *newEntity )
244 Q_ASSERT( mState == QgsChunkNode::Updating );
245 Q_ASSERT( mUpdater );
247 Q_ASSERT( newEntity );
249 mEntity->deleteLater();
253void QgsChunkNode::setExactBox3D(
const QgsBox3D &box3D )
260void QgsChunkNode::updateParentBoundingBoxesRecursively()
const
262 QgsChunkNode *currentNode = parent();
263 while ( currentNode )
265 QgsChunkNode *
const *currentNodeChildren = currentNode->children();
266 double xMin = std::numeric_limits<double>::max();
267 double xMax = -std::numeric_limits<double>::max();
268 double yMin = std::numeric_limits<double>::max();
269 double yMax = -std::numeric_limits<double>::max();
270 double zMin = std::numeric_limits<double>::max();
271 double zMax = -std::numeric_limits<double>::max();
273 for (
int i = 0; i < currentNode->childCount(); ++i )
275 const QgsBox3D childBox3D = currentNodeChildren[i]->box3D();
297 const QgsBox3D currentNodeBox3D = xMin > xMax || yMin > yMax || zMin > zMax ?
QgsBox3D() :
QgsBox3D( xMin, yMin, zMin, xMax, yMax, zMax );
299 currentNode->setExactBox3D( currentNodeBox3D );
300 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.