From 2c6fac98fbdefb49cdb8c4065ceb79d3954c947b Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 6 Feb 2023 01:27:32 +0800 Subject: [PATCH] Update WIP, add table members --- DragonECS.asmdef | 2 +- src/EcsField.cs | 17 --- src/EcsFieldPool.cs | 13 ++- src/EcsTableCore.cs | 68 ++++++++++++ ...tityTable.cs.meta => EcsTableCore.cs.meta} | 0 src/EcsWorld.cs | 2 +- .../IEcsTable.cs} | 6 +- src/Interfaces/IEcsTable.cs.meta | 11 ++ src/TableMembers.meta | 8 ++ src/TableMembers/EcsField.cs | 103 ++++++++++++++++++ src/{ => TableMembers}/EcsField.cs.meta | 2 +- src/TableMembers/EcsTag.cs | 66 +++++++++++ src/TableMembers/EcsTag.cs.meta | 11 ++ src/TableMembers/IEcsTableMember.cs | 16 +++ src/TableMembers/IEcsTableMember.cs.meta | 11 ++ src/ent.cs | 35 +++--- 16 files changed, 327 insertions(+), 44 deletions(-) delete mode 100644 src/EcsField.cs create mode 100644 src/EcsTableCore.cs rename src/{EcsEntityTable.cs.meta => EcsTableCore.cs.meta} (100%) rename src/{EcsEntityTable.cs => Interfaces/IEcsTable.cs} (76%) create mode 100644 src/Interfaces/IEcsTable.cs.meta create mode 100644 src/TableMembers.meta create mode 100644 src/TableMembers/EcsField.cs rename src/{ => TableMembers}/EcsField.cs.meta (83%) create mode 100644 src/TableMembers/EcsTag.cs create mode 100644 src/TableMembers/EcsTag.cs.meta create mode 100644 src/TableMembers/IEcsTableMember.cs create mode 100644 src/TableMembers/IEcsTableMember.cs.meta diff --git a/DragonECS.asmdef b/DragonECS.asmdef index 9685236..1dc8e8b 100644 --- a/DragonECS.asmdef +++ b/DragonECS.asmdef @@ -4,7 +4,7 @@ "references": [], "includePlatforms": [], "excludePlatforms": [], - "allowUnsafeCode": false, + "allowUnsafeCode": true, "overrideReferences": false, "precompiledReferences": [], "autoReferenced": true, diff --git a/src/EcsField.cs b/src/EcsField.cs deleted file mode 100644 index 99b4423..0000000 --- a/src/EcsField.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DCFApixels.DragonECS -{ - public struct EcsField - { - private EcsFieldPool _pool; - public ref T this[int index] - { - get => ref _pool[index]; - } - } -} diff --git a/src/EcsFieldPool.cs b/src/EcsFieldPool.cs index 8cda7a8..d0d3881 100644 --- a/src/EcsFieldPool.cs +++ b/src/EcsFieldPool.cs @@ -12,14 +12,11 @@ namespace DCFApixels.DragonECS } public class EcsFieldPool : IEcsFieldPool { + private int _id; private SparseSet _sparseSet; private T[] _denseItems; - public EcsFieldPool(int capacity) - { - _denseItems = new T[capacity]; - _sparseSet = new SparseSet(capacity); - } + public int ID => _id; public ref T this[int index] { @@ -27,6 +24,12 @@ namespace DCFApixels.DragonECS get => ref _denseItems[_sparseSet[index]]; } + public EcsFieldPool(int capacity) + { + _denseItems = new T[capacity]; + _sparseSet = new SparseSet(capacity); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public ref T Add(int index) { diff --git a/src/EcsTableCore.cs b/src/EcsTableCore.cs new file mode 100644 index 0000000..6373008 --- /dev/null +++ b/src/EcsTableCore.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace DCFApixels.DragonECS +{ + public abstract class EcsTableCore + { + internal EcsWorld _source; + internal ent entity; + + private bool _enabled = false; + + [EditorBrowsable(EditorBrowsableState.Never)] + public ent Entity + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => entity; + } + + internal void Enable() + { + _enabled = true; + } + + internal void Disable() + { + _enabled = false; + entity = ent.NULL; + } + + internal void MoveToNextEntity() + { + + } + + + public Enumerator GetEnumerator() + { + return new Enumerator(this); + } + + + public ref struct Enumerator + { + private readonly EcsTableCore _source; + + public Enumerator(EcsTableCore source) + { + _source = source; + } + + public EcsTableCore Current => _source; + + public bool MoveNext() + { + throw new NotImplementedException(); + } + + public void Reset() + { + throw new NotImplementedException(); + } + } + } +} diff --git a/src/EcsEntityTable.cs.meta b/src/EcsTableCore.cs.meta similarity index 100% rename from src/EcsEntityTable.cs.meta rename to src/EcsTableCore.cs.meta diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 9329d4b..4597811 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -71,7 +71,7 @@ namespace DCFApixels.DragonECS #region Destroy public void Destroy() { - _id = Consts.DEAD_WORLD_ID; + _id = DEAD_WORLD_ID; } #endregion diff --git a/src/EcsEntityTable.cs b/src/Interfaces/IEcsTable.cs similarity index 76% rename from src/EcsEntityTable.cs rename to src/Interfaces/IEcsTable.cs index 9fd6791..41506e6 100644 --- a/src/EcsEntityTable.cs +++ b/src/Interfaces/IEcsTable.cs @@ -6,8 +6,6 @@ using System.Threading.Tasks; namespace DCFApixels.DragonECS { - public interface IEcsEntityTable - { - - } + public interface IEcsTable { } } + diff --git a/src/Interfaces/IEcsTable.cs.meta b/src/Interfaces/IEcsTable.cs.meta new file mode 100644 index 0000000..fa90f26 --- /dev/null +++ b/src/Interfaces/IEcsTable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ce8e0e17f18931e4284946bddba80e02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/TableMembers.meta b/src/TableMembers.meta new file mode 100644 index 0000000..eb87e18 --- /dev/null +++ b/src/TableMembers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 35dbc0eb7d0449242a40ddcb8cbdbc06 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/TableMembers/EcsField.cs b/src/TableMembers/EcsField.cs new file mode 100644 index 0000000..82bd082 --- /dev/null +++ b/src/TableMembers/EcsField.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace DCFApixels.DragonECS +{ + public readonly struct EcsField : IEcsMemberCachePool, T> + { + private readonly EcsFieldPool _pool; + private readonly int _poolID; + + public EcsFieldPool Pool => _pool; + public int PoolID => _poolID; + + private EcsField(int poolID) + { + _pool = null; + _poolID = poolID; + } + internal EcsField(EcsFieldPool pool) + { + _pool = pool; + _poolID = pool.ID; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public ref T this[int entityID] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => ref _pool[entityID]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool HasValue(int entityID) + { + return _pool.Has(entityID); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ref T New(int entityID) + { + return ref _pool.Add(entityID); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator EcsField(in int poolID) => new EcsField(poolID); + + void IEcsMemberCachePool, T>.Inject(out EcsField self, EcsFieldPool pool) + { + self = new EcsField(pool); + } + } + + public readonly struct EcsIncField : IEcsMemberCachePool, T> + { + private readonly EcsFieldPool _pool; + private readonly int _poolID; + + public EcsFieldPool Pool => _pool; + public int PoolID => _poolID; + + private EcsIncField(int poolID) + { + _pool = null; + _poolID = poolID; + } + internal EcsIncField(EcsFieldPool pool) + { + _pool = pool; + _poolID = pool.ID; + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public ref T this[int entityID] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => ref _pool[entityID]; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator EcsIncField(in int poolID) => new EcsIncField(poolID); + + void IEcsMemberCachePool, T>.Inject(out EcsIncField self, EcsFieldPool pool) + { + self = new EcsIncField(pool); + } + } + + public struct EcsExcField : IEcsTableMember + { + private readonly int _poolID; + public int PoolID => _poolID; + + private EcsExcField(int poolID) + { + _poolID = poolID; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator EcsExcField(in int poolID) => new EcsExcField(poolID); + } +} diff --git a/src/EcsField.cs.meta b/src/TableMembers/EcsField.cs.meta similarity index 83% rename from src/EcsField.cs.meta rename to src/TableMembers/EcsField.cs.meta index b2b648f..a3c2173 100644 --- a/src/EcsField.cs.meta +++ b/src/TableMembers/EcsField.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f2fa97ad86c494a40939307a2cfaca36 +guid: 93de2f9d4ed4cd849a2b4fca39174c37 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/src/TableMembers/EcsTag.cs b/src/TableMembers/EcsTag.cs new file mode 100644 index 0000000..636069d --- /dev/null +++ b/src/TableMembers/EcsTag.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace DCFApixels.DragonECS +{ + public readonly struct EcsTag : IEcsMemberCachePool, T> + { + private readonly EcsFieldPool _pool; + private readonly int _poolID; + + public EcsFieldPool Pool => _pool; + public int PoolID => _poolID; + + private EcsTag(int poolID) + { + _pool = null; + _poolID = poolID; + } + internal EcsTag(EcsFieldPool pool) + { + _pool = pool; + _poolID = pool.ID; + } + + public void Add(int entityID) + { + _pool.Add(entityID); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator EcsTag(in int poolID) => new EcsTag(poolID); + + void IEcsMemberCachePool, T>.Inject(out EcsTag self, EcsFieldPool pool) + { + self = new EcsTag(pool); + } + } + public readonly struct EcsIncTag : IEcsTableMember + { + private readonly int _poolID; + public int PoolID => _poolID; + + private EcsIncTag(int poolID) + { + _poolID = poolID; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator EcsIncTag(in int poolID) => new EcsIncTag(poolID); + } + public readonly struct EcsExcTag : IEcsTableMember + { + private readonly int _poolID; + public int PoolID => _poolID; + + private EcsExcTag(int poolID) + { + _poolID = poolID; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator EcsExcTag(in int poolID) => new EcsExcTag(poolID); + } +} diff --git a/src/TableMembers/EcsTag.cs.meta b/src/TableMembers/EcsTag.cs.meta new file mode 100644 index 0000000..38f7dd8 --- /dev/null +++ b/src/TableMembers/EcsTag.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 524f71e4e46e94a44b302e2242150817 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/TableMembers/IEcsTableMember.cs b/src/TableMembers/IEcsTableMember.cs new file mode 100644 index 0000000..4a8f2a5 --- /dev/null +++ b/src/TableMembers/IEcsTableMember.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace DCFApixels.DragonECS +{ + public interface IEcsTableMember + { + public int PoolID { get; } + } + public interface IEcsMemberCachePool : IEcsTableMember + where TSelf: struct, IEcsTableMember + { + public EcsFieldPool Pool { get; } + public void Inject(out TSelf self, EcsFieldPool pool); + } +} diff --git a/src/TableMembers/IEcsTableMember.cs.meta b/src/TableMembers/IEcsTableMember.cs.meta new file mode 100644 index 0000000..cdbecc7 --- /dev/null +++ b/src/TableMembers/IEcsTableMember.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e765044f6e73f5847aa432da56a1ec9d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/ent.cs b/src/ent.cs index 2aea147..52f89fb 100644 --- a/src/ent.cs +++ b/src/ent.cs @@ -9,12 +9,12 @@ namespace DCFApixels.DragonECS [StructLayout(LayoutKind.Sequential, Pack = 0, Size = 8)] public readonly struct ent : IEquatable, IEquatable { - //private const int ID_BITS = 32; - //private const int GEN_BITS = 16; - //private const int WORLD_BITS = 8; - //private const int COM_BITS = 8; + public static readonly long NULL = 0; - public readonly long _full; + // id - 32 bits + // gen - 16 bits + // world - 8 bits + public readonly long _full; [EditorBrowsable(EditorBrowsableState.Never)] public int id @@ -29,15 +29,18 @@ 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); + get => (byte)(((_full << 48) >> 56) - 1); } [EditorBrowsable(EditorBrowsableState.Never)] - public byte com + public byte type { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => (byte)((_full << 56) >> 56); @@ -49,7 +52,7 @@ namespace DCFApixels.DragonECS { _full = ((long)id) << 32; _full += ((long)gen) << 16; - _full += ((long)world) << 8; + _full += ((long)(++world)) << 8; // сдвиг айдишников + 1 _full += com; } @@ -59,12 +62,6 @@ namespace DCFApixels.DragonECS _full = value; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public TypeCode GetTypeCode() - { - return TypeCode.Int64; - } - #region GetHashCode [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() @@ -110,4 +107,12 @@ namespace DCFApixels.DragonECS public static implicit operator ent(in long value) => new ent(value); #endregion } + + public static class entExtensions + { + public static bool IsNull(this in ent self) + { + return self == ent.NULL; + } + } }