Files
RobustToolbox/Robust.Shared/GameObjects/ChunkIterator.cs
2023-11-25 14:56:56 +11:00

61 lines
1.3 KiB
C#

using Arch.Core;
namespace Robust.Shared.GameObjects;
internal struct ArchChunkIterator
{
private readonly ArchetypeEnumerator _archetypes;
internal ArchChunkIterator(in ArchetypeEnumerator archetypes)
{
_archetypes = archetypes;
}
public ArchChunkEnumerator GetEnumerator()
{
return new ArchChunkEnumerator(_archetypes);
}
}
internal struct ArchChunkEnumerator
{
private ArchetypeEnumerator _archetypes;
private int _chunkIndex;
public Chunk Current => _archetypes.Current.GetChunk(_chunkIndex);
internal ArchChunkEnumerator(in ArchetypeEnumerator archetypes)
{
_archetypes = archetypes;
if (_archetypes.MoveNext())
{
_chunkIndex = _archetypes.Current.ChunkCount;
}
}
public bool MoveNext()
{
if (--_chunkIndex >= 0 && Current.Size > 0)
{
return true;
}
if (!_archetypes.MoveNext())
{
return false;
}
_chunkIndex = _archetypes.Current.ChunkCount - 1;
return true;
}
}
internal static partial class QueryExtensions
{
internal static ArchChunkIterator ChunkIterator(this in Query query, World world)
{
var archetypeEnumerator = new ArchetypeEnumerator(query.Matches);
return new ArchChunkIterator(in archetypeEnumerator);
}
}