29 #ifndef NVBLASTCHUNKHIERARCHY_H 30 #define NVBLASTCHUNKHIERARCHY_H 54 IteratorBase<uint32_t>(startChunkIndex), m_chunks(chunks), m_stop(startChunkIndex), m_limit(chunkIndexLimit)
58 m_curr = invalidIndex<uint32_t>();
77 m_curr = invalidIndex<uint32_t>();
82 if (++m_curr < parentChunk->childIndexStop)
107 uint32_t* chunkIndices,
108 uint32_t chunkIndicesSize,
111 bool includeRoot =
true,
112 uint32_t chunkIndexLimit = invalidIndex<uint32_t>()
115 if (chunkIndicesSize == 0)
119 uint32_t chunkIndexCount = 0;
120 bool rootHandled =
false;
123 chunkIndices[chunkIndexCount++] = chunkIndex;
126 for (uint32_t curr = 0; !rootHandled || curr < chunkIndexCount;)
128 const NvBlastChunk& chunk = chunks[rootHandled ? chunkIndices[curr] : chunkIndex];
132 const uint32_t childIndexBufferStop = chunk.
firstChildIndex + (chunkIndicesSize - chunkIndexCount);
133 const uint32_t stop = childIndexStop < childIndexBufferStop ? childIndexStop : childIndexBufferStop;
134 for (uint32_t childIndex = chunk.
firstChildIndex; childIndex < stop; ++childIndex)
136 chunkIndices[chunkIndexCount++] = childIndex;
145 return chunkIndexCount;
152 template<
class VisibilityRep>
155 VisibilityRep* actors,
157 uint32_t* chunkActorIndices,
159 uint32_t supportChunkIndex,
161 uint32_t upperSupportChunkCount
164 uint32_t chunkIndex = supportChunkIndex;
165 uint32_t chunkActorIndex = chunkActorIndices[supportChunkIndex];
166 uint32_t newChunkActorIndex = actorIndex;
167 VisibilityRep& thisActor = actors[actorIndex];
171 if (chunkActorIndex == newChunkActorIndex)
177 const uint32_t parentChunkActorIndex = parentChunkIndex != invalidIndex<uint32_t>() ? chunkActorIndices[parentChunkIndex] : invalidIndex<uint32_t>();
178 const bool chunkVisible = chunkActorIndex != parentChunkActorIndex;
183 VisibilityRep& chunkActor = actors[chunkActorIndex];
184 IndexDList<uint32_t>().removeFromList(chunkActor.m_firstVisibleChunkIndex, visibleChunkIndexLinks, chunkIndex);
185 --chunkActor.m_visibleChunkCount;
189 const uint32_t oldChunkActorIndex = chunkActorIndices[chunkIndex];
190 chunkActorIndices[chunkIndex] = newChunkActorIndex;
191 if (newChunkActorIndex != invalidIndex<uint32_t>() && parentChunkActorIndex != newChunkActorIndex)
194 IndexDList<uint32_t>().insertListHead(thisActor.m_firstVisibleChunkIndex, visibleChunkIndexLinks, chunkIndex);
195 ++thisActor.m_visibleChunkCount;
197 if (actorIndex != oldChunkActorIndex)
204 if (chunkActorIndices[childChunkIndex] == actorIndex)
206 IndexDList<uint32_t>().removeFromList(thisActor.m_firstVisibleChunkIndex, visibleChunkIndexLinks, childChunkIndex);
207 --thisActor.m_visibleChunkCount;
214 if (parentChunkIndex != invalidIndex<uint32_t>())
217 const NvBlastChunk& parentChunk = chunks[parentChunkIndex];
221 uniform = (newChunkActorIndex == chunkActorIndices[childChunkIndex]);
225 newChunkActorIndex = invalidIndex<uint32_t>();
228 const uint32_t childChunkActorIndex = chunkActorIndices[childChunkIndex];
229 if (childChunkActorIndex != invalidIndex<uint32_t>() && childChunkActorIndex == parentChunkActorIndex)
232 VisibilityRep& childChunkActor = actors[childChunkActorIndex];
233 IndexDList<uint32_t>().insertListHead(childChunkActor.m_firstVisibleChunkIndex, visibleChunkIndexLinks, childChunkIndex);
234 ++childChunkActor.m_visibleChunkCount;
241 chunkIndex = parentChunkIndex;
242 chunkActorIndex = parentChunkActorIndex;
243 }
while (chunkIndex != invalidIndex<uint32_t>());
250 #endif // ifndef NVBLASTCHUNKHIERARCHY_H
ChunkDepthFirstIt(const NvBlastChunk *chunks, uint32_t startChunkIndex, uint32_t chunkIndexLimit)
Definition: NvBlastChunkHierarchy.h:53
Definition: NvBlastChunkHierarchy.h:49
uint32_t m_curr
Definition: NvBlastIteratorBase.h:58
NV_INLINE bool isInvalidIndex(T index)
Definition: NvBlastIndexFns.h:57
NV_INLINE uint32_t enumerateChunkHierarchyBreadthFirst(uint32_t *chunkIndices, uint32_t chunkIndicesSize, const NvBlastChunk *chunks, uint32_t chunkIndex, bool includeRoot=true, uint32_t chunkIndexLimit=invalidIndex< uint32_t >())
Definition: NvBlastChunkHierarchy.h:106
#define NVBLAST_ASSERT(exp)
Definition: NvBlastAssert.h:37
uint32_t childIndexStop
Definition: NvBlastTypes.h:177
#define NV_INLINE
Definition: NvPreprocessor.h:350
Definition: NvBlastDLink.h:50
Definition: NvBlastTypes.h:152
uint32_t parentChunkIndex
Definition: NvBlastTypes.h:167
void updateVisibleChunksFromSupportChunk(VisibilityRep *actors, IndexDLink< uint32_t > *visibleChunkIndexLinks, uint32_t *chunkActorIndices, uint32_t actorIndex, uint32_t supportChunkIndex, const NvBlastChunk *chunks, uint32_t upperSupportChunkCount)
Definition: NvBlastChunkHierarchy.h:154
Definition: NvBlastIteratorBase.h:45
Definition: NvBlastArray.h:37
uint32_t operator++()
Definition: NvBlastChunkHierarchy.h:63
uint32_t firstChildIndex
Definition: NvBlastTypes.h:172