From 5f5940f4438b6bea911a15361b48edaa93ba6802 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Sat, 10 Feb 2024 20:54:09 +0800 Subject: [PATCH] update queries --- src/Builtin/Aspects.cs | 322 ++++++++++++++++------- src/Collections/EcsGroup.cs | 2 +- src/EcsWorld.cs | 95 +------ src/Executors/EcsWhereExecutor.cs | 60 ----- src/Executors/EcsWhereToGroupExecutor.cs | 61 +++++ src/Executors/Queries.cs | 107 ++++++++ 6 files changed, 404 insertions(+), 243 deletions(-) create mode 100644 src/Executors/EcsWhereToGroupExecutor.cs create mode 100644 src/Executors/Queries.cs diff --git a/src/Builtin/Aspects.cs b/src/Builtin/Aspects.cs index 0e9c607..6d93f84 100644 --- a/src/Builtin/Aspects.cs +++ b/src/Builtin/Aspects.cs @@ -21,6 +21,11 @@ a0 = b.Combine(0); a1 = b.Combine(1); } + public void Deconstruct(out A0 a0, out A1 a1) + { + a0 = this.a0; + a1 = this.a1; + } } public sealed class CombinedAspect : EcsAspect @@ -37,6 +42,12 @@ a1 = b.Combine(1); a2 = b.Combine(2); } + public void Deconstruct(out A0 a0, out A1 a1, out A2 a2) + { + a0 = this.a0; + a1 = this.a1; + a2 = this.a2; + } } public sealed class CombinedAspect : EcsAspect @@ -56,6 +67,13 @@ a2 = b.Combine(2); a3 = b.Combine(3); } + public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3) + { + a0 = this.a0; + a1 = this.a1; + a2 = this.a2; + a3 = this.a3; + } } public sealed class CombinedAspect : EcsAspect @@ -78,6 +96,14 @@ a3 = b.Combine(3); a4 = b.Combine(4); } + public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) + { + a0 = this.a0; + a1 = this.a1; + a2 = this.a2; + a3 = this.a3; + a4 = this.a4; + } } public sealed class CombinedAspect : EcsAspect @@ -103,167 +129,146 @@ a4 = b.Combine(4); a5 = b.Combine(5); } + public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) + { + a0 = this.a0; + a1 = this.a1; + a2 = this.a2; + a3 = this.a3; + a4 = this.a4; + a5 = this.a5; + } } public static class CombinedAspectExtensions { #region Where 2 - public static EcsReadonlyGroup Where(this EcsWorld self, out A0 a0, out A1 a1) + public static EcsSpan Where(this TCollection entities, out A0 a0, out A1 a1) where A0 : EcsAspect where A1 : EcsAspect + where TCollection : IEntitiesCollection { - return self.WhereFor(self.Entities, out a0, out a1); + return entities.ToSpan().Where(out a0, out a1); } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1) + public static EcsSpan Where(this EcsReadonlyGroup group, out A0 a0, out A1 a1) where A0 : EcsAspect where A1 : EcsAspect { - var combined = self.GetAspect>(); - a0 = combined.a0; - a1 = combined.a1; - return self.WhereToGroupFor>(sourceGroup); + return group.ToSpan().Where(out a0, out a1); } - - public static EcsReadonlyGroup Where(this EcsWorld self) + public static EcsSpan Where(this EcsSpan span, out A0 a0, out A1 a1) where A0 : EcsAspect where A1 : EcsAspect { - return self.WhereToGroup>(); - } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup) - where A0 : EcsAspect - where A1 : EcsAspect - { - return self.WhereToGroupFor>(sourceGroup); + var result = span.Where(out CombinedAspect combined); + (a0, a1) = combined; + return result; } #endregion #region Where 3 - public static EcsReadonlyGroup Where(this EcsWorld self, out A0 a0, out A1 a1, out A2 a2) + public static EcsSpan Where(this TCollection entities, out A0 a0, out A1 a1, out A2 a2) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect + where TCollection : IEntitiesCollection { - return self.WhereFor(self.Entities, out a0, out a1, out a2); + return entities.ToSpan().Where(out a0, out a1, out a2); } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1, out A2 a2) + public static EcsSpan Where(this EcsReadonlyGroup group, out A0 a0, out A1 a1, out A2 a2) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect { - var combined = self.GetAspect>(); - a0 = combined.a0; - a1 = combined.a1; - a2 = combined.a2; - return self.WhereToGroupFor>(sourceGroup); + return group.ToSpan().Where(out a0, out a1, out a2); } - - public static EcsReadonlyGroup Where(this EcsWorld self) + public static EcsSpan Where(this EcsSpan span, out A0 a0, out A1 a1, out A2 a2) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect { - return self.WhereToGroup>(); - } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup) - where A0 : EcsAspect - where A1 : EcsAspect - where A2 : EcsAspect - { - return self.WhereToGroupFor>(sourceGroup); + var result = span.Where(out CombinedAspect combined); + (a0, a1, a2) = combined; + return result; } #endregion #region Where 4 - public static EcsReadonlyGroup Where(this EcsWorld self, out A0 a0, out A1 a1, out A2 a2, out A3 a3) + public static EcsSpan Where(this TCollection entities, out A0 a0, out A1 a1, out A2 a2, out A3 a3) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect where A3 : EcsAspect + where TCollection : IEntitiesCollection { - return self.WhereFor(self.Entities, out a0, out a1, out a2, out a3); + return entities.ToSpan().Where(out a0, out a1, out a2, out a3); } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1, out A2 a2, out A3 a3) + public static EcsSpan Where(this EcsReadonlyGroup group, out A0 a0, out A1 a1, out A2 a2, out A3 a3) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect where A3 : EcsAspect { - var combined = self.GetAspect>(); - a0 = combined.a0; - a1 = combined.a1; - a2 = combined.a2; - a3 = combined.a3; - return self.WhereToGroupFor>(sourceGroup); + return group.ToSpan().Where(out a0, out a1, out a2, out a3); } - - public static EcsReadonlyGroup Where(this EcsWorld self) + public static EcsSpan Where(this EcsSpan span, out A0 a0, out A1 a1, out A2 a2, out A3 a3) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect where A3 : EcsAspect { - return self.WhereToGroup>(); - } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup) - where A0 : EcsAspect - where A1 : EcsAspect - where A2 : EcsAspect - where A3 : EcsAspect - { - return self.WhereToGroupFor>(sourceGroup); + var result = span.Where(out CombinedAspect combined); + (a0, a1, a2, a3) = combined; + return result; } #endregion #region Where 5 - public static EcsReadonlyGroup Where(this EcsWorld self, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) + public static EcsSpan Where(this TCollection entities, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect where A3 : EcsAspect where A4 : EcsAspect + where TCollection : IEntitiesCollection { - return self.WhereFor(self.Entities, out a0, out a1, out a2, out a3, out a4); + return entities.ToSpan().Where(out a0, out a1, out a2, out a3, out a4); } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) + public static EcsSpan Where(this EcsReadonlyGroup group, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect where A3 : EcsAspect where A4 : EcsAspect { - var combined = self.GetAspect>(); - a0 = combined.a0; - a1 = combined.a1; - a2 = combined.a2; - a3 = combined.a3; - a4 = combined.a4; - return self.WhereToGroupFor>(sourceGroup); + return group.ToSpan().Where(out a0, out a1, out a2, out a3, out a4); } - - - public static EcsReadonlyGroup Where(this EcsWorld self) + public static EcsSpan Where(this EcsSpan span, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect where A3 : EcsAspect where A4 : EcsAspect { - return self.WhereToGroup>(); - } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup) - where A0 : EcsAspect - where A1 : EcsAspect - where A2 : EcsAspect - where A3 : EcsAspect - where A4 : EcsAspect - { - return self.WhereToGroupFor>(sourceGroup); + var result = span.Where(out CombinedAspect combined); + (a0, a1, a2, a3, a4) = combined; + return result; } #endregion #region Where 6 - public static EcsReadonlyGroup Where(this EcsWorld self, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) + public static EcsSpan Where(this TCollection entities, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + where A4 : EcsAspect + where A5 : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().Where(out a0, out a1, out a2, out a3, out a4, out a5); + } + public static EcsSpan Where(this EcsReadonlyGroup group, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect @@ -271,9 +276,9 @@ where A4 : EcsAspect where A5 : EcsAspect { - return self.WhereFor(self.Entities, out a0, out a1, out a2, out a3, out a4, out a5); + return group.ToSpan().Where(out a0, out a1, out a2, out a3, out a4, out a5); } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) + public static EcsSpan Where(this EcsSpan span, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect @@ -281,28 +286,139 @@ where A4 : EcsAspect where A5 : EcsAspect { - var combined = self.GetAspect>(); - a0 = combined.a0; - a1 = combined.a1; - a2 = combined.a2; - a3 = combined.a3; - a4 = combined.a4; - a5 = combined.a5; - return self.WhereToGroupFor>(sourceGroup); + var result = span.Where(out CombinedAspect combined); + (a0, a1, a2, a3, a4, a5) = combined; + return result; } + #endregion - - public static EcsReadonlyGroup Where(this EcsWorld self) + #region WhereToGroup 2 + public static EcsReadonlyGroup WhereToGroup(this TCollection entities, out A0 a0, out A1 a1) where A0 : EcsAspect where A1 : EcsAspect - where A2 : EcsAspect - where A3 : EcsAspect - where A4 : EcsAspect - where A5 : EcsAspect + where TCollection : IEntitiesCollection { - return self.WhereToGroup>(); + return entities.ToSpan().WhereToGroup(out a0, out a1); } - public static EcsReadonlyGroup WhereFor(this EcsWorld self, EcsReadonlyGroup sourceGroup) + public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group, out A0 a0, out A1 a1) + where A0 : EcsAspect + where A1 : EcsAspect + { + return group.ToSpan().WhereToGroup(out a0, out a1); + } + public static EcsReadonlyGroup WhereToGroup(this EcsSpan span, out A0 a0, out A1 a1) + where A0 : EcsAspect + where A1 : EcsAspect + { + var result = span.WhereToGroup(out CombinedAspect combined); + (a0, a1) = combined; + return result; + } + #endregion + + #region WhereToGroup 3 + public static EcsReadonlyGroup WhereToGroup(this TCollection entities, out A0 a0, out A1 a1, out A2 a2) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().WhereToGroup(out a0, out a1, out a2); + } + public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group, out A0 a0, out A1 a1, out A2 a2) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + { + return group.ToSpan().WhereToGroup(out a0, out a1, out a2); + } + public static EcsReadonlyGroup WhereToGroup(this EcsSpan span, out A0 a0, out A1 a1, out A2 a2) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + { + var result = span.WhereToGroup(out CombinedAspect combined); + (a0, a1, a2) = combined; + return result; + } + #endregion + + #region WhereToGroup 4 + public static EcsReadonlyGroup WhereToGroup(this TCollection entities, out A0 a0, out A1 a1, out A2 a2, out A3 a3) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().WhereToGroup(out a0, out a1, out a2, out a3); + } + public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group, out A0 a0, out A1 a1, out A2 a2, out A3 a3) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + { + return group.ToSpan().WhereToGroup(out a0, out a1, out a2, out a3); + } + public static EcsReadonlyGroup WhereToGroup(this EcsSpan span, out A0 a0, out A1 a1, out A2 a2, out A3 a3) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + { + var result = span.WhereToGroup(out CombinedAspect combined); + (a0, a1, a2, a3) = combined; + return result; + } + #endregion + + #region WhereToGroup 5 + public static EcsReadonlyGroup WhereToGroup(this TCollection entities, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + where A4 : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().WhereToGroup(out a0, out a1, out a2, out a3, out a4); + } + public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + where A4 : EcsAspect + { + return group.ToSpan().WhereToGroup(out a0, out a1, out a2, out a3, out a4); + } + public static EcsReadonlyGroup WhereToGroup(this EcsSpan span, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + where A4 : EcsAspect + { + var result = span.WhereToGroup(out CombinedAspect combined); + (a0, a1, a2, a3, a4) = combined; + return result; + } + #endregion + + #region WhereToGroup 6 + public static EcsReadonlyGroup WhereToGroup(this TCollection entities, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + where A4 : EcsAspect + where A5 : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().WhereToGroup(out a0, out a1, out a2, out a3, out a4, out a5); + } + public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) where A0 : EcsAspect where A1 : EcsAspect where A2 : EcsAspect @@ -310,7 +426,19 @@ where A4 : EcsAspect where A5 : EcsAspect { - return self.WhereToGroupFor>(sourceGroup); + return group.ToSpan().WhereToGroup(out a0, out a1, out a2, out a3, out a4, out a5); + } + public static EcsReadonlyGroup WhereToGroup(this EcsSpan span, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) + where A0 : EcsAspect + where A1 : EcsAspect + where A2 : EcsAspect + where A3 : EcsAspect + where A4 : EcsAspect + where A5 : EcsAspect + { + var result = span.WhereToGroup(out CombinedAspect combined); + (a0, a1, a2, a3, a4, a5) = combined; + return result; } #endregion } diff --git a/src/Collections/EcsGroup.cs b/src/Collections/EcsGroup.cs index 3a7848d..2d2a281 100644 --- a/src/Collections/EcsGroup.cs +++ b/src/Collections/EcsGroup.cs @@ -144,7 +144,7 @@ namespace DCFApixels.DragonECS } [DebuggerTypeProxy(typeof(DebuggerProxy))] - public unsafe class EcsGroup : IDisposable, IEnumerable + public unsafe class EcsGroup : IDisposable, IEnumerable, IEntitiesCollection { private EcsWorld _source; private int[] _dense; diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index ac98f84..2c485a7 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -6,7 +6,7 @@ using System.Runtime.CompilerServices; namespace DCFApixels.DragonECS { - public abstract partial class EcsWorld + public abstract partial class EcsWorld: IEntitiesCollection { public readonly short id; private IEcsWorldConfig _config; @@ -189,83 +189,16 @@ namespace DCFApixels.DragonECS #endregion #region Where Query - public EcsReadonlyGroup WhereToGroupFor(EcsSpan span, out TAspect aspect) where TAspect : EcsAspect - { - if (_isEnableAutoReleaseDelEntBuffer) - { - ReleaseDelEntityBufferAll(); - } - var executor = GetExecutor>(); - aspect = executor.Aspect; - return executor.ExecuteFor(span); - } - public EcsReadonlyGroup WhereToGroupFor(EcsSpan span) where TAspect : EcsAspect - { - if (_isEnableAutoReleaseDelEntBuffer) - { - ReleaseDelEntityBufferAll(); - } - return GetExecutor>().ExecuteFor(span); - } - public EcsReadonlyGroup WhereToGroup(out TAspect aspect) where TAspect : EcsAspect - { - if (_isEnableAutoReleaseDelEntBuffer) - { - ReleaseDelEntityBufferAll(); - } - var executor = GetExecutor>(); - aspect = executor.Aspect; - return executor.Execute(); - } - public EcsReadonlyGroup WhereToGroup() where TAspect : EcsAspect - { - if (_isEnableAutoReleaseDelEntBuffer) - { - ReleaseDelEntityBufferAll(); - } - return GetExecutor>().Execute(); - } - - public EcsSpan WhereFor(EcsSpan span, out TAspect aspect) where TAspect : EcsAspect - { - if (_isEnableAutoReleaseDelEntBuffer) - { - ReleaseDelEntityBufferAll(); - } - var executor = GetExecutor>(); - aspect = executor.Aspect; - return executor.ExecuteFor(span); - } - public EcsSpan WhereFor(EcsSpan span) where TAspect : EcsAspect - { - if (_isEnableAutoReleaseDelEntBuffer) - { - ReleaseDelEntityBufferAll(); - } - return GetExecutor>().ExecuteFor(span); - } - public EcsSpan Where(out TAspect aspect) where TAspect : EcsAspect - { - if (_isEnableAutoReleaseDelEntBuffer) - { - ReleaseDelEntityBufferAll(); - } - var executor = GetExecutor>(); - aspect = executor.Aspect; - return executor.Execute(); - } - public EcsSpan Where() where TAspect : EcsAspect - { - if (_isEnableAutoReleaseDelEntBuffer) - { - ReleaseDelEntityBufferAll(); - } - return GetExecutor>().Execute(); - } + #endregion #region Entity [MethodImpl(MethodImplOptions.AggressiveInlining)] + public EcsSpan ToSpan() + { + return _allEntites.ToSpan(); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public int NewEntity() { int entityID = _entityDispenser.GetFree(); @@ -424,7 +357,7 @@ namespace DCFApixels.DragonECS } public void ReleaseDelEntityBufferAll() { - ReleaseDelEntityBuffer(-1); + ReleaseDelEntityBuffer(_delEntBufferCount); } public void ReleaseDelEntityBuffer(int count) { @@ -432,15 +365,7 @@ namespace DCFApixels.DragonECS { return; } - - if (count < 0) - { - count = _delEntBufferCount; - } - else if (count > _delEntBufferCount) - { - count = _delEntBufferCount; - } + count = Math.Clamp(count, 0, _delEntBufferCount); _delEntBufferCount -= count; ReadOnlySpan buffser = new ReadOnlySpan(_delEntBuffer, _delEntBufferCount, count); for (int i = 0; i < _poolsCount; i++) @@ -452,7 +377,7 @@ namespace DCFApixels.DragonECS { _entityDispenser.Release(buffser[i]); } - _freeSpace += count;// _entitesCapacity - _entitiesCount; + _freeSpace += count; } #endregion diff --git a/src/Executors/EcsWhereExecutor.cs b/src/Executors/EcsWhereExecutor.cs index df3df19..03e4405 100644 --- a/src/Executors/EcsWhereExecutor.cs +++ b/src/Executors/EcsWhereExecutor.cs @@ -3,66 +3,6 @@ namespace DCFApixels.DragonECS { public sealed class EcsWhereExecutor : EcsQueryExecutor where TAspect : EcsAspect - { - private TAspect _aspect; - private EcsGroup _filteredGroup; - - private long _version; - -#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS - private readonly EcsProfilerMarker _executeMarker = new EcsProfilerMarker("Where"); -#endif - - #region Properties - public TAspect Aspect - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _aspect; - } - public sealed override long Version - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _version; - } - #endregion - - #region OnInitialize/OnDestroy - protected sealed override void OnInitialize() - { - _aspect = World.GetAspect(); - _filteredGroup = EcsGroup.New(World); - } - protected sealed override void OnDestroy() - { - _filteredGroup.Dispose(); - } - #endregion - - #region Methods - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public EcsReadonlyGroup Execute() => ExecuteFor(_aspect.World.Entities); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public EcsReadonlyGroup ExecuteFor(EcsSpan span) - { -#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS - _executeMarker.Begin(); - if (span.IsNull) throw new System.ArgumentNullException();//TODO составить текст исключения. - if (span.WorldID != WorldID) throw new System.ArgumentException();//TODO составить текст исключения. -#endif - unchecked { _version++; } - _aspect.GetIteratorFor(span).CopyTo(_filteredGroup); -#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS - _executeMarker.End(); -#endif - return _filteredGroup.Readonly; - } - #endregion - } - - - - - public sealed class EcsWhereSpanExecutor : EcsQueryExecutor where TAspect : EcsAspect { private TAspect _aspect; private int[] _filteredEntities; diff --git a/src/Executors/EcsWhereToGroupExecutor.cs b/src/Executors/EcsWhereToGroupExecutor.cs new file mode 100644 index 0000000..107151b --- /dev/null +++ b/src/Executors/EcsWhereToGroupExecutor.cs @@ -0,0 +1,61 @@ +using System.Runtime.CompilerServices; + +namespace DCFApixels.DragonECS +{ + public sealed class EcsWhereToGroupExecutor : EcsQueryExecutor where TAspect : EcsAspect + { + private TAspect _aspect; + private EcsGroup _filteredGroup; + + private long _version; + +#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS + private readonly EcsProfilerMarker _executeMarker = new EcsProfilerMarker("Where"); +#endif + + #region Properties + public TAspect Aspect + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _aspect; + } + public sealed override long Version + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _version; + } + #endregion + + #region OnInitialize/OnDestroy + protected sealed override void OnInitialize() + { + _aspect = World.GetAspect(); + _filteredGroup = EcsGroup.New(World); + } + protected sealed override void OnDestroy() + { + _filteredGroup.Dispose(); + } + #endregion + + #region Methods + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public EcsReadonlyGroup Execute() => ExecuteFor(_aspect.World.Entities); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public EcsReadonlyGroup ExecuteFor(EcsSpan span) + { +#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS + _executeMarker.Begin(); + if (span.IsNull) throw new System.ArgumentNullException();//TODO составить текст исключения. + if (span.WorldID != WorldID) throw new System.ArgumentException();//TODO составить текст исключения. +#endif + unchecked { _version++; } + _aspect.GetIteratorFor(span).CopyTo(_filteredGroup); +#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS + _executeMarker.End(); +#endif + return _filteredGroup.Readonly; + } + #endregion + } +} diff --git a/src/Executors/Queries.cs b/src/Executors/Queries.cs new file mode 100644 index 0000000..692f860 --- /dev/null +++ b/src/Executors/Queries.cs @@ -0,0 +1,107 @@ +namespace DCFApixels.DragonECS +{ + public interface IEntitiesCollection + { + EcsSpan ToSpan(); + } + public static class Queries + { + #region Where + public static EcsSpan Where(this TCollection entities, out TAspect aspect) + where TAspect : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().Where(out aspect); + } + public static EcsSpan Where(this EcsReadonlyGroup group, out TAspect aspect) + where TAspect : EcsAspect + { + return group.ToSpan().Where(out aspect); + } + public static EcsSpan Where(this EcsSpan span, out TAspect aspect) + where TAspect : EcsAspect + { + EcsWorld world = span.World; + if (world.IsEnableReleaseDelEntBuffer) + { + world.ReleaseDelEntityBufferAll(); + } + var executor = world.GetExecutor>(); + aspect = executor.Aspect; + return executor.ExecuteFor(span); + } + + + public static EcsSpan Where(this TCollection entities) + where TAspect : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().Where(); + } + public static EcsSpan Where(this EcsReadonlyGroup group) + where TAspect : EcsAspect + { + return group.ToSpan().Where(); + } + public static EcsSpan Where(this EcsSpan span) + where TAspect : EcsAspect + { + EcsWorld world = span.World; + if (world.IsEnableReleaseDelEntBuffer) + { + world.ReleaseDelEntityBufferAll(); + } + return world.GetExecutor>().ExecuteFor(span); + } + #endregion + + #region WhereToGroup + public static EcsReadonlyGroup WhereToGroup(this TCollection entities, out TAspect aspect) + where TAspect : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().WhereToGroup(out aspect); + } + public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group, out TAspect aspect) + where TAspect : EcsAspect + { + return group.ToSpan().WhereToGroup(out aspect); + } + public static EcsReadonlyGroup WhereToGroup(this EcsSpan span, out TAspect aspect) + where TAspect : EcsAspect + { + EcsWorld world = span.World; + if (world.IsEnableReleaseDelEntBuffer) + { + world.ReleaseDelEntityBufferAll(); + } + var executor = world.GetExecutor>(); + aspect = executor.Aspect; + return executor.ExecuteFor(span); + } + + + public static EcsReadonlyGroup WhereToGroup(this TCollection entities) + where TAspect : EcsAspect + where TCollection : IEntitiesCollection + { + return entities.ToSpan().WhereToGroup(); + } + public static EcsReadonlyGroup WhereToGroup(this EcsReadonlyGroup group) + where TAspect : EcsAspect + { + return group.ToSpan().WhereToGroup(); + } + public static EcsReadonlyGroup WhereToGroup(this EcsSpan span) + where TAspect : EcsAspect + { + EcsWorld world = span.World; + if (world.IsEnableReleaseDelEntBuffer) + { + world.ReleaseDelEntityBufferAll(); + } + return world.GetExecutor>().ExecuteFor(span); + } + #endregion + } +}