public static void ShowWindow(ref bool windowOpened) { if (!GUI.Begin(WindowName, ref windowOpened)) { GUI.End(); return; } // Basic info GUIContext g = GetCurrentContext(); Text("Hello ImGui {0}##Metrics.Version", GetVersion()); Text("Application average {0:F3} ms/frame ({1:F1} FPS)##Metrics.FPS", 1000.0f / g.fps, g.fps); Text("{0} vertices, {1} indices ({2} triangles)##Metrics.VI", VertexNumber, IndexNumber, IndexNumber / 3); Text("{0} active windows ({0} visible)##Metrics.Window", ActiveWindows, RenderWindows); Separator("separator0"); //Windows var windowManager = g.WindowManager; NodeWindows(windowManager.Windows.ToArray(), "Windows"); //Internal state if (TreeNode("Internal state")) { var w = g.WindowManager; Text("HoveredWindow: '{0}'", w.HoveredWindow != null ? w.HoveredWindow.Name : "null"); Text("HoveredRootWindow: '{0}'", w.HoveredRootWindow != null ? w.HoveredRootWindow.Name : "null"); // Data is "in-flight" so depending on when the Metrics window is called we may see // current frame information or not Text("HoveredId: {0:X8}/{1:X8}, AllowOverlap: {2}", g.HoverId, g.HoveredIdPreviousFrame, g.HoverIdAllowOverlap); Text("ActiveId: {0:X8}/{1:X8}, AllowOverlap: {2}", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdAllowOverlap); Text("ActiveIdWindow: '{0}'", w.ActiveIdWindow != null ? w.ActiveIdWindow.Name : "null"); Text("MovingWindow: '{0}'", w.MovingWindow != null ? w.MovingWindow.Name : "null"); TreePop(); } if (TreeNode("Tools")) { // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted. if (Button("Item Picker..")) { lastPickedItemId = 0; g.DebugStartItemPicker(); } if (g.DebugItemPickerBreakID != 0) { lastPickedItemId = g.DebugItemPickerBreakID; } if (lastPickedItemId != 0) { //get picked node Node pickedNode = null; var w = g.WindowManager.Windows; foreach (var window in w) { var node = window.RenderTree.GetNodeById(lastPickedItemId); if (node != null) { pickedNode = node; break; } } DoBoxModel(pickedNode); } else if (g.HoveredIdPreviousFrame != 0) { //get picking node Node pickingNode = null; var w = g.WindowManager.Windows; foreach (var window in w) { var node = window.RenderTree.GetNodeById(g.HoveredIdPreviousFrame); if (node != null) { pickingNode = node; break; } } DoBoxModel(pickingNode); } TreePop(); } GUI.End(); }