encompass-cs/encompass-cs/EntitySetQuery.cs

51 lines
2.0 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-24 03:04:26 +00:00
private BitSet WithImmediateMask { get; }
2019-12-23 06:34:58 +00:00
private BitSet WithExistingMask { get; }
2019-12-24 03:04:26 +00:00
private BitSet WithoutImmediateMask { get; }
2019-12-23 06:34:58 +00:00
private BitSet WithoutExistingMask { get; }
private BitSet NotWithMask { get; }
2019-12-22 01:58:07 +00:00
2019-12-24 03:04:26 +00:00
internal EntitySetQuery(BitSet withImmediateMask, BitSet withExistingMask, BitSet withoutImmediateMask, BitSet withoutExistingMask, BitSet notWithMask)
2019-12-22 01:58:07 +00:00
{
2019-12-24 03:04:26 +00:00
WithImmediateMask = withImmediateMask;
WithExistingMask = withExistingMask;
2019-12-24 03:04:26 +00:00
WithoutImmediateMask = withoutImmediateMask;
WithoutExistingMask = withoutExistingMask;
NotWithMask = notWithMask;
2019-12-22 01:58:07 +00:00
}
2019-12-28 21:53:02 +00:00
public bool CheckEntity(Entity entity, ComponentBitSet componentBitSet)
2019-12-22 01:58:07 +00:00
{
2019-12-28 21:53:02 +00:00
var existingBits = componentBitSet.EntityBitArray(entity.ID);
var existing = WithExistingMask.And(existingBits).Or(NotWithMask);
2019-12-22 01:58:07 +00:00
2019-12-28 21:53:02 +00:00
var existingForbidden = WithoutExistingMask.And(existingBits).Not();
2019-12-22 01:58:07 +00:00
2019-12-28 21:53:02 +00:00
return existing.And(existingForbidden).AllTrue();
}
2019-12-28 22:30:26 +00:00
public bool ImmediateCheckEntity(Entity entity, ComponentBitSet immediateBitLookup, ComponentBitSet existingBitLookup)
2019-12-28 21:53:02 +00:00
{
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);
2019-12-28 21:53:02 +00:00
return withCheck.And(withoutCheck).AllTrue();
2019-12-22 01:58:07 +00:00
}
}
}