diff --git a/src/EcsPipeline.Builder.cs b/src/EcsPipeline.Builder.cs index 73aa8d0..8a6872e 100644 --- a/src/EcsPipeline.Builder.cs +++ b/src/EcsPipeline.Builder.cs @@ -63,7 +63,7 @@ namespace DCFApixels.DragonECS Injector.AddNode(); Injector.AddNode(); - var graph = new DependencyGraph(BASIC_LAYER); + var graph = new DependencyGraph(BASIC_LAYER); Layers = new LayersMap(graph, this, PRE_BEGIN_LAYER, BEGIN_LAYER, BASIC_LAYER, END_LAYER, POST_END_LAYER); } #endregion diff --git a/src/Utils/DependencyGraph.cs b/src/Utils/DependencyGraph.cs index e600de5..cce2f7d 100644 --- a/src/Utils/DependencyGraph.cs +++ b/src/Utils/DependencyGraph.cs @@ -22,6 +22,7 @@ namespace DCFApixels.DragonECS.Core private readonly IDependencyGraph _graph; private readonly EcsPipeline.Builder _pipelineBuilder; + private readonly string _preBeginLayer; #region Properties public EcsPipeline.Builder Back @@ -206,6 +207,37 @@ namespace DCFApixels.DragonECS.Core { _graph.MergeWith(other); } + //[Obsolete("Use MergeWith(LayersMap)")] + public void MergeWith(IReadOnlyList other) + { + var enumerator = other.GetEnumerator(); + string prev = null; + if (_preBeginLayer != null) + { + while (enumerator.MoveNext()) + { + var layer = enumerator.Current; + if (layer == _preBeginLayer) { break; } + + Add(layer); + if (prev != null) + { + Move(prev).Before(layer); + } + prev = layer; + } + } + while (enumerator.MoveNext()) + { + var layer = enumerator.Current; + Add(layer); + if (prev != null) + { + Move(layer).After(prev); + } + prev = layer; + } + } #endregion; #region Other @@ -279,31 +311,23 @@ namespace DCFApixels.DragonECS.Core { get { - //int i = 0; - //foreach (var item in this) - //{ - // if (i == index) - // { - // return item; - // } - // i++; - //} + int i = 0; + foreach (var item in this) + { + if (i == index) + { + return item; + } + i++; + } return null; } } - [Obsolete("Use MergeWith(LayersMap)")] - public void MergeWith(IReadOnlyList other) - { - foreach (var layer in other) - { - Add(layer); - } - } #endregion } public enum DependencyGraphVertextID : short { NULL = 0 } - public interface IDependencyGraph : IReadOnlyCollection + public interface IDependencyGraph : IReadOnlyCollection { ReadonlyDependenciesCollection Dependencies { get; } VertexID AddVertex(T vertex, bool isLocked); @@ -361,14 +385,14 @@ namespace DCFApixels.DragonECS.Core public void Dispose() { } } } - public unsafe partial class DependencyGraph : IDependencyGraph + public unsafe partial class DependencyGraph : IDependencyGraph { - private readonly Dictionary _vertexIDs = new Dictionary(32); + private readonly Dictionary _vertexIDs = new Dictionary(32); private StructList _vertexInfos = new StructList(32); private List<(VertexID from, VertexID to)> _dependencies = new List<(VertexID, VertexID)>(16); private readonly VertexID _basicVertexID; - private int _increment = 0; + private int _increment = 1; private int _count; #region Properties @@ -376,28 +400,30 @@ namespace DCFApixels.DragonECS.Core { get { return _count; } } - public ReadonlyDependenciesCollection Dependencies + public ReadonlyDependenciesCollection Dependencies { - get { return new ReadonlyDependenciesCollection(this, _dependencies); } + get { return new ReadonlyDependenciesCollection(this, _dependencies); } } #endregion #region Constructors public DependencyGraph() { - GetVertexID(""); + //GetVertexID(""); + _vertexInfos.Add(default); _basicVertexID = VertexID.NULL; } - public DependencyGraph(string basicVertexName) + public DependencyGraph(T basicVertexName) { - GetVertexID(""); + //GetVertexID(""); + _vertexInfos.Add(default); _basicVertexID = GetVertexID(basicVertexName); LockVertex(basicVertexName); } #endregion #region Methods - public VertexID GetVertexID(string vertext) + public VertexID GetVertexID(T vertext) { if (_vertexIDs.TryGetValue(vertext, out VertexID layerID) == false) { @@ -410,7 +436,7 @@ namespace DCFApixels.DragonECS.Core } return layerID; } - public string GetVertexFromID(VertexID vertexID) + public T GetVertexFromID(VertexID vertexID) { return GetVertexInfo(vertexID).value; } @@ -426,7 +452,7 @@ namespace DCFApixels.DragonECS.Core { return _vertexInfos.Count; } - public VertexID AddVertex(string vertex, bool isLocked) + public VertexID AddVertex(T vertex, bool isLocked) { var result = GetVertexID(vertex); AddVertexByID(result); @@ -436,7 +462,7 @@ namespace DCFApixels.DragonECS.Core } return result; } - private void LockVertex(string vertex) + private void LockVertex(T vertex) { LockVertex(GetVertexID(vertex)); } @@ -454,7 +480,7 @@ namespace DCFApixels.DragonECS.Core } info.insertionIndex = _increment++; } - public bool RemoveVertex(string vertex) + public bool RemoveVertex(T vertex) { var result = GetVertexID(vertex); return RemoveVertexByID(result); @@ -485,9 +511,9 @@ namespace DCFApixels.DragonECS.Core #endregion #region MergeWith - public void MergeWith(IDependencyGraph other) + public void MergeWith(IDependencyGraph other) { - if(other is DependencyGraph graph) + if(other is DependencyGraph graph) { foreach (var otherDependency in graph._dependencies) { @@ -511,7 +537,7 @@ namespace DCFApixels.DragonECS.Core #endregion #region Sort - public string[] Sort() + public T[] Sort() { const int BUFFER_THRESHOLD = 256; if (_count <= BUFFER_THRESHOLD) @@ -521,7 +547,7 @@ namespace DCFApixels.DragonECS.Core TopoSorting(buffer); ReoderInsertionIndexes(buffer); TopoSorting(buffer); - return ConvertIdsToStringsArray(buffer); + return ConvertIdsToTsArray(buffer); } else { @@ -530,7 +556,7 @@ namespace DCFApixels.DragonECS.Core TopoSorting(buffer); ReoderInsertionIndexes(buffer); TopoSorting(buffer); - return ConvertIdsToStringsArray(buffer); + return ConvertIdsToTsArray(buffer); } } private void TopoSorting(UnsafeArray sortingBuffer) @@ -660,14 +686,14 @@ namespace DCFApixels.DragonECS.Core } } - private static void MoveElement(ref UnsafeArray array, int oldIndex, int newIndex) where T : unmanaged + private static void MoveElement(ref UnsafeArray array, int oldIndex, int newIndex) where TValue : unmanaged { if (oldIndex == newIndex) return; var ptr = array.ptr; - T item = ptr[oldIndex]; + TValue item = ptr[oldIndex]; - int elementSize = sizeof(T); + int elementSize = sizeof(TValue); int copyLength = Math.Abs(newIndex - oldIndex); byte* source; @@ -690,9 +716,9 @@ namespace DCFApixels.DragonECS.Core ptr[newIndex] = item; } - private string[] ConvertIdsToStringsArray(UnsafeArray buffer) + private T[] ConvertIdsToTsArray(UnsafeArray buffer) { - string[] result = new string[buffer.Length]; + T[] result = new T[buffer.Length]; for (int i = 0; i < result.Length; i++) { result[i] = GetVertexInfo(buffer.ptr[i]).value; @@ -775,31 +801,31 @@ namespace DCFApixels.DragonECS.Core #endregion #region Other - public bool ContainsVertex(string vertex) + public bool ContainsVertex(T vertex) { return GetVertexInfo(GetVertexID(vertex)).isContained; } public Enumerator GetEnumerator() { return new Enumerator(this); } - IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } + IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } - public struct Enumerator : IEnumerator + public struct Enumerator : IEnumerator { - private DependencyGraph _map; + private DependencyGraph _graph; private int _index; - public Enumerator(DependencyGraph map) + public Enumerator(DependencyGraph graph) { - _map = map; + _graph = graph; _index = -1; } - public string Current + public T Current { - get { return _map.GetVertexInfo(_index).value; } + get { return _graph.GetVertexInfo(_index).value; } } object IEnumerator.Current { get { return Current; } } public bool MoveNext() { - if (_index++ >= _map.GetVertexInfosCount()) { return false; } - ref var info = ref _map.GetVertexInfo(_index); + if (_index++ >= _graph.GetVertexInfosCount()) { return false; } + ref var info = ref _graph.GetVertexInfo(_index); if(info.isContained == false) { return MoveNext(); @@ -818,7 +844,7 @@ namespace DCFApixels.DragonECS.Core [DebuggerDisplay("{value}")] private struct VertexInfo { - public string value; + public T value; public int insertionIndex; public bool isLocked; public bool isContained; @@ -828,7 +854,7 @@ namespace DCFApixels.DragonECS.Core public int inDegree; public int sortingIndex; public int leftBeforeIndex; - public VertexInfo(string name) : this() + public VertexInfo(T name) : this() { this.value = name; }