diff --git a/implot_items.cpp b/implot_items.cpp index 0aaad32..136d302 100644 --- a/implot_items.cpp +++ b/implot_items.cpp @@ -242,17 +242,21 @@ struct TransformerLogLog { // RENDERERS //----------------------------------------------------------------------------- +template +struct MaxIdx { static const unsigned int Value; }; +const unsigned int MaxIdx::Value = 65535; +const unsigned int MaxIdx::Value = 4294967295; + /// Renders primitive shapes in bulk as efficiently as possible. template inline void RenderPrimitives(Renderer renderer, ImDrawList& DrawList) { - unsigned int prims = renderer.Prims; + unsigned int prims = renderer.Prims; unsigned int prims_culled = 0; - unsigned int idx = 0; - static const unsigned int max_idx = (unsigned int)(ImPow(2.0f, (float)(sizeof(ImDrawIdx) * 8)) - 1); + unsigned int idx = 0; const ImVec2 uv = DrawList._Data->TexUvWhitePixel; while (prims) { // find how many can be reserved up to end of current draw command's limit - unsigned int cnt = (unsigned int)ImMin(prims, (max_idx - DrawList._VtxCurrentIdx) / Renderer::VtxConsumed); + unsigned int cnt = ImMin(prims, (MaxIdx::Value - DrawList._VtxCurrentIdx) / Renderer::VtxConsumed); // 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 if (cnt >= ImMin(64u, prims)) { if (prims_culled >= cnt) @@ -268,7 +272,7 @@ inline void RenderPrimitives(Renderer renderer, ImDrawList& DrawList) { DrawList.PrimUnreserve(prims_culled * Renderer::IdxConsumed, prims_culled * Renderer::VtxConsumed); prims_culled = 0; } - cnt = (unsigned int)ImMin(prims, (max_idx - 0/*DrawList._VtxCurrentIdx*/) / Renderer::VtxConsumed); + cnt = ImMin(prims, (MaxIdx::Value - 0/*DrawList._VtxCurrentIdx*/) / Renderer::VtxConsumed); DrawList.PrimReserve(cnt * Renderer::IdxConsumed, cnt * Renderer::VtxConsumed); // reserve new draw command } prims -= cnt;