diff --git a/src/Builtin/DestroyProcessor.cs b/src/Builtin/DestroyProcessor.cs index d4a1080..c359186 100644 --- a/src/Builtin/DestroyProcessor.cs +++ b/src/Builtin/DestroyProcessor.cs @@ -10,6 +10,13 @@ public class DestroyedTable : EcsTable { - private EcsIncTag _destroyedTag; + public readonly EcsPool isDestroyed; + + public static mem isDestroyedMem = "isDestroyed"; + + public DestroyedTable(ref TableBuilder builder) : base(ref builder) + { + isDestroyed = builder.Inc(isDestroyedMem); + } } } diff --git a/src/Utils/EcsMember.cs b/src/EcsMember.cs similarity index 82% rename from src/Utils/EcsMember.cs rename to src/EcsMember.cs index ee518f3..50bfe59 100644 --- a/src/Utils/EcsMember.cs +++ b/src/EcsMember.cs @@ -9,10 +9,8 @@ namespace DCFApixels.DragonECS { public static class MemberDeclarator { -#if !DCFA_ECS_NO_SANITIZE_CHECKS - private static HashSet _usedNames = new HashSet(1024); -#endif - private static EcsMemberBase[] _member = new EcsMemberBase[1024]; + 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) { @@ -22,33 +20,43 @@ namespace DCFApixels.DragonECS { throw new EcsFrameworkException($"Maximum available members exceeded. The member of \"{name}\" was not declared"); } - if (_usedNames.Contains(name)) + if (_nameMembersPairs.ContainsKey(name)) { throw new EcsFrameworkException($"The node with the name \"{name}\" has already been declared"); } - _usedNames.Add(name); #endif - if (_typesCount >= _member.Length) + if (_typesCount >= _members.Length) { - Array.Resize(ref _member, _member.Length << 1); + Array.Resize(ref _members, _members.Length << 1); } EcsMember member = new EcsMember(name, _typesCount); - _member[_typesCount++] = member; + _nameMembersPairs.Add(name, member); + _members[_typesCount++] = member; return member; } + public static EcsMember GetOrDeclareMember(string name) + { + if(_nameMembersPairs.TryGetValue(name,out EcsMemberBase memberBase)) + { + return (EcsMember)memberBase; + } + + return Declare(name); + } + public static EcsMember GetMemberInfo(mem member) { #if DEBUG && !DCFA_ECS_NO_SANITIZE_CHECKS if (member.HasValue == false) { - throw new ArgumentException($"The member argument is empty"); + throw new ArgumentException($"The mem<{typeof(T).Name}> argument is empty"); } #endif - return (EcsMember)_member[member.UniqueID]; + return (EcsMember)_members[member.UniqueID]; } } diff --git a/src/Utils/EcsMember.cs.meta b/src/EcsMember.cs.meta similarity index 100% rename from src/Utils/EcsMember.cs.meta rename to src/EcsMember.cs.meta diff --git a/src/EcsPool.cs b/src/EcsPool.cs index fc71b96..0860f22 100644 --- a/src/EcsPool.cs +++ b/src/EcsPool.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using DCFApixels.DragonECS.Reflection; using System.Runtime.CompilerServices; using UnityEngine; +using System; namespace DCFApixels.DragonECS { @@ -74,5 +75,13 @@ namespace DCFApixels.DragonECS Add(index); } #endregion + + #region Equals/GetHashCode + public override bool Equals(object obj) + { + return base.Equals(obj); + } + public override int GetHashCode() => _type.GetHashCode(); + #endregion } } diff --git a/src/EcsTable.cs b/src/EcsTable.cs index 603a011..c8a52f9 100644 --- a/src/EcsTable.cs +++ b/src/EcsTable.cs @@ -8,7 +8,7 @@ namespace DCFApixels.DragonECS { internal EcsFilter _filter; - public EcsTable(ref TableBuilder tableBuilder) { } + public EcsTable(ref TableBuilder builder) { } public EcsFilter Filter { diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 80407da..59e618c 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -77,13 +77,13 @@ namespace DCFApixels.DragonECS } #endregion - internal void OnEntityFieldAdd(int entityID, mem chaangedField) + internal void OnEntityFieldAdd(int entityID, int changedPool) { } - internal void OnEntityFieldDel(int entityID, EcsMember chaangedField) + internal void OnEntityFieldDel(int entityID, int changedPool) { } @@ -97,7 +97,7 @@ namespace DCFApixels.DragonECS internal int IncludeCount; internal int ExcludeCount; internal int Hash; -#if DEBUG && !LEOECSLITE_NO_SANITIZE_CHECKS +#if DEBUG && !DCFAECS_NO_SANITIZE_CHECKS bool _built; #endif @@ -115,16 +115,16 @@ namespace DCFApixels.DragonECS IncludeCount = 0; ExcludeCount = 0; Hash = 0; -#if DEBUG && !LEOECSLITE_NO_SANITIZE_CHECKS +#if DEBUG && !DCFAECS_NO_SANITIZE_CHECKS _built = false; #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Mask Inc(EcsMember member) where T : struct + public Mask Inc(mem member) where T : struct { - var poolId = _world.GetPool().GetId(); -#if DEBUG && !LEOECSLITE_NO_SANITIZE_CHECKS + 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."); } @@ -134,14 +134,11 @@ namespace DCFApixels.DragonECS return this; } -#if UNITY_2020_3_OR_NEWER - [UnityEngine.Scripting.Preserve] -#endif [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Mask Exc(EcsMember member) where T : struct + public Mask Exc(mem member) where T : struct { - var poolId = _world.GetPool().GetId(); -#if DEBUG && !LEOECSLITE_NO_SANITIZE_CHECKS + 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."); } diff --git a/src/INFO.txt b/src/INFO.txt index 67f0469..a6001cd 100644 --- a/src/INFO.txt +++ b/src/INFO.txt @@ -1,2 +1,3 @@ Мервтый мир - значение byte 255, зарезервированный адишник мира, все что ссылается на мертвый мир считается так же мертвым. +DCFAECS_NO_SANITIZE_CHECKS - отвключение дополнительных проверок \ No newline at end of file diff --git a/src/Primitives/mem.cs b/src/Primitives/mem.cs index 3d4c8d0..4261c8b 100644 --- a/src/Primitives/mem.cs +++ b/src/Primitives/mem.cs @@ -56,7 +56,7 @@ namespace DCFApixels.DragonECS public static bool operator !=(in mem left, in mem right) => !left.Equals(right); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator mem(string name) => new mem(MemberDeclarator.Declare(name).UniqueID); + public static implicit operator mem(string name) => new mem(MemberDeclarator.GetOrDeclareMember(name).UniqueID); #endregion } } diff --git a/src/TableBuilder.cs b/src/TableBuilder.cs index 3cb3682..17f48cf 100644 --- a/src/TableBuilder.cs +++ b/src/TableBuilder.cs @@ -12,15 +12,15 @@ namespace DCFApixels.DragonECS public EcsPool Cache(mem member) { - + throw new NotImplementedException(); } public EcsPool Inc(mem member) { - + throw new NotImplementedException(); } public EcsPool Exc(mem member) { - + throw new NotImplementedException(); } } }