mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2026-04-22 01:45:55 +08:00
refactoring
This commit is contained in:
parent
a215d7702a
commit
0513c55d2c
@ -4,5 +4,7 @@
|
|||||||
{
|
{
|
||||||
public const string EXCEPTION_MESSAGE_PREFIX = "[DragonECS] ";
|
public const string EXCEPTION_MESSAGE_PREFIX = "[DragonECS] ";
|
||||||
public const string DEBUG_PREFIX = "[DEBUG] ";
|
public const string DEBUG_PREFIX = "[DEBUG] ";
|
||||||
|
public const string DEBUG_WARNING_TAG = "WARNING";
|
||||||
|
public const string DEBUG_ERROR_TAG = "ERROR";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
393
src/EcsFilter.cs
393
src/EcsFilter.cs
@ -1,401 +1,15 @@
|
|||||||
using System;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace DCFApixels.DragonECS
|
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
|
public interface IEcsFilter
|
||||||
{
|
{
|
||||||
|
#region Properties
|
||||||
public IEcsWorld World { get; }
|
public IEcsWorld World { get; }
|
||||||
public EcsMask Mask { get; }
|
public EcsMask Mask { get; }
|
||||||
public IEcsReadonlyGroup Entities { get; }
|
public IEcsReadonlyGroup Entities { get; }
|
||||||
public int EntitiesCount { get; }
|
public int EntitiesCount { get; }
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EcsFilter : IEcsFilter
|
public class EcsFilter : IEcsFilter
|
||||||
@ -455,5 +69,4 @@ namespace DCFApixels.DragonECS
|
|||||||
public EcsGroup.Enumerator GetEnumerator() => _entities.GetEnumerator();
|
public EcsGroup.Enumerator GetEnumerator() => _entities.GetEnumerator();
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
|
|||||||
391
src/EcsMask.cs
Normal file
391
src/EcsMask.cs
Normal 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
11
src/EcsMask.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7fe304214160d1a49ba0acf229539df1
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -2,7 +2,6 @@
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
@ -19,12 +18,7 @@ namespace DCFApixels.DragonECS
|
|||||||
this.interfaceType = interfaceType;
|
this.interfaceType = interfaceType;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
}
|
}
|
||||||
|
public EcsRunnerFilterAttribute(object filter) : this(null, filter) { }
|
||||||
public EcsRunnerFilterAttribute(object filter)
|
|
||||||
{
|
|
||||||
interfaceType = null;
|
|
||||||
this.filter = filter;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IEcsSystem { }
|
public interface IEcsSystem { }
|
||||||
@ -36,31 +30,19 @@ namespace DCFApixels.DragonECS
|
|||||||
public bool IsHasFilter { get; }
|
public bool IsHasFilter { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static class IEcsProcessorExtensions
|
|
||||||
{
|
|
||||||
public static bool IsRunner(this IEcsSystem self)
|
|
||||||
{
|
|
||||||
return self is IEcsRunner;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static class EcsRunnerActivator
|
internal static class EcsRunnerActivator
|
||||||
{
|
{
|
||||||
private static Dictionary<Guid, Type> _runnerHandlerTypes; //interface guid/Runner handler type pairs;
|
private static Dictionary<Guid, Type> _runnerHandlerTypes; //interface guid/Runner handler type pairs;
|
||||||
|
|
||||||
static EcsRunnerActivator()
|
static EcsRunnerActivator()
|
||||||
{
|
{
|
||||||
List<Exception> exceptions = new List<Exception>();
|
List<Exception> delayedExceptions = new List<Exception>();
|
||||||
|
|
||||||
Type runnerBaseType = typeof(EcsRunner<>);
|
Type runnerBaseType = typeof(EcsRunner<>);
|
||||||
|
|
||||||
List<Type> runnerHandlerTypes = new List<Type>();
|
List<Type> runnerHandlerTypes = new List<Type>();
|
||||||
|
|
||||||
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
|
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
|
||||||
{
|
{
|
||||||
runnerHandlerTypes.AddRange(
|
runnerHandlerTypes.AddRange(assembly.GetTypes()
|
||||||
assembly.GetTypes()
|
|
||||||
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && runnerBaseType == type.BaseType.GetGenericTypeDefinition()));
|
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && runnerBaseType == type.BaseType.GetGenericTypeDefinition()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,21 +53,21 @@ namespace DCFApixels.DragonECS
|
|||||||
if (e != null)
|
if (e != null)
|
||||||
{
|
{
|
||||||
runnerHandlerTypes.RemoveAt(i--);
|
runnerHandlerTypes.RemoveAt(i--);
|
||||||
exceptions.Add(e);
|
delayedExceptions.Add(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
_runnerHandlerTypes = new Dictionary<Guid, Type>();
|
_runnerHandlerTypes = new Dictionary<Guid, Type>();
|
||||||
foreach (var item in runnerHandlerTypes)
|
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];
|
Type interfaceType = item.BaseType.GenericTypeArguments[0];
|
||||||
_runnerHandlerTypes.Add(interfaceType.GUID, item);
|
_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)
|
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)
|
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();
|
var interfaces = type.GetInterfaces();
|
||||||
|
|
||||||
if (!interfaces.Any(o => o == baseTypeArgument))
|
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;
|
return null;
|
||||||
@ -148,7 +130,7 @@ namespace DCFApixels.DragonECS
|
|||||||
#if DEBUG || !DRAGONECS_NO_SANITIZE_CHECKS
|
#if DEBUG || !DRAGONECS_NO_SANITIZE_CHECKS
|
||||||
if (_subclass != null)
|
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);
|
Type interfaceType = typeof(TInterface);
|
||||||
@ -225,10 +207,12 @@ namespace DCFApixels.DragonECS
|
|||||||
private object _filter;
|
private object _filter;
|
||||||
private bool _isHasFilter;
|
private bool _isHasFilter;
|
||||||
|
|
||||||
|
#region Properties
|
||||||
public EcsSystems Source => _source;
|
public EcsSystems Source => _source;
|
||||||
public IList Targets => _targetsSealed;
|
public IList Targets => _targetsSealed;
|
||||||
public object Filter => _filter;
|
public object Filter => _filter;
|
||||||
public bool IsHasFilter => _isHasFilter;
|
public bool IsHasFilter => _isHasFilter;
|
||||||
|
#endregion
|
||||||
|
|
||||||
private EcsRunner<TInterface> Set(EcsSystems source, TInterface[] targets, bool isHasFilter, object filter)
|
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);
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -351,15 +351,13 @@ namespace DCFApixels.DragonECS
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Extensions
|
||||||
|
public static class IEcsWorldExtensions
|
||||||
|
|
||||||
|
|
||||||
public static class IEcsWorldExt
|
|
||||||
{
|
{
|
||||||
public static void DelEntity(this IEcsWorld self, ent entity)
|
public static void DelEntity(this IEcsWorld self, ent entity)
|
||||||
{
|
{
|
||||||
self.DelEntity(entity.id);
|
self.DelEntity(entity.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.Serialization;
|
|
||||||
|
|
||||||
namespace DCFApixels.DragonECS
|
namespace DCFApixels.DragonECS
|
||||||
{
|
{
|
||||||
@ -9,6 +8,8 @@ namespace DCFApixels.DragonECS
|
|||||||
public EcsFrameworkException() { }
|
public EcsFrameworkException() { }
|
||||||
public EcsFrameworkException(string message) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message) { }
|
public EcsFrameworkException(string message) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message) { }
|
||||||
public EcsFrameworkException(string message, Exception inner) : base(EcsConsts.EXCEPTION_MESSAGE_PREFIX + message, inner) { }
|
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) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
src/Exceptions/EcsRunnerImplementationException.cs
Normal file
15
src/Exceptions/EcsRunnerImplementationException.cs
Normal 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) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
11
src/Exceptions/EcsRunnerImplementationException.cs.meta
Normal file
11
src/Exceptions/EcsRunnerImplementationException.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c4bda71728347ce4fa0dca0555eb8c4c
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Loading…
Reference in New Issue
Block a user