| 2987 | } |
| 2988 | |
| 2989 | void ImGui::Render() |
| 2990 | { |
| 2991 | ImGuiContext& g = *GImGui; |
| 2992 | IM_ASSERT(g.Initialized); // Forgot to call ImGui::NewFrame() |
| 2993 | |
| 2994 | if (g.FrameCountEnded != g.FrameCount) |
| 2995 | ImGui::EndFrame(); |
| 2996 | g.FrameCountRendered = g.FrameCount; |
| 2997 | |
| 2998 | // Skip render altogether if alpha is 0.0 |
| 2999 | // Note that vertex buffers have been created and are wasted, so it is best practice that you don't create windows in the first place, or consistently respond to Begin() returning false. |
| 3000 | if (g.Style.Alpha > 0.0f) |
| 3001 | { |
| 3002 | // Gather windows to render |
| 3003 | g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = g.IO.MetricsActiveWindows = 0; |
| 3004 | for (int i = 0; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) |
| 3005 | g.RenderDrawLists[i].resize(0); |
| 3006 | for (int i = 0; i != g.Windows.Size; i++) |
| 3007 | { |
| 3008 | ImGuiWindow* window = g.Windows[i]; |
| 3009 | if (window->Active && window->HiddenFrames <= 0 && (window->Flags & (ImGuiWindowFlags_ChildWindow)) == 0) |
| 3010 | AddWindowToRenderListSelectLayer(window); |
| 3011 | } |
| 3012 | |
| 3013 | // Flatten layers |
| 3014 | int n = g.RenderDrawLists[0].Size; |
| 3015 | int flattened_size = n; |
| 3016 | for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) |
| 3017 | flattened_size += g.RenderDrawLists[i].Size; |
| 3018 | g.RenderDrawLists[0].resize(flattened_size); |
| 3019 | for (int i = 1; i < IM_ARRAYSIZE(g.RenderDrawLists); i++) |
| 3020 | { |
| 3021 | ImVector<ImDrawList*>& layer = g.RenderDrawLists[i]; |
| 3022 | if (layer.empty()) |
| 3023 | continue; |
| 3024 | memcpy(&g.RenderDrawLists[0][n], &layer[0], layer.Size * sizeof(ImDrawList*)); |
| 3025 | n += layer.Size; |
| 3026 | } |
| 3027 | |
| 3028 | // Draw software mouse cursor if requested |
| 3029 | if (g.IO.MouseDrawCursor) |
| 3030 | { |
| 3031 | const ImGuiMouseCursorData& cursor_data = g.MouseCursorData[g.MouseCursor]; |
| 3032 | const ImVec2 pos = g.IO.MousePos - cursor_data.HotOffset; |
| 3033 | const ImVec2 size = cursor_data.Size; |
| 3034 | const ImTextureID tex_id = g.IO.Fonts->TexID; |
| 3035 | g.OverlayDrawList.PushTextureID(tex_id); |
| 3036 | g.OverlayDrawList.AddImage(tex_id, pos+ImVec2(1,0), pos+ImVec2(1,0) + size, cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,48)); // Shadow |
| 3037 | g.OverlayDrawList.AddImage(tex_id, pos+ImVec2(2,0), pos+ImVec2(2,0) + size, cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,48)); // Shadow |
| 3038 | g.OverlayDrawList.AddImage(tex_id, pos, pos + size, cursor_data.TexUvMin[1], cursor_data.TexUvMax[1], IM_COL32(0,0,0,255)); // Black border |
| 3039 | g.OverlayDrawList.AddImage(tex_id, pos, pos + size, cursor_data.TexUvMin[0], cursor_data.TexUvMax[0], IM_COL32(255,255,255,255)); // White fill |
| 3040 | g.OverlayDrawList.PopTextureID(); |
| 3041 | } |
| 3042 | if (!g.OverlayDrawList.VtxBuffer.empty()) |
| 3043 | AddDrawListToRenderList(g.RenderDrawLists[0], &g.OverlayDrawList); |
| 3044 | |
| 3045 | // Setup draw data |
| 3046 | g.RenderDrawData.Valid = true; |
nothing calls this directly
no test coverage detected