From 1b4cf66a9e79b63ed56d1c68982f6873417e440e Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 26 Jun 2024 01:35:40 +0800 Subject: [PATCH] update builder & serializable pipeline template --- src/EcsPipeline.Builder.cs | 68 ++++++++++++++++++++------- src/Utils/EcsPipelineTemplate.cs | 33 ++++++++----- src/Utils/EcsPipelineTemplate.cs.meta | 11 +++++ 3 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 src/Utils/EcsPipelineTemplate.cs.meta diff --git a/src/EcsPipeline.Builder.cs b/src/EcsPipeline.Builder.cs index 5fa416a..6582ccb 100644 --- a/src/EcsPipeline.Builder.cs +++ b/src/EcsPipeline.Builder.cs @@ -307,10 +307,9 @@ namespace DCFApixels.DragonECS private List _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 { 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; + } } } } diff --git a/src/Utils/EcsPipelineTemplate.cs b/src/Utils/EcsPipelineTemplate.cs index 0be1699..09c147e 100644 --- a/src/Utils/EcsPipelineTemplate.cs +++ b/src/Utils/EcsPipelineTemplate.cs @@ -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; + } + } } } diff --git a/src/Utils/EcsPipelineTemplate.cs.meta b/src/Utils/EcsPipelineTemplate.cs.meta new file mode 100644 index 0000000..2a0a334 --- /dev/null +++ b/src/Utils/EcsPipelineTemplate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a4f0bb3a054f20f4d937499044d58c20 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: