From 2fb247a534e00c84e6dae49b8060b4ce4e3f44ef Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:18:42 +0800 Subject: [PATCH 1/5] fix namespace --- src/Builtin/EcsGraphWorld.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Builtin/EcsGraphWorld.cs b/src/Builtin/EcsGraphWorld.cs index 10ace88..82ae5a5 100644 --- a/src/Builtin/EcsGraphWorld.cs +++ b/src/Builtin/EcsGraphWorld.cs @@ -1,7 +1,6 @@ -using DCFApixels.DragonECS; -using System.Diagnostics; +using System.Diagnostics; -namespace DCFApixels.Assets.Plugins.DragonECS_Graphs.src.Builtin +namespace DCFApixels.DragonECS { /// EcsWrold for store regular game entities. [MetaColor(MetaColor.DragonRose)] From 6dcc8ccf382e9ef7af60f49496c4d4296d55377c Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:54:46 +0800 Subject: [PATCH 2/5] remane queries --- src/EntityGraph.cs | 2 +- src/Executors/GraphQueries.cs | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/EntityGraph.cs b/src/EntityGraph.cs index 47c0bd9..8f97368 100644 --- a/src/EntityGraph.cs +++ b/src/EntityGraph.cs @@ -239,7 +239,7 @@ namespace DCFApixels.DragonECS EcsSubGraph subGraph; EcsWorld graphWorld = _graph._graphWorld; - subGraph = graphWorld.JoinToSubGraph(EcsSubGraphMode.All); + subGraph = graphWorld.JoinGraph(EcsSubGraphMode.All); foreach (var sourceE in delEntities) { var relEs = subGraph.GetRelations(sourceE); diff --git a/src/Executors/GraphQueries.cs b/src/Executors/GraphQueries.cs index 95b393b..f942e8a 100644 --- a/src/Executors/GraphQueries.cs +++ b/src/Executors/GraphQueries.cs @@ -6,7 +6,7 @@ namespace DCFApixels.DragonECS public static class GraphQueriesExtensions { #region JoinToGraph Empty - public static EcsSubGraph JoinToSubGraph(this EcsWorld entities, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static EcsSubGraph JoinGraph(this EcsWorld entities, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) { entities.GetQueryCache(out JoinToSubGraphExecutor executor, out EmptyAspect _); return executor.Execute(mode); @@ -14,7 +14,7 @@ namespace DCFApixels.DragonECS #endregion #region JoinToGraph Mask - public static EcsSubGraph JoinToSubGraph(this TCollection entities, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static EcsSubGraph JoinSubGraph(this TCollection entities, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) @@ -22,13 +22,13 @@ namespace DCFApixels.DragonECS var executor = entities.World.GetExecutorForMask(mask); return executor.Execute(); } - return entities.ToSpan().JoinToSubGraph(mask, mode); + return entities.ToSpan().JoinSubGraph(mask, mode); } - public static EcsSubGraph JoinToSubGraph(this EcsReadonlyGroup group, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static EcsSubGraph JoinSubGraph(this EcsReadonlyGroup group, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) { - return group.ToSpan().JoinToSubGraph(mask, mode); + return group.ToSpan().JoinSubGraph(mask, mode); } - public static EcsSubGraph JoinToSubGraph(this EcsSpan span, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static EcsSubGraph JoinSubGraph(this EcsSpan span, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) { var executor = span.World.GetExecutorForMask(mask); return executor.ExecuteFor(span, mode); @@ -36,7 +36,7 @@ namespace DCFApixels.DragonECS #endregion #region JoinToGraph - public static EcsSubGraph JoinToSubGraph(this TCollection entities, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static EcsSubGraph JoinSubGraph(this TCollection entities, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) where TAspect : EcsAspect, new() where TCollection : IEntityStorage { @@ -45,14 +45,14 @@ namespace DCFApixels.DragonECS entities.World.GetQueryCache(out JoinToSubGraphExecutor executor, out aspect); return executor.Execute(); } - return entities.ToSpan().JoinToSubGraph(out aspect, mode); + return entities.ToSpan().JoinSubGraph(out aspect, mode); } - public static EcsSubGraph JoinToSubGraph(this EcsReadonlyGroup group, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static EcsSubGraph JoinSubGraph(this EcsReadonlyGroup group, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) where TAspect : EcsAspect, new() { - return group.ToSpan().JoinToSubGraph(out aspect, mode); + return group.ToSpan().JoinSubGraph(out aspect, mode); } - public static EcsSubGraph JoinToSubGraph(this EcsSpan span, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static EcsSubGraph JoinSubGraph(this EcsSpan span, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) where TAspect : EcsAspect, new() { span.World.GetQueryCache(out JoinToSubGraphExecutor executor, out aspect); From cc23ba0b8a39638687393dcb777e29f4a39a4128 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 20 Nov 2024 16:46:41 +0800 Subject: [PATCH 3/5] renaming --- src/EntityGraph.cs | 4 +- src/Executors/GraphQueries.cs | 14 +-- src/Executors/JoinToSubGraphExecutor.cs | 156 ++++++++++++------------ 3 files changed, 87 insertions(+), 87 deletions(-) diff --git a/src/EntityGraph.cs b/src/EntityGraph.cs index 8f97368..705ca7e 100644 --- a/src/EntityGraph.cs +++ b/src/EntityGraph.cs @@ -236,10 +236,10 @@ namespace DCFApixels.DragonECS #region Callbacks public void OnReleaseDelEntityBuffer(ReadOnlySpan delEntities) { - EcsSubGraph subGraph; + SubGraphMap subGraph; EcsWorld graphWorld = _graph._graphWorld; - subGraph = graphWorld.JoinGraph(EcsSubGraphMode.All); + subGraph = graphWorld.JoinGraph(JoinMode.All); foreach (var sourceE in delEntities) { var relEs = subGraph.GetRelations(sourceE); diff --git a/src/Executors/GraphQueries.cs b/src/Executors/GraphQueries.cs index f942e8a..c33541f 100644 --- a/src/Executors/GraphQueries.cs +++ b/src/Executors/GraphQueries.cs @@ -6,7 +6,7 @@ namespace DCFApixels.DragonECS public static class GraphQueriesExtensions { #region JoinToGraph Empty - public static EcsSubGraph JoinGraph(this EcsWorld entities, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static SubGraphMap JoinGraph(this EcsWorld entities, JoinMode mode = JoinMode.StartToEnd) { entities.GetQueryCache(out JoinToSubGraphExecutor executor, out EmptyAspect _); return executor.Execute(mode); @@ -14,7 +14,7 @@ namespace DCFApixels.DragonECS #endregion #region JoinToGraph Mask - public static EcsSubGraph JoinSubGraph(this TCollection entities, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this TCollection entities, IComponentMask mask, JoinMode mode = JoinMode.StartToEnd) where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) @@ -24,11 +24,11 @@ namespace DCFApixels.DragonECS } return entities.ToSpan().JoinSubGraph(mask, mode); } - public static EcsSubGraph JoinSubGraph(this EcsReadonlyGroup group, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this EcsReadonlyGroup group, IComponentMask mask, JoinMode mode = JoinMode.StartToEnd) { return group.ToSpan().JoinSubGraph(mask, mode); } - public static EcsSubGraph JoinSubGraph(this EcsSpan span, IComponentMask mask, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this EcsSpan span, IComponentMask mask, JoinMode mode = JoinMode.StartToEnd) { var executor = span.World.GetExecutorForMask(mask); return executor.ExecuteFor(span, mode); @@ -36,7 +36,7 @@ namespace DCFApixels.DragonECS #endregion #region JoinToGraph - public static EcsSubGraph JoinSubGraph(this TCollection entities, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this TCollection entities, out TAspect aspect, JoinMode mode = JoinMode.StartToEnd) where TAspect : EcsAspect, new() where TCollection : IEntityStorage { @@ -47,12 +47,12 @@ namespace DCFApixels.DragonECS } return entities.ToSpan().JoinSubGraph(out aspect, mode); } - public static EcsSubGraph JoinSubGraph(this EcsReadonlyGroup group, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this EcsReadonlyGroup group, out TAspect aspect, JoinMode mode = JoinMode.StartToEnd) where TAspect : EcsAspect, new() { return group.ToSpan().JoinSubGraph(out aspect, mode); } - public static EcsSubGraph JoinSubGraph(this EcsSpan span, out TAspect aspect, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this EcsSpan span, out TAspect aspect, JoinMode mode = JoinMode.StartToEnd) where TAspect : EcsAspect, new() { span.World.GetQueryCache(out JoinToSubGraphExecutor executor, out aspect); diff --git a/src/Executors/JoinToSubGraphExecutor.cs b/src/Executors/JoinToSubGraphExecutor.cs index 876727c..7c58df3 100644 --- a/src/Executors/JoinToSubGraphExecutor.cs +++ b/src/Executors/JoinToSubGraphExecutor.cs @@ -81,7 +81,7 @@ namespace DCFApixels.DragonECS.Graphs.Internal #region Execute [MethodImpl(MethodImplOptions.AggressiveInlining)] - private EcsSubGraph Execute_Internal(EcsSubGraphMode mode) + private SubGraphMap Execute_Internal(JoinMode mode) { //_executeMarker.Begin(); @@ -121,14 +121,14 @@ namespace DCFApixels.DragonECS.Graphs.Internal _linkedList.Clear(); //Заполнение массивов - if ((mode & EcsSubGraphMode.StartToEnd) != 0) + if ((mode & JoinMode.StartToEnd) != 0) { for (int i = 0; i < _filteredAllEntitiesCount; i++) { AddStart(_filteredAllEntities[i]); } } - if ((mode & EcsSubGraphMode.EndToStart) != 0) + if ((mode & JoinMode.EndToStart) != 0) { for (int i = 0; i < _filteredAllEntitiesCount; i++) { @@ -140,10 +140,10 @@ namespace DCFApixels.DragonECS.Graphs.Internal _version++; //_executeMarker.End(); - return new EcsSubGraph(this); + return new SubGraphMap(this); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private EcsSubGraph ExecuteFor_Internal(EcsSpan span, EcsSubGraphMode mode) + private SubGraphMap ExecuteFor_Internal(EcsSpan span, JoinMode mode) { //_executeMarker.Begin(); #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS @@ -184,14 +184,14 @@ namespace DCFApixels.DragonECS.Graphs.Internal _linkedList.Clear(); //Заполнение массивов - if ((mode & EcsSubGraphMode.StartToEnd) != 0) + if ((mode & JoinMode.StartToEnd) != 0) { for (int i = 0; i < _filteredEntitiesCount; i++) { AddStart(_filteredEntities[i]); } } - if ((mode & EcsSubGraphMode.EndToStart) != 0) + if ((mode & JoinMode.EndToStart) != 0) { for (int i = 0; i < _filteredEntitiesCount; i++) { @@ -201,14 +201,14 @@ namespace DCFApixels.DragonECS.Graphs.Internal //_executeMarker.End(); - return new EcsSubGraph(this); + return new SubGraphMap(this); } - public EcsSubGraph Execute(EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public SubGraphMap Execute(JoinMode mode = JoinMode.StartToEnd) { return Execute_Internal(mode); } - public EcsSubGraph ExecuteFor(EcsSpan span, EcsSubGraphMode mode = EcsSubGraphMode.StartToEnd) + public SubGraphMap ExecuteFor(EcsSpan span, JoinMode mode = JoinMode.StartToEnd) { return ExecuteFor_Internal(span, mode); } @@ -246,10 +246,10 @@ namespace DCFApixels.DragonECS.Graphs.Internal #region Internal result methods [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal EcsSubGraphSpan GetRelations_Internal(int sourceEntityID) + internal SubGraphMap.Node GetRelations_Internal(int sourceEntityID) { LinkedListHead basket = _linkedListSourceHeads[sourceEntityID]; - return new EcsSubGraphSpan(_linkedList._nodes, basket.head, basket.count); + return new SubGraphMap.Node(_linkedList._nodes, basket.head, basket.count); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal int GetRelation_Internal(int sourceEntityID) @@ -305,7 +305,7 @@ namespace DCFApixels.DragonECS.Graphs.Internal namespace DCFApixels.DragonECS { - public enum EcsSubGraphMode : byte + public enum JoinMode : byte { NONE = 0, StartToEnd = 1 << 0, @@ -313,15 +313,15 @@ namespace DCFApixels.DragonECS All = StartToEnd | EndToStart, } - #region EcsSubGraphSpan/EcsSubGraph - public readonly ref struct EcsSubGraph + #region SubGraphMap/SubGraphMapNode + public readonly ref struct SubGraphMap { private readonly JoinToSubGraphExecutor _executer; public EntityGraph Graph { get { return _executer.Graph; } } - internal EcsSubGraph(JoinToSubGraphExecutor executer) + internal SubGraphMap(JoinToSubGraphExecutor executer) { _executer = executer; } @@ -333,7 +333,7 @@ namespace DCFApixels.DragonECS { return _executer.GetRelEntities(); } - public EcsSubGraphSpan GetRelations(int startEntityID) + public Node GetRelations(int startEntityID) { return _executer.GetRelations_Internal(startEntityID); } @@ -345,74 +345,74 @@ namespace DCFApixels.DragonECS { return _executer.GetRelationsCount_Internal(startEntityID); } - } - public readonly ref struct EcsSubGraphSpan - { - public static EcsSubGraphSpan Empty + public readonly ref struct Node { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get { return new EcsSubGraphSpan(null, 0, 0); } - } - - private readonly LinkedList.Node[] _nodes; - private readonly LinkedList.NodeIndex _startNodeIndex; - private readonly int _count; - public int Count - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get { return _count; } - } - private IEnumerable E - { - get - { - List result = new List(); - foreach (var item in this) - { - result.Add(item); - } - return result; - } - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal EcsSubGraphSpan(LinkedList.Node[] nodes, LinkedList.NodeIndex startNodeIndex, int count) - { - _nodes = nodes; - _startNodeIndex = startNodeIndex; - _count = count; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Enumerator GetEnumerator() - { - return new Enumerator(_nodes, _startNodeIndex, _count); - } - public ref struct Enumerator - { - private readonly LinkedList.Node[] _nodes; - private int _index; - private int _count; - private int _next; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal Enumerator(LinkedList.Node[] nodes, LinkedList.NodeIndex startIndex, int count) - { - _nodes = nodes; - _index = -1; - _count = count; - _next = (int)startIndex; - } - public int Current + public static Node Empty { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get { return _nodes[_index].entityID; } + get { return new Node(null, 0, 0); } + } + + private readonly LinkedList.Node[] _nodes; + private readonly LinkedList.NodeIndex _startNodeIndex; + private readonly int _count; + public int Count + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get { return _count; } + } + private IEnumerable E + { + get + { + List result = new List(); + foreach (var item in this) + { + result.Add(item); + } + return result; + } } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool MoveNext() + internal Node(LinkedList.Node[] nodes, LinkedList.NodeIndex startNodeIndex, int count) { - _index = _next; - _next = (int)_nodes[_next].next; - return _index > 0 && _count-- > 0; - //return _count-- > 0; + _nodes = nodes; + _startNodeIndex = startNodeIndex; + _count = count; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Enumerator GetEnumerator() + { + return new Enumerator(_nodes, _startNodeIndex, _count); + } + public ref struct Enumerator + { + private readonly LinkedList.Node[] _nodes; + private int _index; + private int _count; + private int _next; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal Enumerator(LinkedList.Node[] nodes, LinkedList.NodeIndex startIndex, int count) + { + _nodes = nodes; + _index = -1; + _count = count; + _next = (int)startIndex; + } + public int Current + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get { return _nodes[_index].entityID; } + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool MoveNext() + { + _index = _next; + _next = (int)_nodes[_next].next; + return _index > 0 && _count-- > 0; + //return _count-- > 0; + } } } } From 3b57922be3ea7ba8f3626d4fca158934e66a1b3b Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 20 Nov 2024 17:11:17 +0800 Subject: [PATCH 4/5] renaming --- src/Executors/GraphQueries.cs | 14 +++++++------- src/Executors/JoinToSubGraphExecutor.cs | 18 +++++++++--------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Executors/GraphQueries.cs b/src/Executors/GraphQueries.cs index c33541f..1791c96 100644 --- a/src/Executors/GraphQueries.cs +++ b/src/Executors/GraphQueries.cs @@ -6,7 +6,7 @@ namespace DCFApixels.DragonECS public static class GraphQueriesExtensions { #region JoinToGraph Empty - public static SubGraphMap JoinGraph(this EcsWorld entities, JoinMode mode = JoinMode.StartToEnd) + public static SubGraphMap JoinGraph(this EcsWorld entities, JoinMode mode = JoinMode.Start) { entities.GetQueryCache(out JoinToSubGraphExecutor executor, out EmptyAspect _); return executor.Execute(mode); @@ -14,7 +14,7 @@ namespace DCFApixels.DragonECS #endregion #region JoinToGraph Mask - public static SubGraphMap JoinSubGraph(this TCollection entities, IComponentMask mask, JoinMode mode = JoinMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this TCollection entities, IComponentMask mask, JoinMode mode = JoinMode.Start) where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) @@ -24,11 +24,11 @@ namespace DCFApixels.DragonECS } return entities.ToSpan().JoinSubGraph(mask, mode); } - public static SubGraphMap JoinSubGraph(this EcsReadonlyGroup group, IComponentMask mask, JoinMode mode = JoinMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this EcsReadonlyGroup group, IComponentMask mask, JoinMode mode = JoinMode.Start) { return group.ToSpan().JoinSubGraph(mask, mode); } - public static SubGraphMap JoinSubGraph(this EcsSpan span, IComponentMask mask, JoinMode mode = JoinMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this EcsSpan span, IComponentMask mask, JoinMode mode = JoinMode.Start) { var executor = span.World.GetExecutorForMask(mask); return executor.ExecuteFor(span, mode); @@ -36,7 +36,7 @@ namespace DCFApixels.DragonECS #endregion #region JoinToGraph - public static SubGraphMap JoinSubGraph(this TCollection entities, out TAspect aspect, JoinMode mode = JoinMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this TCollection entities, out TAspect aspect, JoinMode mode = JoinMode.Start) where TAspect : EcsAspect, new() where TCollection : IEntityStorage { @@ -47,12 +47,12 @@ namespace DCFApixels.DragonECS } return entities.ToSpan().JoinSubGraph(out aspect, mode); } - public static SubGraphMap JoinSubGraph(this EcsReadonlyGroup group, out TAspect aspect, JoinMode mode = JoinMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this EcsReadonlyGroup group, out TAspect aspect, JoinMode mode = JoinMode.Start) where TAspect : EcsAspect, new() { return group.ToSpan().JoinSubGraph(out aspect, mode); } - public static SubGraphMap JoinSubGraph(this EcsSpan span, out TAspect aspect, JoinMode mode = JoinMode.StartToEnd) + public static SubGraphMap JoinSubGraph(this EcsSpan span, out TAspect aspect, JoinMode mode = JoinMode.Start) where TAspect : EcsAspect, new() { span.World.GetQueryCache(out JoinToSubGraphExecutor executor, out aspect); diff --git a/src/Executors/JoinToSubGraphExecutor.cs b/src/Executors/JoinToSubGraphExecutor.cs index 7c58df3..d193260 100644 --- a/src/Executors/JoinToSubGraphExecutor.cs +++ b/src/Executors/JoinToSubGraphExecutor.cs @@ -121,14 +121,14 @@ namespace DCFApixels.DragonECS.Graphs.Internal _linkedList.Clear(); //Заполнение массивов - if ((mode & JoinMode.StartToEnd) != 0) + if ((mode & JoinMode.Start) != 0) { for (int i = 0; i < _filteredAllEntitiesCount; i++) { AddStart(_filteredAllEntities[i]); } } - if ((mode & JoinMode.EndToStart) != 0) + if ((mode & JoinMode.End) != 0) { for (int i = 0; i < _filteredAllEntitiesCount; i++) { @@ -184,14 +184,14 @@ namespace DCFApixels.DragonECS.Graphs.Internal _linkedList.Clear(); //Заполнение массивов - if ((mode & JoinMode.StartToEnd) != 0) + if ((mode & JoinMode.Start) != 0) { for (int i = 0; i < _filteredEntitiesCount; i++) { AddStart(_filteredEntities[i]); } } - if ((mode & JoinMode.EndToStart) != 0) + if ((mode & JoinMode.End) != 0) { for (int i = 0; i < _filteredEntitiesCount; i++) { @@ -204,11 +204,11 @@ namespace DCFApixels.DragonECS.Graphs.Internal return new SubGraphMap(this); } - public SubGraphMap Execute(JoinMode mode = JoinMode.StartToEnd) + public SubGraphMap Execute(JoinMode mode = JoinMode.Start) { return Execute_Internal(mode); } - public SubGraphMap ExecuteFor(EcsSpan span, JoinMode mode = JoinMode.StartToEnd) + public SubGraphMap ExecuteFor(EcsSpan span, JoinMode mode = JoinMode.Start) { return ExecuteFor_Internal(span, mode); } @@ -308,9 +308,9 @@ namespace DCFApixels.DragonECS public enum JoinMode : byte { NONE = 0, - StartToEnd = 1 << 0, - EndToStart = 1 << 1, - All = StartToEnd | EndToStart, + Start = 1 << 0, + End = 1 << 1, + All = Start | End, } #region SubGraphMap/SubGraphMapNode From a747b5043c1e091c481ad992e0dec0048b794935 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Fri, 22 Nov 2024 12:15:29 +0800 Subject: [PATCH 5/5] api polishing --- src/EntityGraph.cs | 2 +- src/EntityGraphExtensions.cs | 9 ++ src/Executors/GraphQueries.cs | 24 ++--- src/Executors/JoinToSubGraphExecutor.cs | 113 ++++++++++++++++-------- 4 files changed, 96 insertions(+), 52 deletions(-) diff --git a/src/EntityGraph.cs b/src/EntityGraph.cs index 705ca7e..55a8f7b 100644 --- a/src/EntityGraph.cs +++ b/src/EntityGraph.cs @@ -239,7 +239,7 @@ namespace DCFApixels.DragonECS SubGraphMap subGraph; EcsWorld graphWorld = _graph._graphWorld; - subGraph = graphWorld.JoinGraph(JoinMode.All); + subGraph = graphWorld.Join(JoinMode.All); foreach (var sourceE in delEntities) { var relEs = subGraph.GetRelations(sourceE); diff --git a/src/EntityGraphExtensions.cs b/src/EntityGraphExtensions.cs index d764839..c4bad67 100644 --- a/src/EntityGraphExtensions.cs +++ b/src/EntityGraphExtensions.cs @@ -71,6 +71,15 @@ namespace DCFApixels.DragonECS Throw.UndefinedException(); return null; } + public static EcsWorld GetGraphWorld(this EcsWorld self) + { + if (self.TryGetGraph(out EntityGraph graph)) + { + return graph.GraphWorld; + } + Throw.UndefinedException(); + return null; + } public static bool IsGraphWorld(this EcsWorld self) { diff --git a/src/Executors/GraphQueries.cs b/src/Executors/GraphQueries.cs index 1791c96..d6c494b 100644 --- a/src/Executors/GraphQueries.cs +++ b/src/Executors/GraphQueries.cs @@ -6,56 +6,56 @@ namespace DCFApixels.DragonECS public static class GraphQueriesExtensions { #region JoinToGraph Empty - public static SubGraphMap JoinGraph(this EcsWorld entities, JoinMode mode = JoinMode.Start) + public static SubGraphMap Join(this EcsWorld entities, JoinMode mode = JoinMode.Start) { - entities.GetQueryCache(out JoinToSubGraphExecutor executor, out EmptyAspect _); + entities.GetQueryCache(out JoinExecutor executor, out EmptyAspect _); return executor.Execute(mode); } #endregion #region JoinToGraph Mask - public static SubGraphMap JoinSubGraph(this TCollection entities, IComponentMask mask, JoinMode mode = JoinMode.Start) + public static SubGraphMap Join(this TCollection entities, IComponentMask mask, JoinMode mode = JoinMode.Start) where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) { - var executor = entities.World.GetExecutorForMask(mask); + var executor = entities.World.GetExecutorForMask(mask); return executor.Execute(); } return entities.ToSpan().JoinSubGraph(mask, mode); } - public static SubGraphMap JoinSubGraph(this EcsReadonlyGroup group, IComponentMask mask, JoinMode mode = JoinMode.Start) + public static SubGraphMap Join(this EcsReadonlyGroup group, IComponentMask mask, JoinMode mode = JoinMode.Start) { return group.ToSpan().JoinSubGraph(mask, mode); } public static SubGraphMap JoinSubGraph(this EcsSpan span, IComponentMask mask, JoinMode mode = JoinMode.Start) { - var executor = span.World.GetExecutorForMask(mask); + var executor = span.World.GetExecutorForMask(mask); return executor.ExecuteFor(span, mode); } #endregion #region JoinToGraph - public static SubGraphMap JoinSubGraph(this TCollection entities, out TAspect aspect, JoinMode mode = JoinMode.Start) + public static SubGraphMap Join(this TCollection entities, out TAspect aspect, JoinMode mode = JoinMode.Start) where TAspect : EcsAspect, new() where TCollection : IEntityStorage { if (ReferenceEquals(entities, entities.World)) { - entities.World.GetQueryCache(out JoinToSubGraphExecutor executor, out aspect); + entities.World.GetQueryCache(out JoinExecutor executor, out aspect); return executor.Execute(); } - return entities.ToSpan().JoinSubGraph(out aspect, mode); + return entities.ToSpan().Join(out aspect, mode); } public static SubGraphMap JoinSubGraph(this EcsReadonlyGroup group, out TAspect aspect, JoinMode mode = JoinMode.Start) where TAspect : EcsAspect, new() { - return group.ToSpan().JoinSubGraph(out aspect, mode); + return group.ToSpan().Join(out aspect, mode); } - public static SubGraphMap JoinSubGraph(this EcsSpan span, out TAspect aspect, JoinMode mode = JoinMode.Start) + public static SubGraphMap Join(this EcsSpan span, out TAspect aspect, JoinMode mode = JoinMode.Start) where TAspect : EcsAspect, new() { - span.World.GetQueryCache(out JoinToSubGraphExecutor executor, out aspect); + span.World.GetQueryCache(out JoinExecutor executor, out aspect); return executor.ExecuteFor(span, mode); } #endregion diff --git a/src/Executors/JoinToSubGraphExecutor.cs b/src/Executors/JoinToSubGraphExecutor.cs index d193260..7ad71b1 100644 --- a/src/Executors/JoinToSubGraphExecutor.cs +++ b/src/Executors/JoinToSubGraphExecutor.cs @@ -3,12 +3,13 @@ using DCFApixels.DragonECS.Graphs.Internal; using DCFApixels.DragonECS.UncheckedCore; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Runtime.CompilerServices; using LinkedList = DCFApixels.DragonECS.Graphs.Internal.OnlyAppendHeadLinkedList; namespace DCFApixels.DragonECS.Graphs.Internal { - internal sealed class JoinToSubGraphExecutor : MaskQueryExecutor, IEcsWorldEventListener + internal sealed class JoinExecutor : MaskQueryExecutor, IEcsWorldEventListener { private EntityGraph _graph; private EcsMaskIterator _iterator; @@ -62,6 +63,11 @@ namespace DCFApixels.DragonECS.Graphs.Internal #region OnInitialize/OnDestroy protected override void OnInitialize() { + if (World.IsGraphWorld() == false) + { + Throw.Exception("The JounSubGraph query can only be used for EntityGraph.GraphWorld or a collection of that world."); + } + _versionsChecker = new WorldStateVersionsChecker(Mask); _linkedList = new OnlyAppendHeadLinkedList(World.Capacity); _linkedListSourceHeads = new LinkedListHead[World.Capacity]; @@ -246,10 +252,10 @@ namespace DCFApixels.DragonECS.Graphs.Internal #region Internal result methods [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal SubGraphMap.Node GetRelations_Internal(int sourceEntityID) + internal SubGraphMap.NodeInfo GetRelations_Internal(int sourceEntityID) { LinkedListHead basket = _linkedListSourceHeads[sourceEntityID]; - return new SubGraphMap.Node(_linkedList._nodes, basket.head, basket.count); + return new SubGraphMap.NodeInfo(_linkedList._nodes, basket.head, basket.count); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal int GetRelation_Internal(int sourceEntityID) @@ -291,7 +297,7 @@ namespace DCFApixels.DragonECS.Graphs.Internal #endregion #region GetEntites - internal EcsSpan GetSourceEntities() + internal EcsSpan GetNodeEntities() { return UncheckedCoreUtility.CreateSpan(WorldID, _sourceEntities, _sourceEntitiesCount); } @@ -313,47 +319,64 @@ namespace DCFApixels.DragonECS All = Start | End, } - #region SubGraphMap/SubGraphMapNode + #region SubGraphMap public readonly ref struct SubGraphMap { - private readonly JoinToSubGraphExecutor _executer; + private readonly JoinExecutor _executer; public EntityGraph Graph { get { return _executer.Graph; } } - internal SubGraphMap(JoinToSubGraphExecutor executer) + internal SubGraphMap(JoinExecutor executer) { _executer = executer; } - public EcsSpan GetSourceEntities() + + public EcsSpan WhereNodes(out TAspect a) + where TAspect : EcsAspect, new() { - return _executer.GetSourceEntities(); + return _executer.GetNodeEntities().Where(out a); } - public EcsSpan GetAllRelEntities() + public EcsSpan WhereNodes(IComponentMask mask) + { + return _executer.GetNodeEntities().Where(mask); + } + public EcsSpan WhereNodes(out TAspect a, Comparison comparison) + where TAspect : EcsAspect, new() + { + return _executer.GetNodeEntities().Where(out a, comparison); + } + public EcsSpan WhereNodes(IComponentMask mask, Comparison comparison) + { + return _executer.GetNodeEntities().Where(mask, comparison); + } + + public EcsSpan GetNodes() + { + return _executer.GetNodeEntities(); + } + public EcsSpan GetAllRelations() { return _executer.GetRelEntities(); } - public Node GetRelations(int startEntityID) + + public NodeInfo GetRelations(int nodeEntityID) { - return _executer.GetRelations_Internal(startEntityID); - } - public int GetRelation(int startEntityID) - { - return _executer.GetRelation_Internal(startEntityID); - } - public int GetRelationsCount(int startEntityID) - { - return _executer.GetRelationsCount_Internal(startEntityID); + return _executer.GetRelations_Internal(nodeEntityID); } - public readonly ref struct Node + public int GetRelation(int nodeEntityID) { - public static Node Empty - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get { return new Node(null, 0, 0); } - } + return _executer.GetRelation_Internal(nodeEntityID); + } + public int GetRelationsCount(int nodeEntityID) + { + return _executer.GetRelationsCount_Internal(nodeEntityID); + } + [DebuggerTypeProxy(typeof(DebuggerProxy))] + public readonly ref struct NodeInfo + { private readonly LinkedList.Node[] _nodes; private readonly LinkedList.NodeIndex _startNodeIndex; private readonly int _count; @@ -362,20 +385,8 @@ namespace DCFApixels.DragonECS [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return _count; } } - private IEnumerable E - { - get - { - List result = new List(); - foreach (var item in this) - { - result.Add(item); - } - return result; - } - } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal Node(LinkedList.Node[] nodes, LinkedList.NodeIndex startNodeIndex, int count) + internal NodeInfo(LinkedList.Node[] nodes, LinkedList.NodeIndex startNodeIndex, int count) { _nodes = nodes; _startNodeIndex = startNodeIndex; @@ -414,6 +425,30 @@ namespace DCFApixels.DragonECS //return _count-- > 0; } } + private class DebuggerProxy + { + private readonly LinkedList.Node[] _nodes; + private readonly LinkedList.NodeIndex _startNodeIndex; + private readonly int _count; + private IEnumerable Entities + { + get + { + List result = new List(); + foreach (var item in new NodeInfo(_nodes, _startNodeIndex, _count)) + { + result.Add(item); + } + return result; + } + } + public DebuggerProxy(NodeInfo node) + { + _nodes = node._nodes; + _startNodeIndex = node._startNodeIndex; + _count = node._count; + } + } } } #endregion