From 980ed316e139eaecc0483e50f28509328831fbf1 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 9 Feb 2023 02:26:43 +0800 Subject: [PATCH] Update WIP --- src/EcsEntityTableManager.cs | 84 ------ src/EcsEntityTableManager.cs.meta | 11 - src/EcsMember.cs | 253 +++++++++--------- src/EcsPool.cs | 40 ++- src/EcsSession.cs | 4 +- src/EcsWorld.cs | 53 ++-- src/EcsWorldMap.cs | 33 +++ src/Interfaces/IEcsProcessor.cs | 10 +- src/Primitives/Ref.cs | 7 + src/Primitives/ent.cs | 3 +- src/Primitives/mem.cs | 26 +- src/Primitives/tag.cs | 4 +- src/React/WorldFilterAttribute.cs | 6 +- src/TableBuilder.cs | 26 +- src/Utils/entityArraysPool.cs | 13 - src/Utils/entityArraysPool.cs.meta | 11 - .../AutoTableMembers.meta | 0 .../AutoTableMembers}/EcsField.cs | 3 + .../AutoTableMembers}/EcsField.cs.meta | 0 .../AutoTableMembers}/EcsTag.cs | 3 + .../AutoTableMembers}/EcsTag.cs.meta | 0 .../AutoTableMembers}/IEcsTableMember.cs | 1 + .../AutoTableMembers}/IEcsTableMember.cs.meta | 0 23 files changed, 277 insertions(+), 314 deletions(-) delete mode 100644 src/EcsEntityTableManager.cs delete mode 100644 src/EcsEntityTableManager.cs.meta create mode 100644 src/EcsWorldMap.cs create mode 100644 src/Primitives/Ref.cs delete mode 100644 src/Utils/entityArraysPool.cs delete mode 100644 src/Utils/entityArraysPool.cs.meta rename src/TableMembers.meta => tmp/AutoTableMembers.meta (100%) rename {src/TableMembers => tmp/AutoTableMembers}/EcsField.cs (98%) rename {src/TableMembers => tmp/AutoTableMembers}/EcsField.cs.meta (100%) rename {src/TableMembers => tmp/AutoTableMembers}/EcsTag.cs (97%) rename {src/TableMembers => tmp/AutoTableMembers}/EcsTag.cs.meta (100%) rename {src/TableMembers => tmp/AutoTableMembers}/IEcsTableMember.cs (94%) rename {src/TableMembers => tmp/AutoTableMembers}/IEcsTableMember.cs.meta (100%) diff --git a/src/EcsEntityTableManager.cs b/src/EcsEntityTableManager.cs deleted file mode 100644 index 19ed577..0000000 --- a/src/EcsEntityTableManager.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DCFApixels.DragonECS -{ - public class EcsEntityTableManager - { - private int _count; - private IEcsPool[] _fieldPools; - - private int _idIncrement; - private Dictionary _ids; - - public EcsEntityTableManager(int capacity) - { - _fieldPools = new IEcsPool[capacity]; - _ids = new Dictionary(capacity); - _count = 0; - } - - public EcsPool GetFieldPool(int id) - { - if(id < _count) - return (EcsPool)_fieldPools[id]; - - _count++; - if(_fieldPools.Length < _count) - { - Array.Resize(ref _fieldPools, _fieldPools.Length << 1); - } - EcsPool newPool = null;// new EcsFieldPool(7); - _fieldPools[id] = newPool; - return newPool; - } - - public void ResizeFieldPool(int id) - { - } - - - public int GetFieldID(string name, int index) - { - IDKey key = new IDKey(name, index); - if (_ids.TryGetValue(key, out int id)) - return id; - - id = _idIncrement++; - _ids.Add(key, id); - return id; - } - - private struct IDKey - { - public string name; - public int index; - - public IDKey(string name, int index) - { - this.name = name; - this.index = index; - } - - public override bool Equals(object obj) - { - return obj is IDKey key && - name == key.name && - index == key.index; - } - - public override int GetHashCode() - { - return HashCode.Combine(name, index); - } - - public override string ToString() - { - return name + "_" + index; - } - } - } -} diff --git a/src/EcsEntityTableManager.cs.meta b/src/EcsEntityTableManager.cs.meta deleted file mode 100644 index 5215d19..0000000 --- a/src/EcsEntityTableManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f568bc9f583414c4188526dfade20358 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/EcsMember.cs b/src/EcsMember.cs index 50bfe59..b2eaa20 100644 --- a/src/EcsMember.cs +++ b/src/EcsMember.cs @@ -1,151 +1,152 @@ -using System.Collections.Generic; -using System; +using System; +using System.Collections.Generic; using System.Runtime.CompilerServices; -using DCFApixels.DragonECS.Reflection; -namespace DCFApixels.DragonECS +namespace DCFApixels.DragonECS.Reflection { - namespace Reflection + public static class MemberDeclarator { - public static class MemberDeclarator + private static Dictionary _nameMembersPairs = new Dictionary(1024); + private static EcsMemberBase[] _members = new EcsMemberBase[1024]; + private static int _increment = 1; // 0 индекс всегда пустой, так как он используется в mem для обозначения NULL mem + + public static int MembersCount => _increment - 1; + public static EcsMember Declare(string name) + where T : struct { - private static Dictionary _nameMembersPairs = new Dictionary(1024); - private static EcsMemberBase[] _members = new EcsMemberBase[1024]; - private static int _typesCount = 0; - public static EcsMember Declare(string name) - { - name = $"{typeof(T).FullName}__{name}"; + name = $"{typeof(T).FullName}__{name}"; #if DEBUG && !DCFA_ECS_NO_SANITIZE_CHECKS - if (_typesCount < 0) - { - throw new EcsFrameworkException($"Maximum available members exceeded. The member of \"{name}\" was not declared"); - } - if (_nameMembersPairs.ContainsKey(name)) - { - throw new EcsFrameworkException($"The node with the name \"{name}\" has already been declared"); - } -#endif - if (_typesCount >= _members.Length) - { - Array.Resize(ref _members, _members.Length << 1); - } - - EcsMember member = new EcsMember(name, _typesCount); - _nameMembersPairs.Add(name, member); - _members[_typesCount++] = member; - - return member; - } - - public static EcsMember GetOrDeclareMember(string name) + if (_increment < 0) { - if(_nameMembersPairs.TryGetValue(name,out EcsMemberBase memberBase)) - { - return (EcsMember)memberBase; - } - - return Declare(name); + throw new EcsFrameworkException($"Maximum available members exceeded. The member of \"{name}\" was not declared"); } - - public static EcsMember GetMemberInfo(mem member) + if (_nameMembersPairs.ContainsKey(name)) { -#if DEBUG && !DCFA_ECS_NO_SANITIZE_CHECKS - if (member.HasValue == false) - { - throw new ArgumentException($"The mem<{typeof(T).Name}> argument is empty"); - } -#endif - - return (EcsMember)_members[member.UniqueID]; + throw new EcsFrameworkException($"The node with the name \"{name}\" has already been declared"); } +#endif + if (_increment >= _members.Length) + { + Array.Resize(ref _members, _members.Length << 1); + } + + EcsMember member = new EcsMember(name, _increment); + _nameMembersPairs.Add(name, member); + _members[_increment++] = member; + + return member; } - public abstract class EcsMemberBase : IEquatable + public static EcsMember GetOrDeclareMember(string name) + where T : struct { - protected const string TO_STRING_HEADER = "EcsMember:"; - - protected string _name; - protected int _uniqueID; - protected Type _type; - - #region Propertiees - public int UniqueID + if (_nameMembersPairs.TryGetValue(name, out EcsMemberBase memberBase)) { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => _uniqueID; + return (EcsMember)memberBase; } - #endregion - #region GetHashCode/ToString - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override int GetHashCode() => _uniqueID; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override string ToString() => TO_STRING_HEADER + _name; - - #endregion - - #region Equals - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override bool Equals(object obj) - { - return obj is EcsMemberBase key && _name == key._name; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(EcsMemberBase other) - { - return _uniqueID == other._uniqueID; - } - #endregion - - #region operators - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool operator ==(in EcsMemberBase left, in EcsMemberBase right) => left.Equals(right); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool operator !=(in EcsMemberBase left, in EcsMemberBase right) => !left.Equals(right); - #endregion + return Declare(name); } - public class EcsMember : EcsMemberBase, IEquatable> + + public static EcsMember GetMemberInfo(mem member) + where T : struct { - #region Constructors - private EcsMember() { } - internal EcsMember(string name, int uniqueID) +#if DEBUG && !DCFA_ECS_NO_SANITIZE_CHECKS + if (member.HasValue == false) { - _name = name; - _uniqueID = uniqueID; - _type = typeof(T); + throw new ArgumentException($"The mem<{typeof(T).Name}> argument is empty"); } - #endregion +#endif - #region Equals - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override bool Equals(object obj) => obj is EcsMember key && _uniqueID == key._uniqueID; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(EcsMember other) => _uniqueID == other._uniqueID; - #endregion - - #region GetHashCode/ToString - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override int GetHashCode() => _uniqueID; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override string ToString() => TO_STRING_HEADER + _name; - - #endregion - - #region operators - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool operator ==(in EcsMember left, in EcsMember right) => left.Equals(right); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool operator !=(in EcsMember left, in EcsMember right) => !left.Equals(right); - - - //[MethodImpl(MethodImplOptions.AggressiveInlining)] - //public static implicit operator EcsMember(string name) => MemberDeclarator.Declare(name); - #endregion + return (EcsMember)_members[member.uniqueID]; } } + public abstract class EcsMemberBase : IEquatable + { + protected const string TO_STRING_HEADER = "EcsMember:"; + + protected string _name; + protected int _uniqueID; + protected Type _type; + + #region Propertiees + public int UniqueID + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _uniqueID; + } + #endregion + + #region GetHashCode/ToString + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override int GetHashCode() => _uniqueID; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override string ToString() => TO_STRING_HEADER + _name; + + #endregion + + #region Equals + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override bool Equals(object obj) + { + return obj is EcsMemberBase key && _name == key._name; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(EcsMemberBase other) + { + return _uniqueID == other._uniqueID; + } + #endregion + + #region operators + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(in EcsMemberBase left, in EcsMemberBase right) => left.Equals(right); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(in EcsMemberBase left, in EcsMemberBase right) => !left.Equals(right); + #endregion + } + public class EcsMember : EcsMemberBase, IEquatable> + where T : struct + { + #region Constructors + private EcsMember() { } + internal EcsMember(string name, int uniqueID) + { + _name = name; + _uniqueID = uniqueID; + _type = typeof(T); + } + #endregion + + #region Equals + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override bool Equals(object obj) => obj is EcsMember key && _uniqueID == key._uniqueID; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(EcsMember other) => _uniqueID == other._uniqueID; + #endregion + + #region GetHashCode/ToString + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override int GetHashCode() => _uniqueID; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override string ToString() => TO_STRING_HEADER + _name; + + #endregion + + #region operators + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(in EcsMember left, in EcsMember right) => left.Equals(right); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(in EcsMember left, in EcsMember right) => !left.Equals(right); + + + //[MethodImpl(MethodImplOptions.AggressiveInlining)] + //public static implicit operator EcsMember(string name) => MemberDeclarator.Declare(name); + #endregion + } } \ No newline at end of file diff --git a/src/EcsPool.cs b/src/EcsPool.cs index 0860f22..b38f277 100644 --- a/src/EcsPool.cs +++ b/src/EcsPool.cs @@ -4,6 +4,8 @@ using DCFApixels.DragonECS.Reflection; using System.Runtime.CompilerServices; using UnityEngine; using System; +using System.Reflection; +using System.Linq; namespace DCFApixels.DragonECS { @@ -12,12 +14,14 @@ namespace DCFApixels.DragonECS public EcsWorld World { get; } public int ID { get; } public EcsMemberBase Type { get; } + public bool IsTagsPool { get; } public bool Has(int index); public void Add(int index); public void Del(int index); } public class EcsPool : IEcsPool + where T : struct { private int _id; private readonly EcsWorld _source; @@ -25,25 +29,40 @@ namespace DCFApixels.DragonECS private readonly SparseSet _sparseSet; private T[] _denseItems; + private int _isTagsPoolMask; + #region Properites public EcsWorld World => _source; - public int ID => _id; public EcsMemberBase Type => _type; + + public int ID + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _id; + } + public bool IsTagsPool + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _isTagsPoolMask < 0; + } + public ref T this[int index] { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => ref _denseItems[_sparseSet[index]]; + get => ref _denseItems[_sparseSet[index] | _isTagsPoolMask]; } - #endregion #region Constructors - public EcsPool(EcsWorld source, EcsMember type, int capacity) + public EcsPool(EcsWorld source, mem type, int capacity) { _source = source; - _type = type; - _denseItems = new T[capacity]; + _type = MemberDeclarator.GetMemberInfo(type); _sparseSet = new SparseSet(capacity); + + _isTagsPoolMask = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Length <= 0 ? -1 : 0; + + _denseItems = IsTagsPool ? new T[1] : new T[capacity]; } #endregion @@ -52,8 +71,12 @@ namespace DCFApixels.DragonECS public ref T Add(int index) { _sparseSet.Add(index); - _sparseSet.Normalize(ref _denseItems); - return ref _denseItems[_sparseSet.IndexOf(index)]; + if(IsTagsPool) + { + _sparseSet.Normalize(ref _denseItems); + return ref _denseItems[_sparseSet.IndexOf(index)]; + } + return ref _denseItems[0]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -65,6 +88,7 @@ namespace DCFApixels.DragonECS [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Del(int index) { + if (!IsTagsPool) { this[index] = default; } _sparseSet.Remove(index); } #endregion diff --git a/src/EcsSession.cs b/src/EcsSession.cs index d6f97e6..ec0127e 100644 --- a/src/EcsSession.cs +++ b/src/EcsSession.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace DCFApixels.DragonECS { @@ -20,6 +18,8 @@ namespace DCFApixels.DragonECS private Dictionary _worldsDict = new Dictionary(); private List _worlds = new List(); + + private Dictionary _runners; private Dictionary _messengers; private EcsProcessorsRunner<_Run> _runRunnerCache; diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 59e618c..1b8366a 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -14,25 +14,28 @@ namespace DCFApixels.DragonECS private byte _id = DEAD_WORLD_ID; - private Dictionary _pools; + private IEcsPool[] _pools; + private SparseSet _memToPoolIDSet; + + private SparseSet _entities = new SparseSet(); private short[] _gens; private List[] _filtersByIncludedComponents; private List[] _filtersByExcludedComponents; - //private Dictionary _tables; - #region Properties public int ID => _id; public bool IsAlive => _id != DEAD_WORLD_ID; + public bool IsEmpty => _entities.Count < 0; #endregion #region Constructors public EcsWorld() { - _pools = new Dictionary(); + _pools = new IEcsPool[512]; _entities = new SparseSet(); + _memToPoolIDSet = new SparseSet(512); } #endregion @@ -45,14 +48,16 @@ namespace DCFApixels.DragonECS #region GetPool public EcsPool GetPool(mem member) + where T : struct { - Type type = typeof(T); + if(_memToPoolIDSet.Contains(member.uniqueID)) + if (_pools.TryGetValue(type, out IEcsPool pool)) { return (EcsPool)pool; } - //pool = new EcsPool(); + pool = new EcsPool(this, member, 512);//TODO сделать чтоб объем можно было указывать через конфиг _pools.Add(type, pool); return (EcsPool)pool; } @@ -92,11 +97,11 @@ namespace DCFApixels.DragonECS public class Mask { private readonly EcsWorld _world; - internal int[] Include; - internal int[] Exclude; - internal int IncludeCount; - internal int ExcludeCount; - internal int Hash; + internal int[] include; + internal int[] exclude; + internal int includeCount; + internal int excludeCount; + internal int hash; #if DEBUG && !DCFAECS_NO_SANITIZE_CHECKS bool _built; #endif @@ -104,17 +109,17 @@ namespace DCFApixels.DragonECS internal Mask(EcsWorld world) { _world = world; - Include = new int[8]; - Exclude = new int[2]; + include = new int[8]; + exclude = new int[2]; Reset(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] void Reset() { - IncludeCount = 0; - ExcludeCount = 0; - Hash = 0; + includeCount = 0; + excludeCount = 0; + hash = 0; #if DEBUG && !DCFAECS_NO_SANITIZE_CHECKS _built = false; #endif @@ -126,11 +131,11 @@ namespace DCFApixels.DragonECS var poolId = _world.GetPool(member).ID; #if DEBUG && !DCFAECS_NO_SANITIZE_CHECKS if (_built) { throw new Exception("Cant change built mask."); } - if (Array.IndexOf(Include, poolId, 0, IncludeCount) != -1) { throw new Exception($"{typeof(T).Name} already in constraints list."); } - if (Array.IndexOf(Exclude, poolId, 0, ExcludeCount) != -1) { throw new Exception($"{typeof(T).Name} already in constraints list."); } + if (Array.IndexOf(include, poolId, 0, includeCount) != -1) { throw new Exception($"{typeof(T).Name} already in constraints list."); } + if (Array.IndexOf(exclude, poolId, 0, excludeCount) != -1) { throw new Exception($"{typeof(T).Name} already in constraints list."); } #endif - if (IncludeCount == Include.Length) { Array.Resize(ref Include, IncludeCount << 1); } - Include[IncludeCount++] = poolId; + if (includeCount == include.Length) { Array.Resize(ref include, includeCount << 1); } + include[includeCount++] = poolId; return this; } @@ -140,11 +145,11 @@ namespace DCFApixels.DragonECS var poolId = _world.GetPool(member).ID; #if DEBUG && !DCFAECS_NO_SANITIZE_CHECKS if (_built) { throw new Exception("Cant change built mask."); } - if (Array.IndexOf(Include, poolId, 0, IncludeCount) != -1) { throw new Exception($"{typeof(T).Name} already in constraints list."); } - if (Array.IndexOf(Exclude, poolId, 0, ExcludeCount) != -1) { throw new Exception($"{typeof(T).Name} already in constraints list."); } + if (Array.IndexOf(include, poolId, 0, includeCount) != -1) { throw new Exception($"{typeof(T).Name} already in constraints list."); } + if (Array.IndexOf(exclude, poolId, 0, excludeCount) != -1) { throw new Exception($"{typeof(T).Name} already in constraints list."); } #endif - if (ExcludeCount == Exclude.Length) { Array.Resize(ref Exclude, ExcludeCount << 1); } - Exclude[ExcludeCount++] = poolId; + if (excludeCount == exclude.Length) { Array.Resize(ref exclude, excludeCount << 1); } + exclude[excludeCount++] = poolId; return this; } } diff --git a/src/EcsWorldMap.cs b/src/EcsWorldMap.cs new file mode 100644 index 0000000..3f6791d --- /dev/null +++ b/src/EcsWorldMap.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace DCFApixels.DragonECS +{ + public class EcsWorldMap + { + private EcsWorld[] _worlds = new EcsWorld[8]; + private SparseSet _sparceSet = new SparseSet(8); + + public EcsWorld this[int index] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _worlds[index]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void InsertWorld(EcsWorld world) + { + + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void RemoveWorld(EcsWorld world) + { + + } + } +} diff --git a/src/Interfaces/IEcsProcessor.cs b/src/Interfaces/IEcsProcessor.cs index e51f653..47d2efb 100644 --- a/src/Interfaces/IEcsProcessor.cs +++ b/src/Interfaces/IEcsProcessor.cs @@ -30,8 +30,16 @@ { this.entity = entity; } - } + public readonly struct _OnNewEntityGenRecycled : IEcsMessage + { + public readonly ent entity; + public _OnNewEntityGenRecycled(ent entity) + { + this.entity = entity; + } + } + public interface IEcsDoMessege : IEcsProcessor where TMessage : IEcsMessage { diff --git a/src/Primitives/Ref.cs b/src/Primitives/Ref.cs new file mode 100644 index 0000000..c58a59d --- /dev/null +++ b/src/Primitives/Ref.cs @@ -0,0 +1,7 @@ +namespace DCFApixels.DragonECS +{ + public readonly struct Ref where T : class + { + public readonly T target; + } +} diff --git a/src/Primitives/ent.cs b/src/Primitives/ent.cs index b2de580..07b1502 100644 --- a/src/Primitives/ent.cs +++ b/src/Primitives/ent.cs @@ -30,11 +30,10 @@ namespace DCFApixels.DragonECS get => (short)((_full << 32) >> 48); } - // 255 = однозначно указывает что сущьность мертва или NULL // но чтобы значене default было NULL сульностью, мир хранится в виде ID + 1 [EditorBrowsable(EditorBrowsableState.Never)] - public byte world + public byte world { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => (byte)(((_full << 48) >> 56) - 1); diff --git a/src/Primitives/mem.cs b/src/Primitives/mem.cs index 4261c8b..bf0a35e 100644 --- a/src/Primitives/mem.cs +++ b/src/Primitives/mem.cs @@ -5,43 +5,37 @@ using DCFApixels.DragonECS.Reflection; namespace DCFApixels.DragonECS { public readonly struct mem : IEquatable>, IEquatable + where T : struct { - public static readonly mem NULL = new mem(-1); + public static readonly mem NULL = default; - internal readonly int offsetedUniqueID; + internal readonly int uniqueID; #region Properties - public int UniqueID - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => offsetedUniqueID - 1; - } public bool HasValue { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => offsetedUniqueID != 0; + get => uniqueID != 0; } #endregion #region Constructors - private mem(int uniqueID) - { - offsetedUniqueID = uniqueID + 1; - } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private mem(int uniqueID) => this.uniqueID = uniqueID; #endregion #region Equals [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override bool Equals(object obj) => obj is mem key && offsetedUniqueID == key.offsetedUniqueID; + public override bool Equals(object obj) => obj is mem key && uniqueID == key.uniqueID; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(mem other) => offsetedUniqueID == other.offsetedUniqueID; + public bool Equals(mem other) => uniqueID == other.uniqueID; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(int other) => offsetedUniqueID == (other + 1); + public bool Equals(int other) => uniqueID == other; #endregion #region GetHashCode/ToString [MethodImpl(MethodImplOptions.AggressiveInlining)] - public override int GetHashCode() => offsetedUniqueID - 1; + public override int GetHashCode() => uniqueID; [MethodImpl(MethodImplOptions.AggressiveInlining)] public override string ToString() => HasValue ? MemberDeclarator.GetMemberInfo(this).ToString() : "NULL"; diff --git a/src/Primitives/tag.cs b/src/Primitives/tag.cs index 52e70e5..b908fe3 100644 --- a/src/Primitives/tag.cs +++ b/src/Primitives/tag.cs @@ -1,4 +1,6 @@ -namespace DCFApixels.DragonECS +using System; + +namespace DCFApixels.DragonECS { public struct tag { } } diff --git a/src/React/WorldFilterAttribute.cs b/src/React/WorldFilterAttribute.cs index 208423e..c4a0358 100644 --- a/src/React/WorldFilterAttribute.cs +++ b/src/React/WorldFilterAttribute.cs @@ -1,13 +1,9 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace DCFApixels.Assets.DragonECS.src.React { [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] - sealed class WorldFilterAttribute : Attribute + sealed class WorldFilterAttribute : Attribute //TODO { public readonly string[] worlds; diff --git a/src/TableBuilder.cs b/src/TableBuilder.cs index 17f48cf..0b97d80 100644 --- a/src/TableBuilder.cs +++ b/src/TableBuilder.cs @@ -1,26 +1,32 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DCFApixels.DragonECS +namespace DCFApixels.DragonECS { public readonly ref struct TableBuilder { private readonly EcsWorld _world; + private readonly EcsWorld.Mask _mask; + + public TableBuilder(EcsWorld world, EcsWorld.Mask mask) + { + _world = world; + _mask = mask; + } public EcsPool Cache(mem member) + where T : struct { - throw new NotImplementedException(); + return _world.GetPool(member); } public EcsPool Inc(mem member) + where T : struct { - throw new NotImplementedException(); + _mask.Inc(member); + return _world.GetPool(member); } public EcsPool Exc(mem member) + where T : struct { - throw new NotImplementedException(); + _mask.Exc(member); + return _world.GetPool(member); } } } diff --git a/src/Utils/entityArraysPool.cs b/src/Utils/entityArraysPool.cs deleted file mode 100644 index 61bae7d..0000000 --- a/src/Utils/entityArraysPool.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DCFApixels.DragonECS -{ - public class EntityArraysPool - { - //public int[] - } -} diff --git a/src/Utils/entityArraysPool.cs.meta b/src/Utils/entityArraysPool.cs.meta deleted file mode 100644 index a1657c2..0000000 --- a/src/Utils/entityArraysPool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 50cf3219cac6cc84faf71a80230f8539 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/TableMembers.meta b/tmp/AutoTableMembers.meta similarity index 100% rename from src/TableMembers.meta rename to tmp/AutoTableMembers.meta diff --git a/src/TableMembers/EcsField.cs b/tmp/AutoTableMembers/EcsField.cs similarity index 98% rename from src/TableMembers/EcsField.cs rename to tmp/AutoTableMembers/EcsField.cs index b3be60d..2abdf7b 100644 --- a/src/TableMembers/EcsField.cs +++ b/tmp/AutoTableMembers/EcsField.cs @@ -6,6 +6,7 @@ using System.Runtime.CompilerServices; namespace DCFApixels.DragonECS { public readonly struct EcsField : IEcsMemberCachePool, T> + where T :struct { private readonly EcsPool _pool; private readonly int _poolID; @@ -57,6 +58,7 @@ namespace DCFApixels.DragonECS } public readonly struct EcsIncField : IEcsMemberCachePool, T> + where T :struct { private readonly EcsPool _pool; private readonly int _poolID; @@ -98,6 +100,7 @@ namespace DCFApixels.DragonECS } public struct EcsExcField : IEcsMemberCachePool, T> + where T :struct { private readonly EcsPool _pool; private readonly int _poolID; diff --git a/src/TableMembers/EcsField.cs.meta b/tmp/AutoTableMembers/EcsField.cs.meta similarity index 100% rename from src/TableMembers/EcsField.cs.meta rename to tmp/AutoTableMembers/EcsField.cs.meta diff --git a/src/TableMembers/EcsTag.cs b/tmp/AutoTableMembers/EcsTag.cs similarity index 97% rename from src/TableMembers/EcsTag.cs rename to tmp/AutoTableMembers/EcsTag.cs index 0f8df7c..34e8e5e 100644 --- a/src/TableMembers/EcsTag.cs +++ b/tmp/AutoTableMembers/EcsTag.cs @@ -6,6 +6,7 @@ using System.Runtime.CompilerServices; namespace DCFApixels.DragonECS { public readonly struct EcsTag : IEcsMemberCachePool + where T :struct { private readonly EcsPool _pool; private readonly int _poolID; @@ -38,6 +39,7 @@ namespace DCFApixels.DragonECS } } public readonly struct EcsIncTag : IEcsMemberCachePool + where T :struct { private readonly EcsPool _pool; private readonly int _poolID; @@ -65,6 +67,7 @@ namespace DCFApixels.DragonECS } } public readonly struct EcsExcTag : IEcsMemberCachePool + where T :struct { private readonly EcsPool _pool; private readonly int _poolID; diff --git a/src/TableMembers/EcsTag.cs.meta b/tmp/AutoTableMembers/EcsTag.cs.meta similarity index 100% rename from src/TableMembers/EcsTag.cs.meta rename to tmp/AutoTableMembers/EcsTag.cs.meta diff --git a/src/TableMembers/IEcsTableMember.cs b/tmp/AutoTableMembers/IEcsTableMember.cs similarity index 94% rename from src/TableMembers/IEcsTableMember.cs rename to tmp/AutoTableMembers/IEcsTableMember.cs index 55c21d6..0e0077d 100644 --- a/src/TableMembers/IEcsTableMember.cs +++ b/tmp/AutoTableMembers/IEcsTableMember.cs @@ -9,6 +9,7 @@ namespace DCFApixels.DragonECS } public interface IEcsMemberCachePool : IEcsTableMember where TSelf: struct, IEcsTableMember + where T :struct { public EcsPool Pool { get; } public void Inject(out TSelf self, EcsPool pool); diff --git a/src/TableMembers/IEcsTableMember.cs.meta b/tmp/AutoTableMembers/IEcsTableMember.cs.meta similarity index 100% rename from src/TableMembers/IEcsTableMember.cs.meta rename to tmp/AutoTableMembers/IEcsTableMember.cs.meta