update builder & serializable pipeline template

This commit is contained in:
Mikhail 2024-06-26 01:35:40 +08:00
parent 2f1ad7f530
commit 1b4cf66a9e
3 changed files with 85 additions and 27 deletions

View File

@ -307,10 +307,9 @@ namespace DCFApixels.DragonECS
private List<string> _layers;
private string _basicLayerName;
public int Count
{
get { return _layers.Count; }
}
public int Count { get { return _layers.Count; } }
public object this[int index] { get { return _layers[index]; } }
public LayerList(Builder source, string basicLayerName)
{
_source = source;
@ -492,7 +491,8 @@ namespace DCFApixels.DragonECS
public Item[] records = null;
public int recordsCount = 0;
private int _lastSortingOrder;
private int _lastSortOrder;
private int _lastAddOrder;
private bool _isSorted = true;
private string _layerName;
@ -516,20 +516,34 @@ namespace DCFApixels.DragonECS
AddItemInternal(otherRecord);
}
}
public void Add(IEcsProcess system, int addOrder, int sortingOrder, bool isUnique)
public void Add(IEcsProcess system, int addOrder, int sortOrder, bool isUnique)
{
if (recordsCount <= 1)
{
_lastSortingOrder = sortingOrder;
}
else if (_lastSortingOrder != sortingOrder)
{
_isSorted = false;
}
AddItemInternal(new Item(system, addOrder, sortingOrder, isUnique));
AddItemInternal(new Item(system, addOrder, sortOrder, isUnique));
}
private void AddItemInternal(Item item)
{
if (_isSorted)
{
if (recordsCount <= 1)
{
_lastSortOrder = item.sortOrder;
}
else if (_lastSortOrder != item.sortOrder)
{
_isSorted = false;
}
if (recordsCount <= 1)
{
_lastAddOrder = item.addOrder;
}
else if (_lastAddOrder != item.addOrder)
{
_isSorted = false;
}
}
if (records.Length <= recordsCount)
{
Array.Resize(ref records, recordsCount << 1);
@ -576,8 +590,25 @@ namespace DCFApixels.DragonECS
}
#endregion
#region SerializableTemplate
public EcsPipelineTemplate GenerateSerializableTemplate()
{
Array.Sort(_systemRecords, 0, _systemRecordsCount);
var records = SystemRecords;
EcsPipelineTemplate result = new EcsPipelineTemplate();
result.layers = new string[Layers.Count];
result.systems = new EcsPipelineTemplate.SystemRecord[records.Length];
for (int i = 0; i < records.Length; i++)
{
var r = records[i];
result.systems[i] = new EcsPipelineTemplate.SystemRecord(r.system, r.layer, r.sortOrder, r.isUnique);
}
private readonly struct SystemRecord
return result;
}
#endregion
private readonly struct SystemRecord : IComparable<SystemRecord>
{
public readonly IEcsProcess system;
public readonly string layer;
@ -592,6 +623,11 @@ namespace DCFApixels.DragonECS
this.sortOrder = sortOrder;
this.isUnique = isUnique;
}
public int CompareTo(SystemRecord other)
{
int c = sortOrder - other.sortOrder;
return c == 0 ? addOrder - other.addOrder : c;
}
}
}
}

View File

@ -9,11 +9,13 @@ namespace DCFApixels.DragonECS
{
[DataMember] public string[] layers;
[DataMember] public SystemRecord[] systems;
public void Import(EcsPipeline.Builder b)
void IEcsModule.Import(EcsPipeline.Builder b)
{
b.Layers.MergeWith(layers);
foreach (var s in systems)
{
if (s.system == null) { continue; }
int? sortOrder = s.isCustomSortOrder ? s.sortOrder : default(int?);
if (s.isUnique)
{
@ -25,16 +27,25 @@ namespace DCFApixels.DragonECS
}
}
}
}
[Serializable]
[DataContract]
public struct SystemRecord
{
[DataMember] public IEcsProcess system;
[DataMember] public string layer;
[DataMember] public int sortOrder;
[DataMember] public bool isCustomSortOrder;
[DataMember] public bool isUnique;
[Serializable]
[DataContract]
public struct SystemRecord
{
[DataMember] public IEcsProcess system;
[DataMember] public string layer;
[DataMember] public int sortOrder;
[DataMember] public bool isCustomSortOrder;
[DataMember] public bool isUnique;
public int? NullableSortOrder { get { return isCustomSortOrder ? sortOrder : default(int?); } }
public SystemRecord(IEcsProcess system, string layer, int? sortOrder, bool isUnique)
{
this.system = system;
this.layer = layer;
this.sortOrder = sortOrder.HasValue ? sortOrder.Value : 0;
isCustomSortOrder = sortOrder.HasValue;
this.isUnique = isUnique;
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a4f0bb3a054f20f4d937499044d58c20
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: