From e271c77cabe18274741416f81424bea76d8492f2 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:08:42 +0800 Subject: [PATCH] add Where query with sort --- src/EcsAspect.cs | 36 +++++++++++++++++++++++++++--- src/Executors/EcsWhereExecutor.cs | 37 +++++++++++++++++++++---------- src/Executors/Queries.cs | 26 +++++++++++++++++++++- 3 files changed, 83 insertions(+), 16 deletions(-) diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs index 594f1a4..a6abe1f 100644 --- a/src/EcsAspect.cs +++ b/src/EcsAspect.cs @@ -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() 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(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new() + // { + // pool = self.IncludePool(); + // return self; + // } + // public static EcsAspect.Builder Exc(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new() + // { + // pool = self.ExcludePool(); + // return self; + // } + // public static EcsAspect.Builder Opt(this EcsAspect.Builder self, ref TPool pool) where TPool : IEcsPoolImplementation, new() + // { + // pool = self.OptionalPool(); + // return self; + // } + //} + #endregion + #region Constraint Markers public readonly ref struct IncludeMarker { diff --git a/src/Executors/EcsWhereExecutor.cs b/src/Executors/EcsWhereExecutor.cs index 3919948..55b6cce 100644 --- a/src/Executors/EcsWhereExecutor.cs +++ b/src/Executors/EcsWhereExecutor.cs @@ -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 comparison) - //{ - // Execute_Iternal(); - // return new EcsSpan(World.id, _filteredAllEntities, _filteredAllEntitiesCount); - //} - //[MethodImpl(MethodImplOptions.AggressiveInlining)] - //public EcsSpan ExecuteFor(EcsSpan span, Comparison comparison) - //{ - // ExecuteFor_Iternal(span); - // return new EcsSpan(World.id, _filteredEntities, _filteredEntitiesCount); - //} + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public EcsSpan Execute(Comparison comparison) + { + Execute_Iternal(); + ArraySortHalperX.Sort(_filteredAllEntities, comparison, _filteredAllEntitiesCount); + return new EcsSpan(World.id, _filteredAllEntities, _filteredAllEntitiesCount); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public EcsSpan ExecuteFor(EcsSpan span, Comparison comparison) + { + ExecuteFor_Iternal(span); + ArraySortHalperX.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 comparison) + { + return _core.Execute(comparison); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public EcsSpan ExecuteFor(EcsSpan span, Comparison comparison) + { + return _core.ExecuteFor(span, comparison); + } #endregion } } diff --git a/src/Executors/Queries.cs b/src/Executors/Queries.cs index bbed589..bbc4015 100644 --- a/src/Executors/Queries.cs +++ b/src/Executors/Queries.cs @@ -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(this TCollection entities, out TAspect aspect, Comparison comparison) + where TAspect : EcsAspect, new() + where TCollection : IEntityStorage + { + return entities.ToSpan().Where(out aspect, comparison); + } + public static EcsSpan Where(this EcsReadonlyGroup group, out TAspect aspect, Comparison comparison) + where TAspect : EcsAspect, new() + { + return group.ToSpan().Where(out aspect, comparison); + } + public static EcsSpan Where(this EcsSpan span, out TAspect aspect, Comparison comparison) + where TAspect : EcsAspect, new() + { + EcsWorld world = span.World; + var executor = world.GetExecutor>(); + aspect = executor.Aspect; + return executor.ExecuteFor(span, comparison); + } + #endregion + #region WhereToGroup public static EcsReadonlyGroup WhereToGroup(this TCollection entities, out TAspect aspect) where TAspect : EcsAspect, new()