mirror of
https://github.com/bdunderscore/modular-avatar.git
synced 2025-04-24 21:38:59 +08:00
Fixed to not enter an infinite loop even if there is a circular reference
This commit is contained in:
parent
6b3e86f326
commit
0614379590
@ -24,6 +24,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
|
|
||||||
#if NEW
|
#if NEW
|
||||||
private MenuTree _menuTree;
|
private MenuTree _menuTree;
|
||||||
|
private Stack<ModularAvatarMenuInstaller> _visitedInstallerStack;
|
||||||
|
|
||||||
public void OnPreprocessAvatar(GameObject avatarRoot) {
|
public void OnPreprocessAvatar(GameObject avatarRoot) {
|
||||||
ModularAvatarMenuInstaller[] menuInstallers = avatarRoot.GetComponentsInChildren<ModularAvatarMenuInstaller>(true)
|
ModularAvatarMenuInstaller[] menuInstallers = avatarRoot.GetComponentsInChildren<ModularAvatarMenuInstaller>(true)
|
||||||
@ -33,6 +34,7 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
|
|
||||||
|
|
||||||
_clonedMenus = new Dictionary<VRCExpressionsMenu, VRCExpressionsMenu>();
|
_clonedMenus = new Dictionary<VRCExpressionsMenu, VRCExpressionsMenu>();
|
||||||
|
_visitedInstallerStack = new Stack<ModularAvatarMenuInstaller>();
|
||||||
|
|
||||||
VRCAvatarDescriptor avatar = avatarRoot.GetComponent<VRCAvatarDescriptor>();
|
VRCAvatarDescriptor avatar = avatarRoot.GetComponent<VRCAvatarDescriptor>();
|
||||||
|
|
||||||
@ -75,9 +77,13 @@ namespace nadena.dev.modular_avatar.core.editor
|
|||||||
|
|
||||||
SplitMenu(installer, targetMenu);
|
SplitMenu(installer, targetMenu);
|
||||||
|
|
||||||
|
if (_visitedInstallerStack.Contains(installer)) return;
|
||||||
|
_visitedInstallerStack.Push(installer);
|
||||||
foreach (MenuTree.ChildElement childElement in _menuTree.GetChildInstallers(installer)) {
|
foreach (MenuTree.ChildElement childElement in _menuTree.GetChildInstallers(installer)) {
|
||||||
InstallMenuToInstallerMenu(childElement.parent, childElement.installer);
|
InstallMenuToInstallerMenu(childElement.parent, childElement.installer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_visitedInstallerStack.Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InstallMenuToInstallerMenu(VRCExpressionsMenu installTarget, ModularAvatarMenuInstaller installer) {
|
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);
|
targetMenu.controls.AddRange(CloneMenu(installer.menuToAppend).controls);
|
||||||
|
|
||||||
SplitMenu(installer, targetMenu);
|
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) {
|
private void SplitMenu(ModularAvatarMenuInstaller installer, VRCExpressionsMenu targetMenu) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user