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 List<string> _layers;
private string _basicLayerName; private string _basicLayerName;
public int Count public int Count { get { return _layers.Count; } }
{ public object this[int index] { get { return _layers[index]; } }
get { return _layers.Count; }
}
public LayerList(Builder source, string basicLayerName) public LayerList(Builder source, string basicLayerName)
{ {
_source = source; _source = source;
@ -492,7 +491,8 @@ namespace DCFApixels.DragonECS
public Item[] records = null; public Item[] records = null;
public int recordsCount = 0; public int recordsCount = 0;
private int _lastSortingOrder; private int _lastSortOrder;
private int _lastAddOrder;
private bool _isSorted = true; private bool _isSorted = true;
private string _layerName; private string _layerName;
@ -516,20 +516,34 @@ namespace DCFApixels.DragonECS
AddItemInternal(otherRecord); 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) AddItemInternal(new Item(system, addOrder, sortOrder, isUnique));
{
_lastSortingOrder = sortingOrder;
}
else if (_lastSortingOrder != sortingOrder)
{
_isSorted = false;
}
AddItemInternal(new Item(system, addOrder, sortingOrder, isUnique));
} }
private void AddItemInternal(Item item) 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) if (records.Length <= recordsCount)
{ {
Array.Resize(ref records, recordsCount << 1); Array.Resize(ref records, recordsCount << 1);
@ -576,8 +590,25 @@ namespace DCFApixels.DragonECS
} }
#endregion #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 IEcsProcess system;
public readonly string layer; public readonly string layer;
@ -592,6 +623,11 @@ namespace DCFApixels.DragonECS
this.sortOrder = sortOrder; this.sortOrder = sortOrder;
this.isUnique = isUnique; 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 string[] layers;
[DataMember] public SystemRecord[] systems; [DataMember] public SystemRecord[] systems;
public void Import(EcsPipeline.Builder b) void IEcsModule.Import(EcsPipeline.Builder b)
{ {
b.Layers.MergeWith(layers); b.Layers.MergeWith(layers);
foreach (var s in systems) foreach (var s in systems)
{ {
if (s.system == null) { continue; }
int? sortOrder = s.isCustomSortOrder ? s.sortOrder : default(int?); int? sortOrder = s.isCustomSortOrder ? s.sortOrder : default(int?);
if (s.isUnique) if (s.isUnique)
{ {
@ -25,16 +27,25 @@ namespace DCFApixels.DragonECS
} }
} }
} }
}
[Serializable] [Serializable]
[DataContract] [DataContract]
public struct SystemRecord public struct SystemRecord
{ {
[DataMember] public IEcsProcess system; [DataMember] public IEcsProcess system;
[DataMember] public string layer; [DataMember] public string layer;
[DataMember] public int sortOrder; [DataMember] public int sortOrder;
[DataMember] public bool isCustomSortOrder; [DataMember] public bool isCustomSortOrder;
[DataMember] public bool isUnique; [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: