void Move(Chunk *srcChunk, ref ArchetypeChunkFilter archetypeChunkFilter) { if (archetypeChunkFilter.Archetype->SystemStateCleanupComplete) { ChunkDataUtility.Deallocate(srcChunk); return; } var srcArchetype = srcChunk->Archetype; if (ChunkDataUtility.AreLayoutCompatible(srcArchetype, archetypeChunkFilter.Archetype)) { fixed(int *sharedComponentValues = archetypeChunkFilter.SharedComponentValues) { ChunkDataUtility.ChangeArchetypeInPlace(srcChunk, archetypeChunkFilter.Archetype, sharedComponentValues); } return; } var entityBatch = new EntityBatchInChunk { Chunk = srcChunk, Count = srcChunk->Count, StartIndex = 0 }; Move(entityBatch, ref archetypeChunkFilter); }
void Move(EntityBatchInChunk entityBatchInChunk, ref ArchetypeChunkFilter archetypeChunkFilter) { var systemStateCleanupComplete = archetypeChunkFilter.Archetype->SystemStateCleanupComplete; var srcChunk = entityBatchInChunk.Chunk; var srcRemainingCount = entityBatchInChunk.Count; var startIndex = entityBatchInChunk.StartIndex; if ((srcRemainingCount == srcChunk->Count) && systemStateCleanupComplete) { ChunkDataUtility.Deallocate(srcChunk); return; } while (srcRemainingCount > 0) { var dstChunk = GetChunkWithEmptySlots(ref archetypeChunkFilter); var dstCount = Move(new EntityBatchInChunk { Chunk = srcChunk, Count = srcRemainingCount, StartIndex = startIndex }, dstChunk); srcRemainingCount -= dstCount; } }