refactoring

This commit is contained in:
Mikhail 2023-03-30 01:57:10 +08:00
parent a215d7702a
commit 0513c55d2c
11 changed files with 462 additions and 426 deletions

View File

@ -4,5 +4,7 @@
{
public const string EXCEPTION_MESSAGE_PREFIX = "[DragonECS] ";
public const string DEBUG_PREFIX = "[DEBUG] ";
public const string DEBUG_WARNING_TAG = "WARNING";
public const string DEBUG_ERROR_TAG = "ERROR";
}
}

View File

@ -1,401 +1,15 @@
using System;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace DCFApixels.DragonECS
{
#region Incs/Excs base
public interface IMaskCondition
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>;
}
#endregion
#region Incs
public interface IInc : IMaskCondition { }
public struct Inc : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype> => Array.Empty<int>();
}
public struct Inc<T0> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
};
}
}
public struct Inc<T0, T1> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7, T8> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T8>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T8>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T9>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T8>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T9>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T10>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T8>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T9>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T10>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T11>.uniqueID,
};
}
}
#endregion
#region Excs
public interface IExc : IMaskCondition { }
public struct Exc : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype> => Array.Empty<int>();
}
public struct Exc<T0> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
};
}
}
public struct Exc<T0, T1> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
};
}
}
public struct Exc<T0, T1, T2> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
};
}
}
public struct Exc<T0, T1, T2, T3> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
};
}
}
public struct Exc<T0, T1, T2, T3, T4> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
};
}
}
public struct Exc<T0, T1, T2, T3, T4, T5> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
};
}
}
#endregion
#region EcsMask
public sealed class EcsMask
{
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<TWorldArchetype>
where TWorldArchetype : EcsWorld<TWorldArchetype>
{
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<TInc, TExc>()
where TInc : struct, IInc
where TExc : struct, IExc
{
return Activator<TInc, TExc>.instance;
}
private class Activator<TInc, TExc>
where TInc : struct, IInc
where TExc : struct, IExc
{
static Activator()
{
var inc = new TInc().GetComponentsIDs<TWorldArchetype>();
var exc = new TExc().GetComponentsIDs<TWorldArchetype>();
Array.Sort(inc);
Array.Sort(exc);
Type thisType = typeof(Activator<TInc, TExc>);
Type sortedIncType = typeof(TInc);
if (sortedIncType.IsGenericType)
{
Type[] sortedInc = new Type[inc.Length];
for (int i = 0; i < sortedInc.Length; i++)
sortedInc[i] = EcsWorld<TWorldArchetype>.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<TWorldArchetype>.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
#region Filter
public interface IEcsFilter
{
#region Properties
public IEcsWorld World { get; }
public EcsMask Mask { get; }
public IEcsReadonlyGroup Entities { get; }
public int EntitiesCount { get; }
#endregion
}
public class EcsFilter : IEcsFilter
@ -455,5 +69,4 @@ namespace DCFApixels.DragonECS
public EcsGroup.Enumerator GetEnumerator() => _entities.GetEnumerator();
#endregion
}
#endregion
}

391
src/EcsMask.cs Normal file
View File

@ -0,0 +1,391 @@
using System;
using System.Runtime.CompilerServices;
using System.Reflection;
namespace DCFApixels.DragonECS
{
#region Incs/Excs base
public interface IMaskCondition
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>;
}
#endregion
#region Incs
public interface IInc : IMaskCondition { }
public struct Inc : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype> => Array.Empty<int>();
}
public struct Inc<T0> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
};
}
}
public struct Inc<T0, T1> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7, T8> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T8>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T8>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T9>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T8>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T9>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T10>.uniqueID,
};
}
}
public struct Inc<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : IInc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T6>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T7>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T8>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T9>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T10>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T11>.uniqueID,
};
}
}
#endregion
#region Excs
public interface IExc : IMaskCondition { }
public struct Exc : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype> => Array.Empty<int>();
}
public struct Exc<T0> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
};
}
}
public struct Exc<T0, T1> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
};
}
}
public struct Exc<T0, T1, T2> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
};
}
}
public struct Exc<T0, T1, T2, T3> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
};
}
}
public struct Exc<T0, T1, T2, T3, T4> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
};
}
}
public struct Exc<T0, T1, T2, T3, T4, T5> : IExc
{
public int[] GetComponentsIDs<TWorldArchetype>() where TWorldArchetype : EcsWorld<TWorldArchetype>
{
return new int[]
{
EcsWorld<TWorldArchetype>.ComponentType<T0>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T1>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T2>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T3>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T4>.uniqueID,
EcsWorld<TWorldArchetype>.ComponentType<T5>.uniqueID,
};
}
}
#endregion
#region EcsMask
public sealed class EcsMask
{
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<TWorldArchetype>
where TWorldArchetype : EcsWorld<TWorldArchetype>
{
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<TInc, TExc>()
where TInc : struct, IInc
where TExc : struct, IExc
{
return Activator<TInc, TExc>.instance;
}
private class Activator<TInc, TExc>
where TInc : struct, IInc
where TExc : struct, IExc
{
static Activator()
{
var inc = new TInc().GetComponentsIDs<TWorldArchetype>();
var exc = new TExc().GetComponentsIDs<TWorldArchetype>();
Array.Sort(inc);
Array.Sort(exc);
Type thisType = typeof(Activator<TInc, TExc>);
Type sortedIncType = typeof(TInc);
if (sortedIncType.IsGenericType)
{
Type[] sortedInc = new Type[inc.Length];
for (int i = 0; i < sortedInc.Length; i++)
sortedInc[i] = EcsWorld<TWorldArchetype>.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<TWorldArchetype>.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
}

11
src/EcsMask.cs.meta Normal file
View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7fe304214160d1a49ba0acf229539df1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -2,7 +2,6 @@
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq.Expressions;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
@ -19,12 +18,7 @@ namespace DCFApixels.DragonECS
this.interfaceType = interfaceType;
this.filter = filter;
}
public EcsRunnerFilterAttribute(object filter)
{
interfaceType = null;
this.filter = filter;
}
public EcsRunnerFilterAttribute(object filter) : this(null, filter) { }
}
public interface IEcsSystem { }
@ -36,31 +30,19 @@ namespace DCFApixels.DragonECS
public bool IsHasFilter { get; }
}
public static class IEcsProcessorExtensions
{
public static bool IsRunner(this IEcsSystem self)
{
return self is IEcsRunner;
}
}
internal static class EcsRunnerActivator
{
private static Dictionary<Guid, Type> _runnerHandlerTypes; //interface guid/Runner handler type pairs;
static EcsRunnerActivator()
{
List<Exception> exceptions = new List<Exception>();
List<Exception> delayedExceptions = new List<Exception>();
Type runnerBaseType = typeof(EcsRunner<>);
List<Type> runnerHandlerTypes = new List<Type>();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
runnerHandlerTypes.AddRange(
assembly.GetTypes()
runnerHandlerTypes.AddRange(assembly.GetTypes()
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && runnerBaseType == type.BaseType.GetGenericTypeDefinition()));
}
@ -71,21 +53,21 @@ namespace DCFApixels.DragonECS
if (e != null)
{
runnerHandlerTypes.RemoveAt(i--);
exceptions.Add(e);
delayedExceptions.Add(e);
}
}
#endif
_runnerHandlerTypes = new Dictionary<Guid, Type>();
foreach (var item in runnerHandlerTypes)
{
//Type interfaceType = item.GetInterfaces().Where(o => o != typeof(IEcsRunner) && o != typeof(IEcsSystem)).First(); //TODO оптимизировать это место
Type interfaceType = item.BaseType.GenericTypeArguments[0];
_runnerHandlerTypes.Add(interfaceType.GUID, item);
}
if (exceptions.Count > 0)
if (delayedExceptions.Count > 0)
{
foreach (var item in exceptions) throw item;
foreach (var item in delayedExceptions) EcsDebug.Print(EcsConsts.DEBUG_ERROR_TAG, item.Message);
throw delayedExceptions[0];
}
}
@ -96,18 +78,18 @@ namespace DCFApixels.DragonECS
if (type.ReflectedType != null)
{
return new Exception($"{type.FullName}.ReflectedType must be Null, but equal to {type.ReflectedType.FullName}.");
return new EcsRunnerImplementationException($"{type.FullName}.ReflectedType must be Null, but equal to {type.ReflectedType.FullName}.");
}
if (!baseTypeArgument.IsInterface)
{
return new Exception($"Argument T of class EcsRunner<T>, can only be an inetrface.The {baseTypeArgument.FullName} type is not an interface.");
return new EcsRunnerImplementationException($"Argument T of class EcsRunner<T>, can only be an inetrface.The {baseTypeArgument.FullName} type is not an interface.");
}
var interfaces = type.GetInterfaces();
if (!interfaces.Any(o => o == baseTypeArgument))
{
return new Exception($"Runner {type.FullName} does not implement interface {baseTypeArgument.FullName}.");
return new EcsRunnerImplementationException($"Runner {type.FullName} does not implement interface {baseTypeArgument.FullName}.");
}
return null;
@ -148,7 +130,7 @@ namespace DCFApixels.DragonECS
#if DEBUG || !DRAGONECS_NO_SANITIZE_CHECKS
if (_subclass != null)
{
throw new ArgumentException($"The Runner<{typeof(TInterface).FullName}> can only have one subclass");
throw new EcsRunnerImplementationException($"The Runner<{typeof(TInterface).FullName}> can have only one implementing subclass");
}
Type interfaceType = typeof(TInterface);
@ -225,10 +207,12 @@ namespace DCFApixels.DragonECS
private object _filter;
private bool _isHasFilter;
#region Properties
public EcsSystems Source => _source;
public IList Targets => _targetsSealed;
public object Filter => _filter;
public bool IsHasFilter => _isHasFilter;
#endregion
private EcsRunner<TInterface> Set(EcsSystems source, TInterface[] targets, bool isHasFilter, object filter)
{
@ -251,4 +235,14 @@ namespace DCFApixels.DragonECS
Set(_source, FilterSystems(_source.AllSystems, _filter), _isHasFilter, _filter);
}
}
#region Extensions
public static class IEcsSystemExtensions
{
public static bool IsRunner(this IEcsSystem self)
{
return self is IEcsRunner;
}
}
#endregion
}

View File

@ -351,15 +351,13 @@ namespace DCFApixels.DragonECS
#endregion
}
public static class IEcsWorldExt
#region Extensions
public static class IEcsWorldExtensions
{
public static void DelEntity(this IEcsWorld self, ent entity)
{
self.DelEntity(entity.id);
}
}
#endregion
}

View File

@ -1,5 +1,4 @@
using System;
using System.Runtime.Serialization;
namespace DCFApixels.DragonECS
{
@ -9,6 +8,8 @@ namespace DCFApixels.DragonECS
public EcsFrameworkException() { }
public EcsFrameworkException(string message) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message) { }
public EcsFrameworkException(string message, Exception inner) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message, inner) { }
protected EcsFrameworkException(SerializationInfo info, StreamingContext context) : base(info, context) { }
protected EcsFrameworkException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}
}

View File

@ -0,0 +1,15 @@
using System;
namespace DCFApixels.DragonECS
{
[Serializable]
public class EcsRunnerImplementationException : Exception
{
public EcsRunnerImplementationException() { }
public EcsRunnerImplementationException(string message) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message) { }
public EcsRunnerImplementationException(string message, Exception inner) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message, inner) { }
protected EcsRunnerImplementationException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c4bda71728347ce4fa0dca0555eb8c4c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: