using System; using System.Collections.Generic; using System.Reflection; using UnityEngine.Rendering.RenderGraphModule; namespace UnityEngine.Rendering { /// /// The UI implementation for a debug settings panel /// public class DebugDisplaySettingsUI : IDebugData { private IEnumerable m_DisposablePanels; private IDebugDisplaySettings m_Settings; private void Reset() { if (m_Settings != null) { m_Settings.Reset(); ReregisterDebugPanels(); } } /// /// Unregisters and re-registers all DebugUI panels associated with the current . /// This effectively rebuilds the debug panel hierarchy without touching the Rendering Debugger window state itself. /// void ReregisterDebugPanels() { // TODO: Tear the UI down and re-create it for now - this is horrible, so reset it instead. UnregisterDebug(); RegisterDebug(m_Settings); } /// /// Register a display for the UI /// /// to be registered public void RegisterDebug(IDebugDisplaySettings settings) { DebugManager.instance.RegisterData(this); DebugManager.instance.onRecreateDebugUI += ReregisterDebugPanels; m_Settings = settings; m_Settings.Add(new DebugDisplaySettingsRenderGraph()); // Don't initialize the UI immediately to avoid unnecessary work at pipeline init time. Instaed, // initialize UI when any debug UI is opened (or if the editor window is already open) DebugManager.windowStateChanged += DebugUIOpened; if (DebugManager.instance.isAnyDebugUIActive) InitializeDebugUI(); } void DebugUIOpened(DebugManager.UIMode uiMode, bool isOpen) { InitializeDebugUI(); } internal void InitializeDebugUI() { if (m_DisposablePanels == null) { var panels = new List(); Action onExecute = (data) => { IDebugDisplaySettingsPanelDisposable disposableSettingsPanel = data.CreatePanel(); DebugUI.Widget[] panelWidgets = disposableSettingsPanel.Widgets; DebugUI.Panel panel = DebugManager.instance.GetPanel( displayName: disposableSettingsPanel.PanelName, createIfNull: true, groupIndex: (disposableSettingsPanel is DebugDisplaySettingsPanel debugDisplaySettingsPanel) ? debugDisplaySettingsPanel.Order : 0); #if UNITY_EDITOR if (DocumentationUtils.TryGetHelpURL(disposableSettingsPanel.GetType(), out var documentationUrl)) panel.documentationUrl = documentationUrl; #endif ObservableList panelChildren = panel.children; panel.flags = disposableSettingsPanel.Flags; panels.Add(disposableSettingsPanel); panelChildren.Add(panelWidgets); }; m_Settings.ForEach(onExecute); m_DisposablePanels = panels; DebugDisplaySerializer.LoadFoldoutStates(); } } /// /// Unregister the debug panels /// public void UnregisterDebug() { DebugDisplaySerializer.SaveFoldoutStates(); DebugManager debugManager = DebugManager.instance; if (m_DisposablePanels != null) { foreach (IDebugDisplaySettingsPanelDisposable disposableSettingsPanel in m_DisposablePanels) { DebugUI.Widget[] panelWidgets = disposableSettingsPanel.Widgets; string panelId = disposableSettingsPanel.PanelName; DebugUI.Panel panel = debugManager.GetPanel(panelId, true); ObservableList panelChildren = panel.children; disposableSettingsPanel.Dispose(); panelChildren.Remove(panelWidgets); } m_DisposablePanels = null; } debugManager.UnregisterData(this); debugManager.onRecreateDebugUI -= ReregisterDebugPanels; DebugManager.windowStateChanged -= DebugUIOpened; } #region IDebugData /// /// The reset action to be executed when a Reset of the rendering debugger is need /// /// A with the restet callback public Action GetReset() { return Reset; } #endregion } }