diff --git a/src/EcsPipeline.Builder.cs b/src/EcsPipeline.Builder.cs index 32be1ce..5a9d42f 100644 --- a/src/EcsPipeline.Builder.cs +++ b/src/EcsPipeline.Builder.cs @@ -8,6 +8,24 @@ using static DCFApixels.DragonECS.EcsConsts; namespace DCFApixels.DragonECS { + [MetaColor(MetaColor.DragonRose)] + [MetaGroup(PACK_GROUP, OTHER_GROUP)] + [MetaDescription(AUTHOR, "...")] + public interface IEcsAddLayer + { + string Layer { get; } + } + [MetaColor(MetaColor.DragonRose)] + [MetaGroup(PACK_GROUP, OTHER_GROUP)] + [MetaDescription(AUTHOR, "...")] + public interface IEcsAddSortOrder + { + int SortOrder { get; } + } + [MetaColor(MetaColor.DragonRose)] + [MetaGroup(PACK_GROUP, OTHER_GROUP)] + [MetaDescription(AUTHOR, "...")] + public interface IEcsAddUnique { } public sealed partial class EcsPipeline { public class Builder : IEcsModule @@ -52,21 +70,21 @@ namespace DCFApixels.DragonECS #region Add public Builder Add(IEcsProcess system, int? sortOrder = null) { - return AddInternal(system, string.Empty, sortOrder, false); + return AddSystem_Internal(system, string.Empty, sortOrder, false); } public Builder Add(IEcsProcess system, string layerName, int? sortOrder = null) { - return AddInternal(system, layerName, sortOrder, false); + return AddSystem_Internal(system, layerName, sortOrder, false); } public Builder AddUnique(IEcsProcess system, int? sortOrder = null) { - return AddInternal(system, string.Empty, sortOrder, true); + return AddSystem_Internal(system, string.Empty, sortOrder, true); } public Builder AddUnique(IEcsProcess system, string layerName, int? sortOrder = null) { - return AddInternal(system, layerName, sortOrder, true); + return AddSystem_Internal(system, layerName, sortOrder, true); } - private Builder AddInternal(IEcsProcess system, string layerName, int? settedSortOrder, bool isUnique) + private Builder AddSystem_Internal(IEcsProcess system, string layerName, int? settedSortOrder, bool isUnique) { int sortOrder; if (settedSortOrder.HasValue) @@ -75,22 +93,22 @@ namespace DCFApixels.DragonECS } else { - sortOrder = system is IEcsSystemDefaultSortOrder defaultSortOrder ? defaultSortOrder.SortOrder : _defaultOrder; + sortOrder = system is IEcsAddSortOrder defaultSortOrder ? defaultSortOrder.SortOrder : _defaultOrder; } if (string.IsNullOrEmpty(layerName)) { - layerName = system is IEcsSystemDefaultLayer defaultLayer ? defaultLayer.Layer : _defaultLayer; + layerName = system is IEcsAddLayer defaultLayer ? defaultLayer.Layer : _defaultLayer; } - AddRecordInternal(system, layerName, _systemRecordsInrement++, sortOrder, isUnique); + AddRecord_Internal(system, layerName, sortOrder, isUnique, _systemRecordsInrement++); if (system is IEcsModule module)//если система одновременно явялется и системой и модулем то за один Add будет вызван Add и AddModule { - AddModule(module); + AddModule(module, layerName, settedSortOrder); } return this; } - private void AddRecordInternal(IEcsProcess system, string layer, int addOrder, int sortOrder, bool isUnique) + private void AddRecord_Internal(IEcsProcess system, string layer, int sortOrder, bool isUnique, int addOrder) { SystemRecord record = new SystemRecord(system, layer, addOrder, sortOrder, isUnique); if (_layerLists.TryGetValue(layer, out LayerSystemsList list) == false) @@ -111,13 +129,21 @@ namespace DCFApixels.DragonECS #region AddModule public Builder AddModule(IEcsModule module, int? sortOrder = null) { - return AddModuleInternal(module, string.Empty, sortOrder); + return AddModule_Internal(module, string.Empty, sortOrder, false); } public Builder AddModule(IEcsModule module, string layerName, int? sortOrder = null) { - return AddModuleInternal(module, layerName, sortOrder); + return AddModule_Internal(module, layerName, sortOrder, false); } - public Builder AddModuleInternal(IEcsModule module, string layerName, int? settedSortOrder) + public Builder AddModuleUnique(IEcsModule module, int? sortOrder = null) + { + return AddModule_Internal(module, string.Empty, sortOrder, true); + } + public Builder AddModuleUnique(IEcsModule module, string layerName, int? sortOrder = null) + { + return AddModule_Internal(module, layerName, sortOrder, true); + } + public Builder AddModule_Internal(IEcsModule module, string layerName, int? settedSortOrder, bool isUnique) { string prevLayer = _defaultLayer; int prevSortOrder = _defaultOrder; @@ -128,11 +154,11 @@ namespace DCFApixels.DragonECS } else { - _defaultOrder = module is IEcsSystemDefaultSortOrder defaultSortOrder ? defaultSortOrder.SortOrder : 0; + _defaultOrder = module is IEcsAddSortOrder defaultSortOrder ? defaultSortOrder.SortOrder : 0; } if (string.IsNullOrEmpty(layerName)) { - _defaultLayer = module is IEcsSystemDefaultLayer defaultLayer ? defaultLayer.Layer : BASIC_LAYER; + _defaultLayer = module is IEcsAddLayer defaultLayer ? defaultLayer.Layer : BASIC_LAYER; } else { @@ -172,7 +198,7 @@ namespace DCFApixels.DragonECS //_systemRecordsInrement + otherRecord.addOrder смещает порядок так что новые системы встают в конец очереди, но сохраняют порядок addOrder foreach (var otherRecord in other.SystemRecords) { - AddRecordInternal(otherRecord.system, otherRecord.layer, _systemRecordsInrement + otherRecord.addOrder, otherRecord.sortOrder, otherRecord.isUnique); + AddRecord_Internal(otherRecord.system, otherRecord.layer, otherRecord.sortOrder, otherRecord.isUnique, _systemRecordsInrement + otherRecord.addOrder); } _systemRecordsInrement += other._systemRecordsInrement; } @@ -511,6 +537,7 @@ namespace DCFApixels.DragonECS public Item[] records = null; public int recordsCount = 0; + //отслеживание осортированности систем private int _lastSortOrder; private int _lastAddOrder; private bool _isSorted = true; @@ -533,37 +560,33 @@ namespace DCFApixels.DragonECS for (int i = 1; i < other.recordsCount; i++) { var otherRecord = other.records[i]; - AddItemInternal(otherRecord); + AddItem_Internal(otherRecord); } } public void Add(IEcsProcess system, int addOrder, int sortOrder, bool isUnique) { - AddItemInternal(new Item(system, addOrder, sortOrder, isUnique)); + AddItem_Internal(new Item(system, addOrder, sortOrder, isUnique)); } - private void AddItemInternal(Item item) + private void AddItem_Internal(Item item) { if (_isSorted) { if (recordsCount <= 1) { _lastSortOrder = item.sortOrder; - } - else if (_lastSortOrder != item.sortOrder) + _lastAddOrder = item.addOrder; + } + else if (_lastSortOrder > item.sortOrder || _lastAddOrder > item.addOrder) { _isSorted = false; } - - if (recordsCount <= 1) + else { + _lastSortOrder = item.sortOrder; _lastAddOrder = item.addOrder; } - else if (_lastAddOrder != item.addOrder) - { - _isSorted = false; - } } - if (records.Length <= recordsCount) { Array.Resize(ref records, recordsCount << 1); @@ -587,6 +610,8 @@ namespace DCFApixels.DragonECS //Игнорирую первую систему, так как это чисто система с названием слоя Array.Sort(records, 1, recordsCount - 1); _isSorted = true; + _lastSortOrder = records[recordsCount - 1].sortOrder; + _lastAddOrder = records[recordsCount - 1].addOrder; } } private readonly struct Item : IComparable diff --git a/src/EcsPipeline.cs b/src/EcsPipeline.cs index 76d14e8..0ee9451 100644 --- a/src/EcsPipeline.cs +++ b/src/EcsPipeline.cs @@ -6,33 +6,20 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; +using static DCFApixels.DragonECS.EcsConsts; namespace DCFApixels.DragonECS { [MetaColor(MetaColor.DragonRose)] - [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.OTHER_GROUP)] - [MetaDescription(EcsConsts.AUTHOR, "...")] + [MetaGroup(PACK_GROUP, OTHER_GROUP)] + [MetaDescription(AUTHOR, "...")] public interface IEcsPipelineMember : IEcsProcess { EcsPipeline Pipeline { get; set; } } [MetaColor(MetaColor.DragonRose)] - [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.OTHER_GROUP)] - [MetaDescription(EcsConsts.AUTHOR, "...")] - public interface IEcsSystemDefaultLayer : IEcsProcess - { - string Layer { get; } - } - [MetaColor(MetaColor.DragonRose)] - [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.OTHER_GROUP)] - [MetaDescription(EcsConsts.AUTHOR, "...")] - public interface IEcsSystemDefaultSortOrder : IEcsProcess - { - int SortOrder { get; } - } - [MetaColor(MetaColor.DragonRose)] - [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.OTHER_GROUP)] - [MetaDescription(EcsConsts.AUTHOR, "Container and engine for systems. Responsible for configuring the execution order of systems, providing a mechanism for messaging between systems, and a dependency injection mechanism.")] + [MetaGroup(PACK_GROUP, OTHER_GROUP)] + [MetaDescription(AUTHOR, "Container and engine for systems. Responsible for configuring the execution order of systems, providing a mechanism for messaging between systems, and a dependency injection mechanism.")] public sealed partial class EcsPipeline { private readonly IConfigContainer _configs; @@ -274,8 +261,8 @@ namespace DCFApixels.DragonECS #region SystemsLayerMarkerSystem [MetaTags(MetaTags.HIDDEN)] [MetaColor(MetaColor.Black)] - [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.OTHER_GROUP)] - [MetaDescription(EcsConsts.AUTHOR, "An auxiliary type of system for dividing a pipeline into layers. This system is automatically added to the EcsPipeline.")] + [MetaGroup(PACK_GROUP, OTHER_GROUP)] + [MetaDescription(AUTHOR, "An auxiliary type of system for dividing a pipeline into layers. This system is automatically added to the EcsPipeline.")] public class SystemsLayerMarkerSystem : IEcsProcess { public readonly string name;