| 4459 | } |
| 4460 | |
| 4461 | void ImGui::Render() |
| 4462 | { |
| 4463 | ImGuiContext& g = *GImGui; |
| 4464 | IM_ASSERT(g.Initialized); |
| 4465 | |
| 4466 | if (g.FrameCountEnded != g.FrameCount) |
| 4467 | EndFrame(); |
| 4468 | g.FrameCountRendered = g.FrameCount; |
| 4469 | g.IO.MetricsRenderWindows = 0; |
| 4470 | |
| 4471 | CallContextHooks(&g, ImGuiContextHookType_RenderPre); |
| 4472 | |
| 4473 | // Add background ImDrawList (for each active viewport) |
| 4474 | for (int n = 0; n != g.Viewports.Size; n++) |
| 4475 | { |
| 4476 | ImGuiViewportP* viewport = g.Viewports[n]; |
| 4477 | viewport->DrawDataBuilder.Clear(); |
| 4478 | if (viewport->DrawLists[0] != NULL) |
| 4479 | AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); |
| 4480 | } |
| 4481 | |
| 4482 | // Add ImDrawList to render |
| 4483 | ImGuiWindow* windows_to_render_top_most[2]; |
| 4484 | windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL; |
| 4485 | windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingListWindow : NULL); |
| 4486 | for (int n = 0; n != g.Windows.Size; n++) |
| 4487 | { |
| 4488 | ImGuiWindow* window = g.Windows[n]; |
| 4489 | IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" |
| 4490 | if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1]) |
| 4491 | AddRootWindowToDrawData(window); |
| 4492 | } |
| 4493 | for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_top_most); n++) |
| 4494 | if (windows_to_render_top_most[n] && IsWindowActiveAndVisible(windows_to_render_top_most[n])) // NavWindowingTarget is always temporarily displayed as the top-most window |
| 4495 | AddRootWindowToDrawData(windows_to_render_top_most[n]); |
| 4496 | |
| 4497 | // Setup ImDrawData structures for end-user |
| 4498 | g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0; |
| 4499 | for (int n = 0; n < g.Viewports.Size; n++) |
| 4500 | { |
| 4501 | ImGuiViewportP* viewport = g.Viewports[n]; |
| 4502 | viewport->DrawDataBuilder.FlattenIntoSingleLayer(); |
| 4503 | |
| 4504 | // Draw software mouse cursor if requested by io.MouseDrawCursor flag |
| 4505 | if (g.IO.MouseDrawCursor) |
| 4506 | RenderMouseCursor(GetForegroundDrawList(viewport), g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48)); |
| 4507 | |
| 4508 | // Add foreground ImDrawList (for each active viewport) |
| 4509 | if (viewport->DrawLists[1] != NULL) |
| 4510 | AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); |
| 4511 | |
| 4512 | SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]); |
| 4513 | ImDrawData* draw_data = &viewport->DrawDataP; |
| 4514 | g.IO.MetricsRenderVertices += draw_data->TotalVtxCount; |
| 4515 | g.IO.MetricsRenderIndices += draw_data->TotalIdxCount; |
| 4516 | } |
| 4517 | |
| 4518 | CallContextHooks(&g, ImGuiContextHookType_RenderPost); |
nothing calls this directly
no test coverage detected