From 42ca90a6bcdd5e975396934579df401cdf966103 Mon Sep 17 00:00:00 2001 From: bd_ Date: Sun, 18 Feb 2024 21:56:59 +0900 Subject: [PATCH] fix: crash when undoing setup outfit (#680) Closes: #571 --- .../ArmatureAwase/BidirectionalArmatureLock.cs | 11 ++++++++--- Runtime/ArmatureAwase/DeferDestroy.cs | 18 ++++++++++++++++++ Runtime/ArmatureAwase/DeferDestroy.cs.meta | 3 +++ Runtime/ArmatureAwase/OnewayArmatureLock.cs | 15 +++++++++++---- 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 Runtime/ArmatureAwase/DeferDestroy.cs create mode 100644 Runtime/ArmatureAwase/DeferDestroy.cs.meta diff --git a/Runtime/ArmatureAwase/BidirectionalArmatureLock.cs b/Runtime/ArmatureAwase/BidirectionalArmatureLock.cs index a50e3328..46bca0b9 100644 --- a/Runtime/ArmatureAwase/BidirectionalArmatureLock.cs +++ b/Runtime/ArmatureAwase/BidirectionalArmatureLock.cs @@ -1,4 +1,6 @@ -using System; +#region + +using System; using System.Collections.Generic; using nadena.dev.modular_avatar.JacksonDunstan.NativeCollections; using Unity.Burst; @@ -7,6 +9,8 @@ using Unity.Jobs; using UnityEngine; using UnityEngine.Jobs; +#endregion + namespace nadena.dev.modular_avatar.core.armature_lock { internal class BidirectionalArmatureLock : IDisposable, IArmatureLock @@ -131,8 +135,9 @@ namespace nadena.dev.modular_avatar.core.armature_lock LastOp.Complete(); - _baseBoneAccess.Dispose(); - _mergeBoneAccess.Dispose(); + // work around crashes caused by destroying TransformAccessArray from within Undo processing + DeferDestroy.DeferDestroyObj(_baseBoneAccess); + DeferDestroy.DeferDestroyObj(_mergeBoneAccess); BaseBones.Dispose(); MergeBones.Dispose(); SavedMerge.Dispose(); diff --git a/Runtime/ArmatureAwase/DeferDestroy.cs b/Runtime/ArmatureAwase/DeferDestroy.cs new file mode 100644 index 00000000..0111edb0 --- /dev/null +++ b/Runtime/ArmatureAwase/DeferDestroy.cs @@ -0,0 +1,18 @@ +#region + +using System; + +#endregion + +namespace nadena.dev.modular_avatar.core.armature_lock +{ + internal static class DeferDestroy + { + internal static void DeferDestroyObj(IDisposable obj) + { +#if UNITY_EDITOR + UnityEditor.EditorApplication.delayCall += () => obj.Dispose(); +#endif + } + } +} \ No newline at end of file diff --git a/Runtime/ArmatureAwase/DeferDestroy.cs.meta b/Runtime/ArmatureAwase/DeferDestroy.cs.meta new file mode 100644 index 00000000..b54eb966 --- /dev/null +++ b/Runtime/ArmatureAwase/DeferDestroy.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 587f90fe407f4a8287c927c435d84880 +timeCreated: 1708260240 \ No newline at end of file diff --git a/Runtime/ArmatureAwase/OnewayArmatureLock.cs b/Runtime/ArmatureAwase/OnewayArmatureLock.cs index 2c07bcda..db96d9d9 100644 --- a/Runtime/ArmatureAwase/OnewayArmatureLock.cs +++ b/Runtime/ArmatureAwase/OnewayArmatureLock.cs @@ -1,4 +1,6 @@ -using System; +#region + +using System; using System.Collections.Generic; using nadena.dev.modular_avatar.JacksonDunstan.NativeCollections; using Unity.Burst; @@ -10,6 +12,8 @@ using UnityEngine.Jobs; using UnityEditor; #endif +#endregion + namespace nadena.dev.modular_avatar.core.armature_lock { internal class OnewayArmatureLock : IDisposable, IArmatureLock @@ -203,6 +207,8 @@ namespace nadena.dev.modular_avatar.core.armature_lock LastOp.Complete(); + _baseBonesAccessor.SetTransforms(_baseBones); + _mergeBonesAccessor.SetTransforms(_mergeBones); _fault.Value = 0; _wroteAny.Value = 0; @@ -293,7 +299,7 @@ namespace nadena.dev.modular_avatar.core.armature_lock public void Dispose() { if (_disposed) return; - + LastOp.Complete(); _boneStaticData.Dispose(); _mergeSavedState.Dispose(); @@ -301,8 +307,9 @@ namespace nadena.dev.modular_avatar.core.armature_lock _mergeState.Dispose(); _fault.Dispose(); _wroteAny.Dispose(); - _baseBonesAccessor.Dispose(); - _mergeBonesAccessor.Dispose(); + // work around crashes caused by destroying TransformAccessArray from within Undo processing + DeferDestroy.DeferDestroyObj(_baseBonesAccessor); + DeferDestroy.DeferDestroyObj(_mergeBonesAccessor); _disposed = true; #if UNITY_EDITOR