using System; using System.Runtime.CompilerServices; using System.Reflection; namespace DCFApixels.DragonECS { #region Incs/Excs base public interface IMaskCondition { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld; } #endregion #region Incs public interface IInc : IMaskCondition { } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld => Array.Empty(); } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Inc : IInc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } #endregion #region Excs public interface IExc : IMaskCondition { } public struct Exc : IExc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld => Array.Empty(); } public struct Exc : IExc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Exc : IExc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Exc : IExc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Exc : IExc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Exc : IExc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } public struct Exc : IExc { public int[] GetComponentsIDs() where TWorldArchetype : EcsWorld { return new int[] { ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), ComponentIndexer.GetComponentId(ComponentIndexer.GetWorldId()), }; } } #endregion #region EcsMask public class EcsComponentMask { internal Type WorldArchetypeType; internal int[] Inc; internal int[] Exc; public override string ToString() { return $"Inc({string.Join(", ", Inc)}) Exc({string.Join(", ", Exc)})"; } } public sealed class EcsMask : EcsComponentMask { // internal readonly Type WorldArchetypeType; internal readonly int UniqueID; //internal readonly int[] Inc; //internal readonly int[] Exc; //internal int IncCount //{ // [MethodImpl(MethodImplOptions.AggressiveInlining)] // get => Inc.Length; //} //internal int ExcCount //{ // [MethodImpl(MethodImplOptions.AggressiveInlining)] // get => Exc.Length; //} internal EcsMask(Type worldArchetypeType, int uniqueID, int[] inc, int[] exc) { WorldArchetypeType = worldArchetypeType; UniqueID = uniqueID; Inc = inc; Exc = exc; } } public static class EcsMaskMap where TWorldArchetype : EcsWorld { private static int _count; private static int _capacity; public static int Count { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _count; } public static int Capacity { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _capacity; } public static EcsMask GetMask() where TInc : struct, IInc where TExc : struct, IExc { return Activator.instance; } private class Activator where TInc : struct, IInc where TExc : struct, IExc { static Activator() { // var inc_ = new TInc().GetComponentsIDs(); // var exc_ = new TExc().GetComponentsIDs(); // Array.Sort(inc_); // Array.Sort(exc_); // // Type thisType = typeof(Activator); // // Type sortedIncType = typeof(TInc); // if (sortedIncType.IsGenericType) // { // Type[] sortedInc = new Type[inc_.Length]; // for (int i = 0; i < sortedInc.Length; i++) // sortedInc[i] = EcsWorld.ComponentType.types[inc_[i]]; // sortedIncType = sortedIncType.GetGenericTypeDefinition().MakeGenericType(sortedInc); // } // Type sortedExcType = typeof(TExc); // if (sortedExcType.IsGenericType) // { // Type[] sortedExc = new Type[exc_.Length]; // for (int i = 0; i < sortedExc.Length; i++) // sortedExc[i] = EcsWorld.ComponentType.types[exc_[i]]; // sortedExcType = sortedExcType.GetGenericTypeDefinition().MakeGenericType(sortedExc); // } // // Type targetType = typeof(Activator<,>).MakeGenericType(typeof(TWorldArchetype), sortedIncType, sortedExcType); // // if (targetType != thisType) // { // instance = (EcsMask)targetType.GetField(nameof(instance), BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetValue(null); // return; // } // // var id = _count++; // if (_count >= _capacity) // _capacity <<= 1; // // instance = new EcsMask(typeof(TWorldArchetype), id, inc_, exc_); } public readonly static EcsMask instance; } } #endregion }