using System; using System.Runtime.CompilerServices; namespace DCFApixels.DragonECS { #region Incs/Excs base public interface ICondition { public int[] GetComponentsIDs(); } #endregion #region Incs public interface IInc : ICondition { } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Inc : IInc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } #endregion #region Excs public interface IExc : ICondition { } public struct Exc : IExc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID }; } } public struct Exc : IExc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID }; } } public struct Exc : IExc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Exc : IExc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Exc : IExc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Exc : IExc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Exc : IExc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } public struct Exc : IExc { public int[] GetComponentsIDs() { return new int[] { ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID, ComponentType.globalID }; } } #endregion #region Masks public abstract class Mask { protected internal static int _typeIDIncrement = 0; internal abstract int[] Include { get; } internal abstract int[] Exclude { get; } public abstract int ID { get; } public int IncCount { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => Include.Length; } public int ExcCount { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => Exclude.Length; } } public sealed class Mask : Mask where TInc : struct, IInc { internal static readonly int[] include = new TInc().GetComponentsIDs(); internal static readonly int[] exclude = Array.Empty(); public static readonly int id = _typeIDIncrement++; private static Mask _instance = new Mask(); private Mask() { } public static Mask Instance { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _instance; } public override int ID { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => id; } internal override int[] Include { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => include; } internal override int[] Exclude { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => exclude; } } public sealed class Mask : Mask where TInc : struct, IInc where TExc : struct, IExc { internal static readonly int[] include = new TInc().GetComponentsIDs(); internal static readonly int[] exclude = new TExc().GetComponentsIDs(); public static readonly int id = _typeIDIncrement++; private static Mask _instance = new Mask(); private Mask() { } public static Mask Instance { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _instance; } public override int ID { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => id; } internal override int[] Include { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => include; } internal override int[] Exclude { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => exclude; } } #endregion #region Filter public interface IEcsFilter { public EcsWorld World { get; } public Mask Mask { get; } public IEcsReadonlyGroup Entities { get; } public int EntitiesCount { get; } } public class EcsFilter : IEcsFilter { private readonly EcsWorld _source; private readonly EcsGroup _entities; private readonly Mask _mask; #region Properties public EcsWorld World { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _source; } public Mask Mask { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _mask; } public IEcsReadonlyGroup Entities { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _entities; } public int EntitiesCount { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _entities.Count; } #endregion #region Constrcutors internal EcsFilter(EcsWorld source, Mask mask, int capasity) { _source = source; _mask = mask; _entities = new EcsGroup(source, capasity); } #endregion #region EntityChangedReact [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void Add(int entityID) { _entities.Add(entityID); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void Remove(int entityID) { _entities.Remove(entityID); } #endregion } #endregion }