add Where query with sort

This commit is contained in:
Mikhail 2024-08-26 11:08:42 +08:00
parent c5c2d0e30a
commit e271c77cab
3 changed files with 83 additions and 16 deletions

View File

@ -101,6 +101,7 @@ namespace DCFApixels.DragonECS
private EcsWorld _world;
private EcsMask.Builder _maskBuilder;
#region Properties
public IncludeMarker Inc
{
get { return new IncludeMarker(this); }
@ -113,9 +114,13 @@ namespace DCFApixels.DragonECS
{
get { return new OptionalMarker(this); }
}
public EcsWorld World
{
get { return _world; }
}
#endregion
public EcsWorld World => _world;
#region Constructors/New
private Builder(EcsWorld world)
{
_world = world;
@ -128,17 +133,19 @@ namespace DCFApixels.DragonECS
EcsAspect newAspect;
var buildersStack = GetBuildersStack();
buildersStack.Push(builder);
buildersStack.Push(builder);
newAspect = new TAspect();
newAspect.Init(builder);
buildersStack.Pop();
newAspect._source = world;
builder.Build(out newAspect._mask);
newAspect._isBuilt = true;
return (TAspect)newAspect;
}
#endregion
#region Include/Exclude/Optional/Combine/Except
public TPool IncludePool<TPool>() where TPool : IEcsPoolImplementation, new()
@ -179,10 +186,12 @@ namespace DCFApixels.DragonECS
}
#endregion
#region Build
private void Build(out EcsMask mask)
{
mask = _maskBuilder.Build();
}
#endregion
#region SupportReflectionHack
#if UNITY_2020_3_OR_NEWER
@ -293,6 +302,27 @@ namespace DCFApixels.DragonECS
#endregion
}
#region EcsAspectExtensions
//public static class EcsAspectExtensions
//{
// public static EcsAspect.Builder Inc<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new()
// {
// pool = self.IncludePool<TPool>();
// return self;
// }
// public static EcsAspect.Builder Exc<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new()
// {
// pool = self.ExcludePool<TPool>();
// return self;
// }
// public static EcsAspect.Builder Opt<TPool>(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new()
// {
// pool = self.OptionalPool<TPool>();
// return self;
// }
//}
#endregion
#region Constraint Markers
public readonly ref struct IncludeMarker
{

View File

@ -1,4 +1,5 @@
using DCFApixels.DragonECS.Internal;
using System;
using System.Runtime.CompilerServices;
#if ENABLE_IL2CPP
using Unity.IL2CPP.CompilerServices;
@ -79,18 +80,20 @@ namespace DCFApixels.DragonECS.Internal
return new EcsSpan(World.id, _filteredEntities, _filteredEntitiesCount);
}
//[MethodImpl(MethodImplOptions.AggressiveInlining)]
//public EcsSpan Execute(Comparison<int> comparison)
//{
// Execute_Iternal();
// return new EcsSpan(World.id, _filteredAllEntities, _filteredAllEntitiesCount);
//}
//[MethodImpl(MethodImplOptions.AggressiveInlining)]
//public EcsSpan ExecuteFor(EcsSpan span, Comparison<int> comparison)
//{
// ExecuteFor_Iternal(span);
// return new EcsSpan(World.id, _filteredEntities, _filteredEntitiesCount);
//}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public EcsSpan Execute(Comparison<int> comparison)
{
Execute_Iternal();
ArraySortHalperX<int>.Sort(_filteredAllEntities, comparison, _filteredAllEntitiesCount);
return new EcsSpan(World.id, _filteredAllEntities, _filteredAllEntitiesCount);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public EcsSpan ExecuteFor(EcsSpan span, Comparison<int> comparison)
{
ExecuteFor_Iternal(span);
ArraySortHalperX<int>.Sort(_filteredEntities, comparison, _filteredEntitiesCount);
return new EcsSpan(World.id, _filteredEntities, _filteredEntitiesCount);
}
#endregion
}
}
@ -139,6 +142,16 @@ namespace DCFApixels.DragonECS
{
return _core.ExecuteFor(span);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public EcsSpan Execute(Comparison<int> comparison)
{
return _core.Execute(comparison);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public EcsSpan ExecuteFor(EcsSpan span, Comparison<int> comparison)
{
return _core.ExecuteFor(span, comparison);
}
#endregion
}
}

View File

@ -1,4 +1,6 @@
namespace DCFApixels.DragonECS
using System;
namespace DCFApixels.DragonECS
{
public interface IEntityStorage
{
@ -28,6 +30,28 @@
}
#endregion
#region Where with sort
public static EcsSpan Where<TCollection, TAspect>(this TCollection entities, out TAspect aspect, Comparison<int> comparison)
where TAspect : EcsAspect, new()
where TCollection : IEntityStorage
{
return entities.ToSpan().Where(out aspect, comparison);
}
public static EcsSpan Where<TAspect>(this EcsReadonlyGroup group, out TAspect aspect, Comparison<int> comparison)
where TAspect : EcsAspect, new()
{
return group.ToSpan().Where(out aspect, comparison);
}
public static EcsSpan Where<TAspect>(this EcsSpan span, out TAspect aspect, Comparison<int> comparison)
where TAspect : EcsAspect, new()
{
EcsWorld world = span.World;
var executor = world.GetExecutor<EcsWhereExecutor<TAspect>>();
aspect = executor.Aspect;
return executor.ExecuteFor(span, comparison);
}
#endregion
#region WhereToGroup
public static EcsReadonlyGroup WhereToGroup<TCollection, TAspect>(this TCollection entities, out TAspect aspect)
where TAspect : EcsAspect, new()