44 lines
1.8 KiB
C#
44 lines
1.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Encompass.Collections;
|
|
|
|
namespace Encompass
|
|
{
|
|
internal struct EntitySetQuery
|
|
{
|
|
private BitSet WithImmediateMask { get; }
|
|
private BitSet WithExistingMask { get; }
|
|
private BitSet WithoutImmediateMask { get; }
|
|
private BitSet WithoutExistingMask { get; }
|
|
private BitSet NotWithMask { get; }
|
|
|
|
internal EntitySetQuery(BitSet withImmediateMask, BitSet withExistingMask, BitSet withoutImmediateMask, BitSet withoutExistingMask, BitSet notWithMask)
|
|
{
|
|
WithImmediateMask = withImmediateMask;
|
|
WithExistingMask = withExistingMask;
|
|
WithoutImmediateMask = withoutImmediateMask;
|
|
WithoutExistingMask = withoutExistingMask;
|
|
NotWithMask = notWithMask;
|
|
}
|
|
|
|
public IEnumerable<Entity> FilterEntities(IEnumerable<Entity> entities, ComponentBitSet immediateBitLookup, ComponentBitSet existingBitLookup)
|
|
{
|
|
foreach (var entity in entities)
|
|
{
|
|
var immediateBits = immediateBitLookup.EntityBitArray(entity.ID);
|
|
var existingBits = existingBitLookup.EntityBitArray(entity.ID);
|
|
|
|
var immediate = WithImmediateMask.And(immediateBits);
|
|
var existing = WithExistingMask.And(existingBits);
|
|
var withCheck = immediate.Or(existing).Or(NotWithMask);
|
|
|
|
var immediateForbidden = WithoutImmediateMask.And(immediateBits).Not();
|
|
var existingForbidden = WithoutExistingMask.And(existingBits).Not();
|
|
var withoutCheck = immediateForbidden.And(existingForbidden);
|
|
|
|
if (withCheck.And(withoutCheck).AllTrue()) { yield return entity; }
|
|
}
|
|
}
|
|
}
|
|
}
|