unsafe void RenderCommandLists(ImDrawDataPtr drawData) { // Scale coordinates for retina displays (screen coordinates != framebuffer coordinates) int fbWidth = (int)(drawData.DisplaySize.X * drawData.FramebufferScale.X); int fbHeight = (int)(drawData.DisplaySize.Y * drawData.FramebufferScale.Y); // Avoid rendering if display is minimized or if the command list is empty if (fbWidth <= 0 || fbHeight <= 0 || drawData.CmdListsCount == 0) { return; } drawData.ScaleClipRects(ImGui.GetIO().DisplayFramebufferScale); Rlgl.rlDisableBackfaceCulling(); for (int n = 0; n < drawData.CmdListsCount; n++) { ImDrawListPtr cmdList = drawData.CmdListsRange[n]; // Vertex buffer and index buffer generated by Dear ImGui ImPtrVector <ImDrawVertPtr> vtxBuffer = cmdList.VtxBuffer; ImVector <ushort> idxBuffer = cmdList.IdxBuffer; for (int cmdi = 0; cmdi < cmdList.CmdBuffer.Size; cmdi++) { ImDrawCmdPtr pcmd = cmdList.CmdBuffer[cmdi]; if (pcmd.UserCallback != IntPtr.Zero) { // pcmd.UserCallback(cmdList, pcmd); } else { Vector2 pos = drawData.DisplayPos; int rectX = (int)((pcmd.ClipRect.X - pos.X) * drawData.FramebufferScale.X); int rectY = (int)((pcmd.ClipRect.Y - pos.Y) * drawData.FramebufferScale.Y); int rectW = (int)((pcmd.ClipRect.Z - rectX) * drawData.FramebufferScale.X); int rectH = (int)((pcmd.ClipRect.W - rectY) * drawData.FramebufferScale.Y); if (rectX < fbWidth && rectY < fbHeight && rectW >= 0.0f && rectH >= 0.0f) { Raylib.BeginScissorMode(rectX, rectY, rectW, rectH); DrawTriangles(pcmd.ElemCount, idxBuffer, vtxBuffer, (int)pcmd.IdxOffset, (int)pcmd.VtxOffset, pcmd.TextureId); } } } } Raylib.EndScissorMode(); Rlgl.rlEnableBackfaceCulling(); }