Allow CharacterCreated and CharacterUpdated to themselves cause additional updates. With fastGeneration, *keep* updating, even if updates generate updates, don't just do 2 updates. --- .../UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs | 4 +- .../UMA/Scripts/UMAGeneratorBuiltin.cs | 54 ++++++++++++++-------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs b/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs index 2b9dff7..ce3e0fa 100644 --- a/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs +++ b/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAData.cs @@ -976,7 +976,8 @@ namespace UMA /// public void FireUpdatedEvent(bool cancelled) { - this.cancelled = cancelled; + dirty = false; + this.cancelled = cancelled; if (!this.cancelled && !isOfficiallyCreated) { isOfficiallyCreated = true; @@ -989,7 +990,6 @@ namespace UMA { CharacterUpdated.Invoke(this); } - dirty = false; } public void ApplyDNA() diff --git a/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAGeneratorBuiltin.cs b/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAGeneratorBuiltin.cs index 0cd407e..0e7ec96 100644 --- a/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAGeneratorBuiltin.cs +++ b/Assets/UMA/Core/StandardAssets/UMA/Scripts/UMAGeneratorBuiltin.cs @@ -178,15 +178,19 @@ namespace UMA public virtual bool HandleDirtyUpdate(UMAData data) { - if (data == null) - return true; + if (data == null) { + RemoveDirty(false); + return true; + } if (umaData != data) { umaData = data; - if (!umaData.Validate()) - return true; + if (!umaData.Validate()) { + RemoveDirty(false); + return true; + } if (meshCombiner != null) { @@ -238,27 +242,37 @@ namespace UMA umaData.isShapeDirty = false; DnaChanged++; } - UMAReady(); + RemoveDirty(true); return true; } - public virtual void OnDirtyUpdate() + void RemoveDirty(bool succeeded) + { + umaDirtyList.RemoveAt(0); + umaData.MoveToList(cleanUmas); + if (succeeded) + UMAReady(); + umaData = null; + } + + public virtual void OnDirtyUpdate() { - if (HandleDirtyUpdate(umaDirtyList[0])) - { - umaDirtyList.RemoveAt(0); - umaData.MoveToList(cleanUmas); - umaData = null; - } - else if (fastGeneration && HandleDirtyUpdate(umaDirtyList[0])) + if (fastGeneration) { - umaDirtyList.RemoveAt(0); - umaData.MoveToList(cleanUmas); - umaData = null; - } - } - - private void UpdateUMAMesh(bool updatedAtlas) + // Each one, once, and make sure if the updates are generating updates, we still stop eventually. + var i=0; + var max = umaDirtyList.Count * 8; + while (i < umaDirtyList.Count) { + if (!HandleDirtyUpdate(umaDirtyList[0])) + i++; + if (max-- <= 0) break; + } + } else { + HandleDirtyUpdate(umaDirtyList[0]); + } + } + + private void UpdateUMAMesh(bool updatedAtlas) { if (meshCombiner != null) { -- 2.10.2.windows.1