From 13d0d41966ec2443bef101bcdacbdcf90513231d Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Sat, 9 Nov 2024 21:10:12 +0800 Subject: [PATCH 1/4] update aspects --- src/Builtin/Aspects.cs | 42 ++++++++++++++++---------------- src/EcsAspect.cs | 55 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 25 deletions(-) diff --git a/src/Builtin/Aspects.cs b/src/Builtin/Aspects.cs index 708d64d..d8197ab 100644 --- a/src/Builtin/Aspects.cs +++ b/src/Builtin/Aspects.cs @@ -6,14 +6,14 @@ namespace DCFApixels.DragonECS public sealed class SingleAspect : EcsAspect where TPool : IEcsPoolImplementation, new() { - public readonly TPool pool = CurrentBuilder.IncludePool(); + public readonly TPool pool = B.IncludePool(); } public sealed class CombinedAspect : EcsAspect where A0 : EcsAspect, new() where A1 : EcsAspect, new() { - public readonly A0 a0 = CurrentBuilder.Combine(); - public readonly A1 a1 = CurrentBuilder.Combine(); + public readonly A0 a0 = B.Combine(); + public readonly A1 a1 = B.Combine(); public void Deconstruct(out A0 a0, out A1 a1) { a0 = this.a0; @@ -26,9 +26,9 @@ namespace DCFApixels.DragonECS where A1 : EcsAspect, new() where A2 : EcsAspect, new() { - public readonly A0 a0 = CurrentBuilder.Combine(); - public readonly A1 a1 = CurrentBuilder.Combine(); - public readonly A2 a2 = CurrentBuilder.Combine(); + public readonly A0 a0 = B.Combine(); + public readonly A1 a1 = B.Combine(); + public readonly A2 a2 = B.Combine(); public void Deconstruct(out A0 a0, out A1 a1, out A2 a2) { a0 = this.a0; @@ -43,10 +43,10 @@ namespace DCFApixels.DragonECS where A2 : EcsAspect, new() where A3 : EcsAspect, new() { - public readonly A0 a0 = CurrentBuilder.Combine(); - public readonly A1 a1 = CurrentBuilder.Combine(); - public readonly A2 a2 = CurrentBuilder.Combine(); - public readonly A3 a3 = CurrentBuilder.Combine(); + public readonly A0 a0 = B.Combine(); + public readonly A1 a1 = B.Combine(); + public readonly A2 a2 = B.Combine(); + public readonly A3 a3 = B.Combine(); public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3) { a0 = this.a0; @@ -63,11 +63,11 @@ namespace DCFApixels.DragonECS where A3 : EcsAspect, new() where A4 : EcsAspect, new() { - public readonly A0 a0 = CurrentBuilder.Combine(); - public readonly A1 a1 = CurrentBuilder.Combine(); - public readonly A2 a2 = CurrentBuilder.Combine(); - public readonly A3 a3 = CurrentBuilder.Combine(); - public readonly A4 a4 = CurrentBuilder.Combine(); + public readonly A0 a0 = B.Combine(); + public readonly A1 a1 = B.Combine(); + public readonly A2 a2 = B.Combine(); + public readonly A3 a3 = B.Combine(); + public readonly A4 a4 = B.Combine(); public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4) { a0 = this.a0; @@ -86,12 +86,12 @@ namespace DCFApixels.DragonECS where A4 : EcsAspect, new() where A5 : EcsAspect, new() { - public readonly A0 a0 = CurrentBuilder.Combine(); - public readonly A1 a1 = CurrentBuilder.Combine(); - public readonly A2 a2 = CurrentBuilder.Combine(); - public readonly A3 a3 = CurrentBuilder.Combine(); - public readonly A4 a4 = CurrentBuilder.Combine(); - public readonly A5 a5 = CurrentBuilder.Combine(); + public readonly A0 a0 = B.Combine(); + public readonly A1 a1 = B.Combine(); + public readonly A2 a2 = B.Combine(); + public readonly A3 a3 = B.Combine(); + public readonly A4 a4 = B.Combine(); + public readonly A5 a5 = B.Combine(); public void Deconstruct(out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5) { a0 = this.a0; diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs index 98b7dfe..de9b2fb 100644 --- a/src/EcsAspect.cs +++ b/src/EcsAspect.cs @@ -6,6 +6,25 @@ using System.Collections.Generic; namespace DCFApixels.DragonECS { + public readonly struct Singleton where T : struct + { + public readonly short WorldID; + public Singleton(short worldID) + { + WorldID = worldID; + EcsWorld.GetData(worldID); + } + public EcsWorld World + { + get { return EcsWorld.GetWorld(WorldID); } + } + public ref T Value + { + get { return ref EcsWorld.GetDataUnchecked(WorldID); } + } + + public static implicit operator Singleton(SingletonMarker a) { return new Singleton(a.Builder.World.ID); } + } public abstract class EcsAspect : ITemplateNode, IComponentMask { #region Initialization Halpers @@ -13,7 +32,7 @@ namespace DCFApixels.DragonECS private static Builder[] _constructorBuildersStack; [ThreadStatic] private static int _constructorBuildersStackIndex; - protected static Builder CurrentBuilder + protected static Builder B { get { @@ -24,17 +43,25 @@ namespace DCFApixels.DragonECS return _constructorBuildersStack[_constructorBuildersStackIndex]; } } + protected static Builder CurrentBuilder + { + get { return B; } + } protected static IncludeMarker Inc { - get { return CurrentBuilder.Inc; } + get { return B.Inc; } } protected static ExcludeMarker Exc { - get { return CurrentBuilder.Exc; } + get { return B.Exc; } } protected static OptionalMarker Opt { - get { return CurrentBuilder.Opt; } + get { return B.Opt; } + } + protected static SingletonMarker Singleton + { + get { return B.Singleton; } } #endregion @@ -102,6 +129,10 @@ namespace DCFApixels.DragonECS { get { return new OptionalMarker(this); } } + public SingletonMarker Singleton + { + get { return new SingletonMarker(this); } + } public EcsWorld World { get { return _world; } @@ -164,6 +195,10 @@ namespace DCFApixels.DragonECS #endregion #region Include/Exclude/Optional/Combine/Except + public Singleton Get() where T : struct + { + return new Singleton(_world.ID); + } public TPool IncludePool() where TPool : IEcsPoolImplementation, new() { var pool = CachePool(); @@ -397,5 +432,17 @@ namespace DCFApixels.DragonECS return _builder.OptionalPool(); } } + public readonly ref struct SingletonMarker + { + public readonly EcsAspect.Builder Builder; + public SingletonMarker(EcsAspect.Builder builder) + { + Builder = builder; + } + public T Get() where T : struct + { + return Builder.World.Get(); + } + } #endregion } \ No newline at end of file From 90c2b5fbd060a060c9f9ac39a8627aebf494546f Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:31:31 +0800 Subject: [PATCH 2/4] add IEcsPool.AddEmpty --- src/Pools/EcsPool.cs | 1 + src/Pools/EcsPoolBase.cs | 9 ++++++++- src/Pools/EcsTagPool.cs | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Pools/EcsPool.cs b/src/Pools/EcsPool.cs index c8d8045..c3f624b 100644 --- a/src/Pools/EcsPool.cs +++ b/src/Pools/EcsPool.cs @@ -259,6 +259,7 @@ namespace DCFApixels.DragonECS #endregion #region Other + void IEcsPool.AddEmpty(int entityID) { Add(entityID); } void IEcsPool.AddRaw(int entityID, object dataRaw) { Add(entityID) = dataRaw == null ? default : (T)dataRaw; diff --git a/src/Pools/EcsPoolBase.cs b/src/Pools/EcsPoolBase.cs index 6f6f713..3bed942 100644 --- a/src/Pools/EcsPoolBase.cs +++ b/src/Pools/EcsPoolBase.cs @@ -88,6 +88,12 @@ namespace DCFApixels.DragonECS.Internal { #if (DEBUG && !DISABLE_DEBUG) throw new NullInstanceException(); +#endif + } + void IEcsPool.AddEmpty(int entityID) + { +#if (DEBUG && !DISABLE_DEBUG) + throw new NullInstanceException(); #endif } void IEcsPool.AddRaw(int entityID, object dataRaw) @@ -101,7 +107,7 @@ namespace DCFApixels.DragonECS.Internal #if (DEBUG && !DISABLE_DEBUG) throw new NullInstanceException(); #else - return null; + return null; #endif } void IEcsPool.SetRaw(int entity, object dataRaw) @@ -179,6 +185,7 @@ namespace DCFApixels.DragonECS public interface IEcsPool : IEcsReadonlyPool { #region Methods + void AddEmpty(int entityID); void AddRaw(int entityID, object dataRaw); void SetRaw(int entityID, object dataRaw); void Del(int entityID); diff --git a/src/Pools/EcsTagPool.cs b/src/Pools/EcsTagPool.cs index 893bacb..0fe8260 100644 --- a/src/Pools/EcsTagPool.cs +++ b/src/Pools/EcsTagPool.cs @@ -224,6 +224,7 @@ namespace DCFApixels.DragonECS #endregion #region Other + void IEcsPool.AddEmpty(int entityID) { Add(entityID); } void IEcsPool.AddRaw(int entityID, object dataRaw) { Add(entityID); } object IEcsReadonlyPool.GetRaw(int entityID) { From 4998e84fe5df039feaff6b4da9392b5ab0812693 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:36:37 +0800 Subject: [PATCH 3/4] Update EcsAspect.cs --- src/EcsAspect.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EcsAspect.cs b/src/EcsAspect.cs index de9b2fb..d025f82 100644 --- a/src/EcsAspect.cs +++ b/src/EcsAspect.cs @@ -300,7 +300,7 @@ namespace DCFApixels.DragonECS { if (pool.Has(entityID) == false) { - pool.AddRaw(entityID, null); + pool.AddEmpty(entityID); } } #if DEBUG From dbc3807e74ed02a8139d3210138cbea71b5c14c6 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:38:24 +0800 Subject: [PATCH 4/4] up version to 0.8.61 --- DragonECS.csproj | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DragonECS.csproj b/DragonECS.csproj index 1d093cd..4f2db5b 100644 --- a/DragonECS.csproj +++ b/DragonECS.csproj @@ -10,7 +10,7 @@ DCFApixels.DragonECS DragonECS - 0.8.60 + 0.8.61 DCFApixels ECS Framework for Game Engines with C# and .Net Platform DCFApixels diff --git a/package.json b/package.json index 59a5d8a..1051df6 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "displayName": "DragonECS", "description": "C# Entity Component System Framework", "unity": "2020.3", - "version": "0.8.60", + "version": "0.8.61", "repository": { "type": "git", "url": "https://github.com/DCFApixels/DragonECS.git"