From 8c612aa94994f13f8f5511c58966fc62f30cf846 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 1 Jun 2023 20:14:34 +0800 Subject: [PATCH] update EcsGroup --- src/EcsGroup.cs | 30 ++++++++++++++++++++++++------ src/EcsWorld.cs | 4 ++-- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/EcsGroup.cs b/src/EcsGroup.cs index 1a05b0c..8a02fcd 100644 --- a/src/EcsGroup.cs +++ b/src/EcsGroup.cs @@ -161,7 +161,7 @@ namespace DCFApixels.DragonECS [MethodImpl(MethodImplOptions.AggressiveInlining)] public static EcsGroup New(EcsWorld world) { - return world.GetGroupFromPool(); + return world.GetFreeGroup(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal EcsGroup(EcsWorld world, int denseCapacity = 64) @@ -259,7 +259,7 @@ namespace DCFApixels.DragonECS } public EcsGroup Clone() { - EcsGroup result = _source.GetGroupFromPool(); + EcsGroup result = _source.GetFreeGroup(); result.CopyFrom(this); return result; } @@ -350,6 +350,14 @@ namespace DCFApixels.DragonECS else AddInternal(item); } + public void Inverse() + { + foreach (var item in _source.Entities) + if (Has(item)) + RemoveInternal(item); + else + AddInternal(item); + } #endregion #region Static Set operations @@ -360,7 +368,7 @@ namespace DCFApixels.DragonECS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS if (a._source != b._source) ThrowArgumentDifferentWorldsException(); #endif - EcsGroup result = a._source.GetGroupFromPool(); + EcsGroup result = a._source.GetFreeGroup(); foreach (var item in a) result.AddInternal(item); foreach (var item in b) @@ -374,7 +382,7 @@ namespace DCFApixels.DragonECS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS if (a._source != b._source) ThrowArgumentDifferentWorldsException(); #endif - EcsGroup result = a._source.GetGroupFromPool(); + EcsGroup result = a._source.GetFreeGroup(); foreach (var item in a) if (!b.Has(item)) result.AddInternal(item); @@ -387,7 +395,7 @@ namespace DCFApixels.DragonECS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS if (a._source != b._source) ThrowArgumentDifferentWorldsException(); #endif - EcsGroup result = a._source.GetGroupFromPool(); + EcsGroup result = a._source.GetFreeGroup(); foreach (var item in a) if (b.Has(item)) result.AddInternal(item); @@ -401,7 +409,7 @@ namespace DCFApixels.DragonECS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS if (a._source != b._source) ThrowArgumentDifferentWorldsException(); #endif - EcsGroup result = a._source.GetGroupFromPool(); + EcsGroup result = a._source.GetFreeGroup(); foreach (var item in a) if (!b.Has(item)) result.AddInternal(item); @@ -410,6 +418,15 @@ namespace DCFApixels.DragonECS result.AddInternal(item); return result; } + + public static EcsGroup Inverse(EcsGroup a) + { + EcsGroup result = a._source.GetFreeGroup(); + foreach (var item in a._source.Entities) + if (!a.Has(item)) + result.AddInternal(item); + return result; + } #endregion #region Enumerator @@ -545,6 +562,7 @@ namespace DCFApixels.DragonECS public int CapacityDense => _group.CapacityDense; public int CapacitySparce => _group.CapacitySparce; + public override string ToString() => _group.ToString(); public DebuggerProxy(EcsGroup group) => _group = group; } #endregion diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index ef9ec9d..20433dd 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -83,7 +83,7 @@ namespace DCFApixels.DragonECS _delEntBuffer = new int[_entitesCapacity >> DEL_ENT_BUFFER_SIZE_OFFSET]; _groups = new List>(); - _allEntites = GetGroupFromPool(); + _allEntites = GetFreeGroup(); _subjects = new EcsSubject[128]; _executors = new EcsQueryExecutor[128]; @@ -337,7 +337,7 @@ namespace DCFApixels.DragonECS { _groups.Add(new WeakReference(group)); } - internal EcsGroup GetGroupFromPool() + internal EcsGroup GetFreeGroup() { EcsGroup result = _groupsPool.Count <= 0 ? new EcsGroup(this) : _groupsPool.Pop(); result._isReleased = false;