Files
Test/Library/PackageCache/com.unity.render-pipelines.core@13460d8ea9e5/Runtime/Debugging/RuntimePersistentDebugUI.cs
T
2026-11-01 23:39:55 +02:00

125 lines
4.5 KiB
C#

#if ENABLE_UIELEMENTS_MODULE && UNITY_ENABLE_CHECKS
#define ENABLE_RENDERING_DEBUGGER_UI
#endif
#if ENABLE_RENDERING_DEBUGGER_UI
using System.Collections.Generic;
using UnityEngine.UIElements;
namespace UnityEngine.Rendering
{
[AddComponentMenu("")] // Hide from Add Component menu
class RuntimePersistentDebugUI : MonoBehaviour
{
UIDocument m_Document;
VisualElement m_PersistentRoot;
readonly Dictionary<DebugUI.Value, VisualElement> m_Values = new();
readonly HashSet<DebugUI.ValueTuple> m_ValueTuples = new();
void Awake()
{
RecreateGUI();
}
void RecreateGUI()
{
var resources = GraphicsSettings.GetRenderPipelineSettings<RenderingDebuggerRuntimeResources>();
if (m_Document == null)
m_Document = gameObject.AddComponent<UIDocument>();
m_Document.panelSettings = resources.panelSettings;
var rootVisualElement = m_Document.rootVisualElement;
var styleSheets = resources.styleSheets;
foreach (var uss in styleSheets)
rootVisualElement.styleSheets.Add(uss);
// Prevent input
rootVisualElement.pickingMode = PickingMode.Ignore;
rootVisualElement.focusable = false;
rootVisualElement.tabIndex = -1;
var persistentRoot = new VisualElement();
persistentRoot.AddToClassList("debug-window-persistent-root");
rootVisualElement.Add(persistentRoot);
m_PersistentRoot = persistentRoot;
}
// Toggles persistent value widget on/off.
internal void Toggle(DebugUI.Value valueWidget, string displayName = null)
{
// Remove & return
if (m_Values.TryGetValue(valueWidget, out var existingVisualElement))
{
DebugManager.instance.schedulerTracker.SetEnabled(DebugUI.Context.RuntimePersistent, valueWidget, false);
m_Values.Remove(valueWidget);
m_PersistentRoot.Remove(existingVisualElement);
return;
}
// Add
var valueContainer = new VisualElement();
valueContainer.AddToClassList("debug-window-persistent-value-container");
var label = new Label(displayName);
label.AddToClassList("debug-window-persistent-value-name");
valueContainer.Add(label);
var value = valueWidget.ToVisualElement(DebugUI.Context.RuntimePersistent);
value.AddToClassList("debug-window-persistent-value-value");
valueContainer.Add(value);
m_PersistentRoot.Add(valueContainer);
m_Values.Add(valueWidget, valueContainer);
DebugManager.instance.schedulerTracker.SetEnabled(DebugUI.Context.RuntimePersistent, valueWidget, true);
}
// For ValueTuples (multiple values on one row), we cycle through the columns, and turn the widget
// off after the last column.
internal void Toggle(DebugUI.ValueTuple valueTupleWidget, int? forceTupleIndex = null)
{
int tupleIndex = valueTupleWidget.pinnedElementIndex;
// Clear old widget
if (m_ValueTuples.Contains(valueTupleWidget))
{
m_ValueTuples.Remove(valueTupleWidget);
Toggle(valueTupleWidget.values[tupleIndex]);
}
if (forceTupleIndex != null)
tupleIndex = forceTupleIndex.Value;
// Enable next widget (unless at the last index)
if (tupleIndex + 1 < valueTupleWidget.numElements)
{
valueTupleWidget.pinnedElementIndex = tupleIndex + 1;
// Add column to name
string displayName = valueTupleWidget.displayName;
if (valueTupleWidget.parent is DebugUI.Foldout foldout)
{
var columnLabels = foldout.columnLabels;
if (columnLabels != null && valueTupleWidget.pinnedElementIndex < columnLabels.Length)
{
displayName += $" ({columnLabels[valueTupleWidget.pinnedElementIndex]})";
}
}
Toggle(valueTupleWidget.values[valueTupleWidget.pinnedElementIndex], displayName);
m_ValueTuples.Add(valueTupleWidget);
}
else
{
valueTupleWidget.pinnedElementIndex = -1;
}
}
internal bool IsEmpty()
{
return m_Values.Count == 0;
}
}
}
#endif