mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-18 01:44:35 +08:00
Update EcsMask.cs
This commit is contained in:
parent
3329f707d0
commit
aa98201826
@ -550,20 +550,14 @@ namespace DCFApixels.DragonECS
|
|||||||
|
|
||||||
private readonly bool _isSingleIncPoolWithEntityStorage;
|
private readonly bool _isSingleIncPoolWithEntityStorage;
|
||||||
private readonly bool _isHasAnyEntityStorage;
|
private readonly bool _isHasAnyEntityStorage;
|
||||||
private readonly MaskType _maskType;
|
private readonly EcsMaskFlags _maskFlags;
|
||||||
|
|
||||||
private enum MaskType : byte
|
|
||||||
{
|
|
||||||
Empty,
|
|
||||||
OnlyInc,
|
|
||||||
IncExc,
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Constructors/Finalizator
|
#region Constructors/Finalizator
|
||||||
public unsafe EcsMaskIterator(EcsWorld source, EcsMask mask)
|
public unsafe EcsMaskIterator(EcsWorld source, EcsMask mask)
|
||||||
{
|
{
|
||||||
World = source;
|
World = source;
|
||||||
Mask = mask;
|
Mask = mask;
|
||||||
|
_maskFlags = mask.Flags;
|
||||||
|
|
||||||
int bufferLength = mask._incs.Length + mask._excs.Length + mask._anys.Length;
|
int bufferLength = mask._incs.Length + mask._excs.Length + mask._anys.Length;
|
||||||
int chunckBufferLength = mask._incChunckMasks.Length + mask._excChunckMasks.Length + mask._anyChunckMasks.Length;
|
int chunckBufferLength = mask._incChunckMasks.Length + mask._excChunckMasks.Length + mask._anyChunckMasks.Length;
|
||||||
@ -599,14 +593,6 @@ namespace DCFApixels.DragonECS
|
|||||||
}
|
}
|
||||||
|
|
||||||
_isSingleIncPoolWithEntityStorage = Mask.Excs.Length <= 0 && Mask.Incs.Length == 1;
|
_isSingleIncPoolWithEntityStorage = Mask.Excs.Length <= 0 && Mask.Incs.Length == 1;
|
||||||
if (_sortIncBuffer.Length > 0 && _sortExcBuffer.Length == 0 && _sortAnyBuffer.Length == 0)
|
|
||||||
{
|
|
||||||
_maskType = MaskType.OnlyInc;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_maskType = mask.IsEmpty ? MaskType.Empty : MaskType.IncExc;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
unsafe ~EcsMaskIterator()
|
unsafe ~EcsMaskIterator()
|
||||||
{
|
{
|
||||||
@ -707,33 +693,48 @@ namespace DCFApixels.DragonECS
|
|||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void IterateTo(EcsSpan source, EcsGroup group)
|
public void IterateTo(EcsSpan source, EcsGroup group)
|
||||||
{
|
{
|
||||||
switch (_maskType)
|
switch (_maskFlags)
|
||||||
{
|
{
|
||||||
case MaskType.Empty:
|
case EcsMaskFlags.Empty:
|
||||||
group.CopyFrom(source);
|
group.CopyFrom(source);
|
||||||
break;
|
break;
|
||||||
case MaskType.OnlyInc:
|
case EcsMaskFlags.Inc:
|
||||||
IterateOnlyInc(source).CopyTo(group);
|
IterateOnlyInc(source).CopyTo(group);
|
||||||
break;
|
break;
|
||||||
case MaskType.IncExc:
|
case EcsMaskFlags.Exc:
|
||||||
|
case EcsMaskFlags.Any:
|
||||||
|
case EcsMaskFlags.IncExc:
|
||||||
|
case EcsMaskFlags.IncAny:
|
||||||
|
case EcsMaskFlags.ExcAny:
|
||||||
|
case EcsMaskFlags.IncExcAny:
|
||||||
Iterate(source).CopyTo(group);
|
Iterate(source).CopyTo(group);
|
||||||
break;
|
break;
|
||||||
|
case EcsMaskFlags.Broken:
|
||||||
|
group.Clear();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Throw.UndefinedException();
|
Throw.UndefinedException();
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public int IterateTo(EcsSpan source, ref int[] array)
|
public int IterateTo(EcsSpan source, ref int[] array)
|
||||||
{
|
{
|
||||||
switch (_maskType)
|
switch (_maskFlags)
|
||||||
{
|
{
|
||||||
case MaskType.Empty:
|
case EcsMaskFlags.Empty:
|
||||||
return source.ToArray(ref array);
|
return source.ToArray(ref array);
|
||||||
case MaskType.OnlyInc:
|
case EcsMaskFlags.Inc:
|
||||||
return IterateOnlyInc(source).CopyTo(ref array);
|
return IterateOnlyInc(source).CopyTo(ref array);
|
||||||
case MaskType.IncExc:
|
case EcsMaskFlags.Exc:
|
||||||
|
case EcsMaskFlags.Any:
|
||||||
|
case EcsMaskFlags.IncExc:
|
||||||
|
case EcsMaskFlags.IncAny:
|
||||||
|
case EcsMaskFlags.ExcAny:
|
||||||
|
case EcsMaskFlags.IncExcAny:
|
||||||
return Iterate(source).CopyTo(ref array);
|
return Iterate(source).CopyTo(ref array);
|
||||||
|
case EcsMaskFlags.Broken:
|
||||||
|
return new EcsSpan(World.ID, Array.Empty<int>()).ToArray(ref array);
|
||||||
default:
|
default:
|
||||||
Throw.UndefinedException();
|
Throw.UndefinedException();
|
||||||
return 0;
|
return 0;
|
||||||
@ -1033,6 +1034,7 @@ namespace DCFApixels.DragonECS
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Utils
|
||||||
namespace DCFApixels.DragonECS.Core.Internal
|
namespace DCFApixels.DragonECS.Core.Internal
|
||||||
{
|
{
|
||||||
#region EcsMaskIteratorUtility
|
#region EcsMaskIteratorUtility
|
||||||
@ -1113,3 +1115,4 @@ namespace DCFApixels.DragonECS.Core.Internal
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
#endregion
|
Loading…
Reference in New Issue
Block a user