using System; using System.Collections.Generic; using System.Text.RegularExpressions; using UnityEngine; using UnityEngine.XR; public class DisablePostProcessing : MVRScript { private JSONStorableBool disableOnSceneLoadJSB; private JSONStorableBool onlyDisableInVRJSB; private JSONStorableBool onlyDisableAAJSB; private JSONStorableBool silenceLogMessagesJSB; private JSONStorableBool disablePostMagicJSB; private JSONStorableBool removeMoyashiPP; private JSONStorableBool disableColortoneCUAAsset; private bool isVREnabled; SuperController.OnSceneLoaded sceneLoadedHandle; public override void Init() { try { if (XRSettings.enabled) isVREnabled = true; else isVREnabled = false; disableOnSceneLoadJSB = new JSONStorableBool("disableOnSceneLoad", true); silenceLogMessagesJSB = new JSONStorableBool("silenceLogging",false); onlyDisableInVRJSB = new JSONStorableBool("onlyDisableInVR", true); onlyDisableAAJSB = new JSONStorableBool("onlyDisableAA", false); disablePostMagicJSB = new JSONStorableBool("disablePostMagic", true); removeMoyashiPP = new JSONStorableBool("disableMoyashiPP", true); disableColortoneCUAAsset = new JSONStorableBool("disableColortoneCUA", true); RegisterBool(disableOnSceneLoadJSB); RegisterBool(silenceLogMessagesJSB); RegisterBool(onlyDisableInVRJSB); RegisterBool(disablePostMagicJSB); RegisterBool(removeMoyashiPP); RegisterBool(disableColortoneCUAAsset); var scanJSA = new JSONStorableAction("PostMagicScan", () => { ScanDisablePostMagicInScene(false, true); ScanRemoveMoyashiPostProcessingInScene(false, true); ScanDisableColortoneAssetInScene(false, true);}); RegisterAction(scanJSA); var disableJSA = new JSONStorableAction("PostMagicDisable", () => { ScanDisablePostMagicInScene(disablePostMagicJSB.val, disablePostMagicJSB.val); ScanRemoveMoyashiPostProcessingInScene(removeMoyashiPP.val, removeMoyashiPP.val); ScanDisableColortoneAssetInScene(disableColortoneCUAAsset.val, disableColortoneCUAAsset.val); }); RegisterAction(disableJSA); sceneLoadedHandle = new SuperController.OnSceneLoaded(OnSceneLoaded); SuperController.singleton.onSceneLoadedHandlers += sceneLoadedHandle; } catch (Exception e) { SuperController.LogError($"{nameof(DisablePostProcessing)}.{nameof(Init)}: {e}"); } } public void OnDestroy() { try { SuperController.singleton.onSceneLoadedHandlers -= sceneLoadedHandle; } catch (Exception e) { SuperController.LogError($"{nameof(DisablePostProcessing)}.{nameof(OnDestroy)}: {e}"); } } private void OnSceneLoaded() { try { ScanDisablePostMagicInScene(disableOnSceneLoadJSB.val && disablePostMagicJSB.val && (!onlyDisableInVRJSB.val || isVREnabled), !silenceLogMessagesJSB.val); ScanRemoveMoyashiPostProcessingInScene(disableOnSceneLoadJSB.val && removeMoyashiPP.val && (!onlyDisableInVRJSB.val || isVREnabled), !silenceLogMessagesJSB.val); ScanDisableColortoneAssetInScene(disableOnSceneLoadJSB.val && disableColortoneCUAAsset.val && (!onlyDisableInVRJSB.val || isVREnabled), !silenceLogMessagesJSB.val); } catch (Exception e) { SuperController.LogError($"{nameof(DisablePostProcessing)}.{nameof(OnSceneLoaded)}: {e}"); } } public void Start() { var scanButton = CreateButton("Scan for Post Processing in Scene"); scanButton.button.onClick.AddListener(delegate { ScanDisablePostMagicInScene(false, true, true); ScanRemoveMoyashiPostProcessingInScene(false, true, true); ScanDisableColortoneAssetInScene(false, true, true);}); var disableButton = CreateButton("Disable Post Processing in Scene"); disableButton.button.onClick.AddListener(delegate { ScanDisablePostMagicInScene(disablePostMagicJSB.val, disablePostMagicJSB.val, true); ScanRemoveMoyashiPostProcessingInScene(removeMoyashiPP.val, removeMoyashiPP.val, true); ScanDisableColortoneAssetInScene(disableColortoneCUAAsset.val, disableColortoneCUAAsset.val, true); }); CreateSpacer(); var toggle = CreateToggle(disablePostMagicJSB); toggle.label = "Disable Post Magic"; toggle.height = 75f; toggle = CreateToggle(removeMoyashiPP); toggle.label = "Remove Moyashi PP"; toggle.height = 75f; toggle = CreateToggle(disableColortoneCUAAsset); toggle.label = "Disable Colortone CUA"; toggle.height = 75f; CreateSpacer(); toggle = CreateToggle(disableOnSceneLoadJSB); toggle.label = "Auto disable Post Processing on Scene Load"; toggle.height = 75f; toggle = CreateToggle(onlyDisableInVRJSB); toggle.label = "Only Auto disable in VR"; toggle = CreateToggle(onlyDisableAAJSB); toggle.label = "Only disable Anti Aliasing in PostMagic"; toggle.height = 75f; toggle = CreateToggle(silenceLogMessagesJSB); toggle.label = "Silence Log Messaging on Auto disable"; toggle.height = 75f; var infoJSS = new JSONStorableString("info", "DisablePostMagic v1.1\nby JayJayWon\n\nThis plugin will detect instances of MacGruber's PostMagic plugin and optionally disable them. On occasions, PostMagic can cause visual effects that make it hard to use the VAM UI. When this happens, locating PostMagic in a multitude of Scene atoms can be challenging. This plugin can optionally auto disable PostMagic when any Scene Load occurs. There is also an option to ensure Auto disabling only occurs when using VR.\n\nThis plugin is designed to be run as a Session Plugin. To ensure that it runs at VAM startup, use 'Session Plugin Presets > Change User Defaults > Set current as User Defaults'. When any of the toggle options are modified, you will need to set the Session Plugin Preset User Default again, to ensure those option changes are persisted in the next VAM session."); var infoTextField = CreateTextField(infoJSS, true); infoTextField.height = 850f; } public void ScanDisablePostMagicInScene(bool disable, bool verbose, bool userInvoked = false) { var plugins = GetScenePlugins("MacGruber.PostMagic.Manager"); if (onlyDisableAAJSB.val) plugins = GetScenePlugins("MacGruber.PostMagic.AntiAliasing"); if (plugins.Count == 0) { if (userInvoked) SuperController.LogMessage("JayJayWon DisablePostMagic: No PostMagic plugin instances found"); } else { if (plugins.Count > 1) { SuperController.LogMessage("JayJayWon DisablePostMagic: Multiple instances of PostMagic were found in the current scene. There appears to be a bug in PostMagic that renders the VAMUI inaccessible if you disable a PostMagic plugin when there are multiple instances loaded. Remove one instance manually"); disable = false; } foreach (var plugin in plugins) { string atomName = "atom '" + plugin.containingAtom.name + "'"; if (plugin.containingAtom.name == "CoreControl") atomName = "Scene plugins"; if (disable) { if (plugin.enabledJSON.val) { if (verbose) SuperController.LogMessage("JayJayWon DisablePostMagic: Disabling '" + plugin.name + "' in " + atomName); plugin.enabledJSON.val = false; } else if (verbose) SuperController.LogMessage("JayJayWon DisablePostMagic: '" + plugin.name + "' already disabled in " + atomName); } else if (verbose) SuperController.LogMessage("JayJayWon DisablePostMagic: '" + plugin.name + "' detected in " + atomName); } } } // Unfortunately simply disabling Moyashi's plugin doesn't turn it off. Needs to be removed public void ScanRemoveMoyashiPostProcessingInScene(bool remove, bool verbose, bool userInvoked = false) { var plugins = GetScenePlugins("moyashi.PostProcessing"); if (plugins.Count == 0) { if (userInvoked) SuperController.LogMessage("JayJayWon DisablePostMagic: No Moyashi Post Processing plugin instances found"); } else { foreach (var plugin in plugins) { string atomName = "atom '" + plugin.containingAtom.name + "'"; if (plugin.containingAtom.name == "CoreControl") atomName = "Scene plugins"; if (remove) { if (verbose) SuperController.LogMessage("JayJayWon DisablePostMagic: Removing '" + plugin.name + "' in " + atomName); string pluginUIDPattern = @"plugin#([0-9]{1,4})"; Match match = Regex.Match(plugin.name, pluginUIDPattern); if (match.Success) { plugin.manager.RemovePluginWithUID(match.Value); } else { if (verbose || userInvoked) SuperController.LogMessage("JayJayWon DisablePostMagic: Could not determine plugin UID for '" + plugin.name + "' detected in " + atomName); } } else if (verbose) SuperController.LogMessage("JayJayWon DisablePostMagic: '" + plugin.name + "' detected in " + atomName); } } } public void ScanDisableColortoneAssetInScene(bool disable, bool verbose, bool userInvoked = false) { List cuas = GetCustomUnityAssets("TiSeb.Colortone"); if (cuas.Count == 0) { if (userInvoked) SuperController.LogMessage("JayJayWon DisablePostMagic: No Colortone Asset found."); } else { foreach (CustomUnityAssetLoader cu in cuas) { string atomName = "atom '" + cu.containingAtom.name + "'"; if (disable) { if (verbose) SuperController.LogMessage("JayJayWon DisablePostMagic: Disabling " + atomName); JSONStorableStringChooser assetName = cu.GetStringChooserJSONParam("assetName"); assetName.val = "None"; } else if (verbose) SuperController.LogMessage("JayJayWon DisablePostMagic: TiSeb.Colortone found on " + atomName); } } } public List GetSessionPlugins(string pluginTypeFilter = null) { List pluginList = new List(); foreach (Transform transform in manager.gameObject.transform.Find("Plugins")) { MVRScript script = transform.gameObject.GetComponent(); if (script != null && (pluginTypeFilter == null || script.name.EndsWith(pluginTypeFilter))) pluginList.Add(script); } return (pluginList); } public List GetScenePlugins(string pluginTypeFilter = null) { List pluginList = new List(); foreach (Atom atom in SuperController.singleton.GetAtoms()) { MVRPluginManager manager = atom.GetStorableByID("PluginManager") as MVRPluginManager; if (manager != null) { foreach (Transform transform in manager.gameObject.transform.Find("Plugins")) { MVRScript pluginStorable = transform.gameObject.GetComponent(); if (pluginStorable != null && (pluginTypeFilter == null || pluginStorable.name.EndsWith(pluginTypeFilter))) pluginList.Add(pluginStorable); } } } return (pluginList); } public List GetCustomUnityAssets(string assetUrlFilter = null) { List cuaAssets = new List(); CustomUnityAssetLoader[] loaders = FindObjectsOfType(); foreach (CustomUnityAssetLoader cuaLoader in loaders) { JSONStorableUrl assetUrl = cuaLoader.GetUrlJSONParam("assetUrl"); if (assetUrlFilter == null || assetUrl.val.Contains(assetUrlFilter)) { cuaAssets.Add(cuaLoader); } } return cuaAssets; } }