update pipeline builder

This commit is contained in:
Mikhail 2024-08-07 10:40:31 +08:00
parent 48ceb16809
commit 0f11183f0f
2 changed files with 60 additions and 48 deletions

View File

@ -8,6 +8,24 @@ using static DCFApixels.DragonECS.EcsConsts;
namespace DCFApixels.DragonECS 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 sealed partial class EcsPipeline
{ {
public class Builder : IEcsModule public class Builder : IEcsModule
@ -52,21 +70,21 @@ namespace DCFApixels.DragonECS
#region Add #region Add
public Builder Add(IEcsProcess system, int? sortOrder = null) 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) 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) 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) 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; int sortOrder;
if (settedSortOrder.HasValue) if (settedSortOrder.HasValue)
@ -75,22 +93,22 @@ namespace DCFApixels.DragonECS
} }
else else
{ {
sortOrder = system is IEcsSystemDefaultSortOrder defaultSortOrder ? defaultSortOrder.SortOrder : _defaultOrder; sortOrder = system is IEcsAddSortOrder defaultSortOrder ? defaultSortOrder.SortOrder : _defaultOrder;
} }
if (string.IsNullOrEmpty(layerName)) 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 if (system is IEcsModule module)//если система одновременно явялется и системой и модулем то за один Add будет вызван Add и AddModule
{ {
AddModule(module); AddModule(module, layerName, settedSortOrder);
} }
return this; 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); SystemRecord record = new SystemRecord(system, layer, addOrder, sortOrder, isUnique);
if (_layerLists.TryGetValue(layer, out LayerSystemsList list) == false) if (_layerLists.TryGetValue(layer, out LayerSystemsList list) == false)
@ -111,13 +129,21 @@ namespace DCFApixels.DragonECS
#region AddModule #region AddModule
public Builder AddModule(IEcsModule module, int? sortOrder = null) 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) 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; string prevLayer = _defaultLayer;
int prevSortOrder = _defaultOrder; int prevSortOrder = _defaultOrder;
@ -128,11 +154,11 @@ namespace DCFApixels.DragonECS
} }
else else
{ {
_defaultOrder = module is IEcsSystemDefaultSortOrder defaultSortOrder ? defaultSortOrder.SortOrder : 0; _defaultOrder = module is IEcsAddSortOrder defaultSortOrder ? defaultSortOrder.SortOrder : 0;
} }
if (string.IsNullOrEmpty(layerName)) if (string.IsNullOrEmpty(layerName))
{ {
_defaultLayer = module is IEcsSystemDefaultLayer defaultLayer ? defaultLayer.Layer : BASIC_LAYER; _defaultLayer = module is IEcsAddLayer defaultLayer ? defaultLayer.Layer : BASIC_LAYER;
} }
else else
{ {
@ -172,7 +198,7 @@ namespace DCFApixels.DragonECS
//_systemRecordsInrement + otherRecord.addOrder смещает порядок так что новые системы встают в конец очереди, но сохраняют порядок addOrder //_systemRecordsInrement + otherRecord.addOrder смещает порядок так что новые системы встают в конец очереди, но сохраняют порядок addOrder
foreach (var otherRecord in other.SystemRecords) 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; _systemRecordsInrement += other._systemRecordsInrement;
} }
@ -511,6 +537,7 @@ namespace DCFApixels.DragonECS
public Item[] records = null; public Item[] records = null;
public int recordsCount = 0; public int recordsCount = 0;
//отслеживание осортированности систем
private int _lastSortOrder; private int _lastSortOrder;
private int _lastAddOrder; private int _lastAddOrder;
private bool _isSorted = true; private bool _isSorted = true;
@ -533,37 +560,33 @@ namespace DCFApixels.DragonECS
for (int i = 1; i < other.recordsCount; i++) for (int i = 1; i < other.recordsCount; i++)
{ {
var otherRecord = other.records[i]; var otherRecord = other.records[i];
AddItemInternal(otherRecord); AddItem_Internal(otherRecord);
} }
} }
public void Add(IEcsProcess system, int addOrder, int sortOrder, bool isUnique) 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 (_isSorted)
{ {
if (recordsCount <= 1) if (recordsCount <= 1)
{ {
_lastSortOrder = item.sortOrder; _lastSortOrder = item.sortOrder;
}
else if (_lastSortOrder != item.sortOrder)
{
_isSorted = false;
}
if (recordsCount <= 1)
{
_lastAddOrder = item.addOrder; _lastAddOrder = item.addOrder;
} }
else if (_lastAddOrder != item.addOrder) else if (_lastSortOrder > item.sortOrder || _lastAddOrder > item.addOrder)
{ {
_isSorted = false; _isSorted = false;
} }
else
{
_lastSortOrder = item.sortOrder;
_lastAddOrder = item.addOrder;
}
} }
if (records.Length <= recordsCount) if (records.Length <= recordsCount)
{ {
Array.Resize(ref records, recordsCount << 1); Array.Resize(ref records, recordsCount << 1);
@ -587,6 +610,8 @@ namespace DCFApixels.DragonECS
//Игнорирую первую систему, так как это чисто система с названием слоя //Игнорирую первую систему, так как это чисто система с названием слоя
Array.Sort(records, 1, recordsCount - 1); Array.Sort(records, 1, recordsCount - 1);
_isSorted = true; _isSorted = true;
_lastSortOrder = records[recordsCount - 1].sortOrder;
_lastAddOrder = records[recordsCount - 1].addOrder;
} }
} }
private readonly struct Item : IComparable<Item> private readonly struct Item : IComparable<Item>

View File

@ -6,33 +6,20 @@ using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using static DCFApixels.DragonECS.EcsConsts;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
[MetaColor(MetaColor.DragonRose)] [MetaColor(MetaColor.DragonRose)]
[MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.OTHER_GROUP)] [MetaGroup(PACK_GROUP, OTHER_GROUP)]
[MetaDescription(EcsConsts.AUTHOR, "...")] [MetaDescription(AUTHOR, "...")]
public interface IEcsPipelineMember : IEcsProcess public interface IEcsPipelineMember : IEcsProcess
{ {
EcsPipeline Pipeline { get; set; } EcsPipeline Pipeline { get; set; }
} }
[MetaColor(MetaColor.DragonRose)] [MetaColor(MetaColor.DragonRose)]
[MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.OTHER_GROUP)] [MetaGroup(PACK_GROUP, OTHER_GROUP)]
[MetaDescription(EcsConsts.AUTHOR, "...")] [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 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.")]
public sealed partial class EcsPipeline public sealed partial class EcsPipeline
{ {
private readonly IConfigContainer _configs; private readonly IConfigContainer _configs;
@ -274,8 +261,8 @@ namespace DCFApixels.DragonECS
#region SystemsLayerMarkerSystem #region SystemsLayerMarkerSystem
[MetaTags(MetaTags.HIDDEN)] [MetaTags(MetaTags.HIDDEN)]
[MetaColor(MetaColor.Black)] [MetaColor(MetaColor.Black)]
[MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.OTHER_GROUP)] [MetaGroup(PACK_GROUP, OTHER_GROUP)]
[MetaDescription(EcsConsts.AUTHOR, "An auxiliary type of system for dividing a pipeline into layers. This system is automatically added to the EcsPipeline.")] [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 class SystemsLayerMarkerSystem : IEcsProcess
{ {
public readonly string name; public readonly string name;