From ab2761a30fef596579718ef7093ea141a29a37f0 Mon Sep 17 00:00:00 2001 From: bd_ Date: Sun, 18 Dec 2022 13:19:09 +0900 Subject: [PATCH] Avoid recursive reprocessing of avatars --- .../Editor/AvatarProcessor.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Packages/nadena.dev.modular-avatar/Editor/AvatarProcessor.cs b/Packages/nadena.dev.modular-avatar/Editor/AvatarProcessor.cs index 3e62f89a..3ed54d4e 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/AvatarProcessor.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/AvatarProcessor.cs @@ -40,6 +40,12 @@ namespace nadena.dev.modular_avatar.core.editor // Place after EditorOnly processing (which runs at -1024) but hopefully before most other user callbacks public int callbackOrder => -25; + /// + /// Avoid recursive activation of avatar processing by suppressing starting processing while processing is + /// already in progress. + /// + private static bool nowProcessing = false; + public delegate void AvatarProcessorCallback(GameObject obj); /// @@ -117,11 +123,15 @@ namespace nadena.dev.modular_avatar.core.editor public static void ProcessAvatar(GameObject avatarGameObject) { - BoneDatabase.ResetBones(); - PathMappings.Clear(); + if (nowProcessing) return; try { + nowProcessing = true; + + BoneDatabase.ResetBones(); + PathMappings.Clear(); + // Sometimes people like to nest one avatar in another, when transplanting clothing. To avoid issues // with inconsistently determining the avatar root, we'll go ahead and remove the extra sub-avatars // here. @@ -149,9 +159,13 @@ namespace nadena.dev.modular_avatar.core.editor PhysboneBlockerPass.Process(avatarGameObject); AfterProcessing?.Invoke(avatarGameObject); + + FixupAnimatorDebugData(avatarGameObject); } finally { + nowProcessing = false; + // Ensure that we clean up AvatarTagComponents after failed processing. This ensures we don't re-enter // processing from the Awake method on the unprocessed AvatarTagComponents foreach (var component in avatarGameObject.GetComponentsInChildren(true)) @@ -159,8 +173,6 @@ namespace nadena.dev.modular_avatar.core.editor UnityEngine.Object.DestroyImmediate(component); } } - - FixupAnimatorDebugData(avatarGameObject); } [SuppressMessage("ReSharper", "PossibleNullReferenceException")]