| 1485 | /// Renders primitive shapes in bulk as efficiently as possible. |
| 1486 | template <class _Renderer> |
| 1487 | void RenderPrimitivesEx(const _Renderer& renderer, ImDrawList& draw_list, const ImRect& cull_rect) { |
| 1488 | unsigned int prims = renderer.Prims; |
| 1489 | unsigned int prims_culled = 0; |
| 1490 | unsigned int idx = 0; |
| 1491 | renderer.Init(draw_list); |
| 1492 | while (prims) { |
| 1493 | // find how many can be reserved up to end of current draw command's limit |
| 1494 | unsigned int cnt = ImMin(prims, (MaxIdx<ImDrawIdx>::Value - draw_list._VtxCurrentIdx) / renderer.VtxConsumed); |
| 1495 | // make sure at least this many elements can be rendered to avoid situations where at the end of buffer this slow path is not taken all the time |
| 1496 | if (cnt >= ImMin(64u, prims)) { |
| 1497 | if (prims_culled >= cnt) |
| 1498 | prims_culled -= cnt; // reuse previous reservation |
| 1499 | else { |
| 1500 | // add more elements to previous reservation |
| 1501 | draw_list.PrimReserve((cnt - prims_culled) * renderer.IdxConsumed, (cnt - prims_culled) * renderer.VtxConsumed); |
| 1502 | prims_culled = 0; |
| 1503 | } |
| 1504 | } |
| 1505 | else |
| 1506 | { |
| 1507 | if (prims_culled > 0) { |
| 1508 | draw_list.PrimUnreserve(prims_culled * renderer.IdxConsumed, prims_culled * renderer.VtxConsumed); |
| 1509 | prims_culled = 0; |
| 1510 | } |
| 1511 | cnt = ImMin(prims, (MaxIdx<ImDrawIdx>::Value - 0/*draw_list._VtxCurrentIdx*/) / renderer.VtxConsumed); |
| 1512 | // reserve new draw command |
| 1513 | draw_list.PrimReserve(cnt * renderer.IdxConsumed, cnt * renderer.VtxConsumed); |
| 1514 | } |
| 1515 | prims -= cnt; |
| 1516 | for (unsigned int ie = idx + cnt; idx != ie; ++idx) { |
| 1517 | if (!renderer.Render(draw_list, cull_rect, idx)) |
| 1518 | prims_culled++; |
| 1519 | } |
| 1520 | } |
| 1521 | if (prims_culled > 0) |
| 1522 | draw_list.PrimUnreserve(prims_culled * renderer.IdxConsumed, prims_culled * renderer.VtxConsumed); |
| 1523 | } |
| 1524 | |
| 1525 | template <template <class> class _Renderer, class _Getter, typename ...Args> |
| 1526 | void RenderPrimitives1(const _Getter& getter, Args... args) { |
no test coverage detected