encompass-cs/encompass-cs/EntitySetQuery.cs

44 lines
1.7 KiB
C#
Raw Normal View History

using System.Collections;
2019-12-22 01:58:07 +00:00
using System.Collections.Generic;
using Encompass.Collections;
2019-12-22 01:58:07 +00:00
namespace Encompass
{
internal struct EntitySetQuery
2019-12-22 01:58:07 +00:00
{
2019-12-23 06:34:58 +00:00
private BitSet WithPendingMask { get; }
private BitSet WithExistingMask { get; }
private BitSet WithoutPendingMask { get; }
private BitSet WithoutExistingMask { get; }
private BitSet NotWithMask { get; }
2019-12-22 01:58:07 +00:00
2019-12-23 06:34:58 +00:00
internal EntitySetQuery(BitSet withPendingMask, BitSet withExistingMask, BitSet withoutPendingMask, BitSet withoutExistingMask, BitSet notWithMask)
2019-12-22 01:58:07 +00:00
{
WithPendingMask = withPendingMask;
WithExistingMask = withExistingMask;
WithoutPendingMask = withoutPendingMask;
WithoutExistingMask = withoutExistingMask;
NotWithMask = notWithMask;
2019-12-22 01:58:07 +00:00
}
public IEnumerable<Entity> FilterEntities(IEnumerable<Entity> entities, ComponentBitSet pendingBitLookup, ComponentBitSet existingBitLookup)
2019-12-22 01:58:07 +00:00
{
foreach (var entity in entities)
{
var pendingBits = pendingBitLookup.EntityBitArray(entity.ID);
var existingBits = existingBitLookup.EntityBitArray(entity.ID);
2019-12-22 01:58:07 +00:00
var pending = WithPendingMask.And(pendingBits);
var existing = WithExistingMask.And(existingBits);
var withCheck = pending.Or(existing).Or(NotWithMask);
2019-12-22 01:58:07 +00:00
var pendingForbidden = WithoutPendingMask.And(pendingBits).Not();
var existingForbidden = WithoutExistingMask.And(existingBits).Not();
var withoutCheck = pendingForbidden.And(existingForbidden);
if (withCheck.And(withoutCheck).AllTrue()) { yield return entity; }
}
2019-12-22 01:58:07 +00:00
}
}
}