This commit is contained in:
Mikhail 2024-06-25 15:31:25 +08:00
parent 17bf26c366
commit 8722dd60be

View File

@ -84,7 +84,7 @@ namespace DCFApixels.DragonECS
{ {
return this; return this;
} }
list.Add(system, order); list.Add(system, order, isUnique);
if (system is IEcsModule module)//если система одновременно явялется и системой и модулем то за один Add будет вызван Add и AddModule if (system is IEcsModule module)//если система одновременно явялется и системой и модулем то за один Add будет вызван Add и AddModule
{ {
@ -130,12 +130,16 @@ namespace DCFApixels.DragonECS
selfList = new SystemsList(otherPair.Key); selfList = new SystemsList(otherPair.Key);
_systems.Add(otherPair.Key, selfList); _systems.Add(otherPair.Key, selfList);
} }
selfList.AddList(otherPair.Value); //selfList.AddList(otherPair.Value);
foreach (var otherSystem in otherPair.Value.Records)
{
AddInternal(otherSystem.system, otherPair.Key, otherSystem.order, otherSystem.isUnique);
}
} }
//TODO добавить проверку уникальных систем //TODO добавить проверку уникальных систем
//сливать множество уникальных нужно после слияния систем //сливать множество уникальных нужно после слияния систем
_uniqueTypes.UnionWith(other._uniqueTypes); //_uniqueTypes.UnionWith(other._uniqueTypes);
} }
#endregion #endregion
@ -438,33 +442,49 @@ namespace DCFApixels.DragonECS
public ReadOnlySpan<SystemRecord> Records { get { return new ReadOnlySpan<SystemRecord>(records, 1, recordsCount - 1); } } public ReadOnlySpan<SystemRecord> Records { get { return new ReadOnlySpan<SystemRecord>(records, 1, recordsCount - 1); } }
public SystemsList(string layerName) public SystemsList(string layerName)
{ {
Add(new SystemsLayerMarkerSystem(layerName), int.MinValue); Add(new SystemsLayerMarkerSystem(layerName), int.MinValue, false);
} }
public void AddList(SystemsList other) public void AddList(SystemsList other)
{ {
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];
Add(otherRecord.system, otherRecord.order); Add(otherRecord.system, otherRecord.order, otherRecord.isUnique);
} }
} }
public void Add(IEcsProcess system, int order) public void Add(IEcsProcess system, int order, bool isUnique)
{ {
if (records.Length <= recordsCount) if (records.Length <= recordsCount)
{ {
Array.Resize(ref records, recordsCount << 1); Array.Resize(ref records, recordsCount << 1);
} }
records[recordsCount++] = new SystemRecord(system, order); records[recordsCount++] = new SystemRecord(system, order, isUnique);
} }
public void RemoveAll<T>() public void RemoveAll<T>()
{ {
for (int i = 0; i < recordsCount; i++) //for (int i = 0; i < recordsCount; i++)
//{
// if (records[i].system is T)
// {
// records[i] = records[--recordsCount];
// }
//}
int freeIndex = 0;
while (freeIndex < recordsCount && (records[freeIndex].system is T) == false) { freeIndex++; }
if (freeIndex >= recordsCount) { return; }
int current = freeIndex + 1;
while (current < recordsCount)
{ {
if (records[i].system is T) while (current < recordsCount && (records[current].system is T)) { current++; }
if (current < recordsCount)
{ {
records[i] = records[--recordsCount]; records[freeIndex++] = records[current++];
} }
} }
recordsCount = freeIndex;
} }
public void Sort() public void Sort()
{ {
@ -476,10 +496,12 @@ namespace DCFApixels.DragonECS
{ {
public readonly IEcsProcess system; public readonly IEcsProcess system;
public readonly int order; public readonly int order;
public SystemRecord(IEcsProcess system, int order) public readonly bool isUnique;
public SystemRecord(IEcsProcess system, int order, bool isUnique)
{ {
this.system = system; this.system = system;
this.order = order; this.order = order;
this.isUnique = isUnique;
} }
public int CompareTo(SystemRecord other) { return order - other.order; } public int CompareTo(SystemRecord other) { return order - other.order; }
} }