From 0614379590eaf3ccc61761ee72e9cbbf2b515459 Mon Sep 17 00:00:00 2001 From: raiti-chan Date: Sat, 17 Dec 2022 00:21:08 +0900 Subject: [PATCH] Fixed to not enter an infinite loop even if there is a circular reference --- .../Editor/MenuInstallHook.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Packages/nadena.dev.modular-avatar/Editor/MenuInstallHook.cs b/Packages/nadena.dev.modular-avatar/Editor/MenuInstallHook.cs index 2e904902..ea050890 100644 --- a/Packages/nadena.dev.modular-avatar/Editor/MenuInstallHook.cs +++ b/Packages/nadena.dev.modular-avatar/Editor/MenuInstallHook.cs @@ -24,6 +24,7 @@ namespace nadena.dev.modular_avatar.core.editor #if NEW private MenuTree _menuTree; + private Stack _visitedInstallerStack; public void OnPreprocessAvatar(GameObject avatarRoot) { ModularAvatarMenuInstaller[] menuInstallers = avatarRoot.GetComponentsInChildren(true) @@ -33,6 +34,7 @@ namespace nadena.dev.modular_avatar.core.editor _clonedMenus = new Dictionary(); + _visitedInstallerStack = new Stack(); VRCAvatarDescriptor avatar = avatarRoot.GetComponent(); @@ -75,9 +77,13 @@ namespace nadena.dev.modular_avatar.core.editor SplitMenu(installer, targetMenu); + if (_visitedInstallerStack.Contains(installer)) return; + _visitedInstallerStack.Push(installer); foreach (MenuTree.ChildElement childElement in _menuTree.GetChildInstallers(installer)) { InstallMenuToInstallerMenu(childElement.parent, childElement.installer); } + + _visitedInstallerStack.Pop(); } private void InstallMenuToInstallerMenu(VRCExpressionsMenu installTarget, ModularAvatarMenuInstaller installer) { @@ -95,6 +101,14 @@ namespace nadena.dev.modular_avatar.core.editor targetMenu.controls.AddRange(CloneMenu(installer.menuToAppend).controls); SplitMenu(installer, targetMenu); + + if (_visitedInstallerStack.Contains(installer)) return; + _visitedInstallerStack.Push(installer); + foreach (MenuTree.ChildElement childElement in _menuTree.GetChildInstallers(installer)) { + InstallMenuToInstallerMenu(childElement.parent, childElement.installer); + } + + _visitedInstallerStack.Pop(); } private void SplitMenu(ModularAvatarMenuInstaller installer, VRCExpressionsMenu targetMenu) {