From e3b9a618839bda97e5bec814172185f3667e2324 Mon Sep 17 00:00:00 2001 From: ocornut Date: Wed, 8 Jul 2015 08:27:36 -0600 Subject: [PATCH] Examples: OpenGL3: simplified code. Upload each vertex array separately. (cf #264) --- .../opengl3_example/imgui_impl_glfw_gl3.cpp | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/examples/opengl3_example/imgui_impl_glfw_gl3.cpp b/examples/opengl3_example/imgui_impl_glfw_gl3.cpp index 0090f9d6..28e321b7 100644 --- a/examples/opengl3_example/imgui_impl_glfw_gl3.cpp +++ b/examples/opengl3_example/imgui_impl_glfw_gl3.cpp @@ -56,38 +56,29 @@ static void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data) glUseProgram(g_ShaderHandle); glUniform1i(g_AttribLocationTex, 0); glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]); - - // Grow our buffer according to what we need - glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle); - int needed_vtx_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); - if (g_VboSize < needed_vtx_size) - { - g_VboSize = needed_vtx_size + 5000 * sizeof(ImDrawVert); // Grow buffer - glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)g_VboSize, NULL, GL_STREAM_DRAW); - } - - // Copy and convert all vertices into a single contiguous buffer - unsigned char* vtx_data = (unsigned char*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - if (!vtx_data) - return; - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawList* cmd_list = draw_data->CmdLists[n]; - memcpy(vtx_data, &cmd_list->VtxBuffer[0], cmd_list->VtxBuffer.size() * sizeof(ImDrawVert)); - vtx_data += cmd_list->VtxBuffer.size() * sizeof(ImDrawVert); - } - glUnmapBuffer(GL_ARRAY_BUFFER); - glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(g_VaoHandle); - int vtx_offset = 0; for (int n = 0; n < draw_data->CmdListsCount; n++) { const ImDrawList* cmd_list = draw_data->CmdLists[n]; const ImDrawIdx* idx_buffer = &cmd_list->IdxBuffer.front(); - const ImDrawCmd* pcmd_end = cmd_list->CmdBuffer.end(); - for (const ImDrawCmd* pcmd = cmd_list->CmdBuffer.begin(); pcmd != pcmd_end; pcmd++) + glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle); + int needed_vtx_size = cmd_list->VtxBuffer.size() * sizeof(ImDrawVert); + if (g_VboSize < needed_vtx_size) + { + // Grow our buffer if needed + g_VboSize = needed_vtx_size + 2000 * sizeof(ImDrawVert); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)g_VboSize, NULL, GL_STREAM_DRAW); + } + + unsigned char* vtx_data = (unsigned char*)glMapBufferRange(GL_ARRAY_BUFFER, 0, needed_vtx_size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); + if (!vtx_data) + continue; + memcpy(vtx_data, &cmd_list->VtxBuffer[0], cmd_list->VtxBuffer.size() * sizeof(ImDrawVert)); + glUnmapBuffer(GL_ARRAY_BUFFER); + + for (const ImDrawCmd* pcmd = cmd_list->CmdBuffer.begin(); pcmd != cmd_list->CmdBuffer.end(); pcmd++) { if (pcmd->UserCallback) { @@ -97,15 +88,15 @@ static void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data) { glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId); glScissor((int)pcmd->ClipRect.x, (int)(height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y)); - glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, GL_UNSIGNED_SHORT, idx_buffer, vtx_offset); + glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, GL_UNSIGNED_SHORT, idx_buffer); } idx_buffer += pcmd->ElemCount; } - vtx_offset += cmd_list->VtxBuffer.size(); } // Restore modified state glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); glUseProgram(last_program); glDisable(GL_SCISSOR_TEST); glBindTexture(GL_TEXTURE_2D, last_texture);