498 int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
499 int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
500 if (fb_width <= 0 || fb_height <= 0)
506 GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture);
507 glActiveTexture(GL_TEXTURE0);
508 GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program);
509 GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture);
510#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
511 GLuint last_sampler;
if (bd->
GlVersion >= 330 || bd->
GlProfileIsES3) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); }
else { last_sampler = 0; }
513 GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer);
514#ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
516 GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);
517 ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_pos; last_vtx_attrib_state_pos.GetState(bd->
AttribLocationVtxPos);
518 ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_uv; last_vtx_attrib_state_uv.GetState(bd->
AttribLocationVtxUV);
519 ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_color; last_vtx_attrib_state_color.GetState(bd->
AttribLocationVtxColor);
521#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
522 GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object);
524#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_POLYGON_MODE
525 GLint last_polygon_mode[2];
if (bd->
HasPolygonMode) { glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); }
527 GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
528 GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
529 GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);
530 GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb);
531 GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha);
532 GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha);
533 GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb);
534 GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha);
535 GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
536 GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
537 GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
538 GLboolean last_enable_stencil_test = glIsEnabled(GL_STENCIL_TEST);
539 GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
540#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
541 GLboolean last_enable_primitive_restart = (bd->
GlVersion >= 310) ? glIsEnabled(GL_PRIMITIVE_RESTART) : GL_FALSE;
547 GLuint vertex_array_object = 0;
548#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
549 GL_CALL(glGenVertexArrays(1, &vertex_array_object));
551 ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
554 ImVec2 clip_off = draw_data->DisplayPos;
555 ImVec2 clip_scale = draw_data->FramebufferScale;
558 for (
int n = 0; n < draw_data->CmdListsCount; n++)
560 const ImDrawList* cmd_list = draw_data->CmdLists[n];
570 const GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (
int)
sizeof(ImDrawVert);
571 const GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (
int)
sizeof(ImDrawIdx);
584 GL_CALL(glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (
const GLvoid*)cmd_list->VtxBuffer.Data));
585 GL_CALL(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (
const GLvoid*)cmd_list->IdxBuffer.Data));
589 GL_CALL(glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, (
const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW));
590 GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, (
const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW));
593 for (
int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
595 const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
596 if (pcmd->UserCallback !=
nullptr)
600 if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
601 ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
603 pcmd->UserCallback(cmd_list, pcmd);
608 ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
609 ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
610 if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
614 GL_CALL(glScissor((
int)clip_min.x, (
int)((
float)fb_height - clip_max.y), (
int)(clip_max.x - clip_min.x), (
int)(clip_max.y - clip_min.y)));
617 GL_CALL(glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID()));
618#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
620 GL_CALL(glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount,
sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (
void*)(intptr_t)(pcmd->IdxOffset *
sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset));
623 GL_CALL(glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount,
sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (
void*)(intptr_t)(pcmd->IdxOffset *
sizeof(ImDrawIdx))));
629#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
630 GL_CALL(glDeleteVertexArrays(1, &vertex_array_object));
635 if (last_program == 0 || glIsProgram(last_program)) glUseProgram(last_program);
636 glBindTexture(GL_TEXTURE_2D, last_texture);
637#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
639 glBindSampler(0, last_sampler);
641 glActiveTexture(last_active_texture);
642#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
643 glBindVertexArray(last_vertex_array_object);
645 glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
646#ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
647 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
652 glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
653 glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
654 if (last_enable_blend) glEnable(GL_BLEND);
else glDisable(GL_BLEND);
655 if (last_enable_cull_face) glEnable(GL_CULL_FACE);
else glDisable(GL_CULL_FACE);
656 if (last_enable_depth_test) glEnable(GL_DEPTH_TEST);
else glDisable(GL_DEPTH_TEST);
657 if (last_enable_stencil_test) glEnable(GL_STENCIL_TEST);
else glDisable(GL_STENCIL_TEST);
658 if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST);
else glDisable(GL_SCISSOR_TEST);
659#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
660 if (bd->
GlVersion >= 310) {
if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART);
else glDisable(GL_PRIMITIVE_RESTART); }
663#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_POLYGON_MODE
665 if (bd->
HasPolygonMode) {
if (bd->
GlVersion <= 310 || bd->
GlProfileIsCompat) { glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]); }
else { glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]); } }
668 glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
669 glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
760 GLint last_texture, last_array_buffer;
761 glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
762 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
763#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_BUFFER_PIXEL_UNPACK
764 GLint last_pixel_unpack_buffer = 0;
765 if (bd->
GlVersion >= 210) { glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &last_pixel_unpack_buffer); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); }
767#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
768 GLint last_vertex_array;
769 glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
773 int glsl_version = 130;
776 const GLchar* vertex_shader_glsl_120 =
777 "uniform mat4 ProjMtx;\n"
778 "attribute vec2 Position;\n"
779 "attribute vec2 UV;\n"
780 "attribute vec4 Color;\n"
781 "varying vec2 Frag_UV;\n"
782 "varying vec4 Frag_Color;\n"
786 " Frag_Color = Color;\n"
787 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
790 const GLchar* vertex_shader_glsl_130 =
791 "uniform mat4 ProjMtx;\n"
792 "in vec2 Position;\n"
795 "out vec2 Frag_UV;\n"
796 "out vec4 Frag_Color;\n"
800 " Frag_Color = Color;\n"
801 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
804 const GLchar* vertex_shader_glsl_300_es =
805 "precision highp float;\n"
806 "layout (location = 0) in vec2 Position;\n"
807 "layout (location = 1) in vec2 UV;\n"
808 "layout (location = 2) in vec4 Color;\n"
809 "uniform mat4 ProjMtx;\n"
810 "out vec2 Frag_UV;\n"
811 "out vec4 Frag_Color;\n"
815 " Frag_Color = Color;\n"
816 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
819 const GLchar* vertex_shader_glsl_410_core =
820 "layout (location = 0) in vec2 Position;\n"
821 "layout (location = 1) in vec2 UV;\n"
822 "layout (location = 2) in vec4 Color;\n"
823 "uniform mat4 ProjMtx;\n"
824 "out vec2 Frag_UV;\n"
825 "out vec4 Frag_Color;\n"
829 " Frag_Color = Color;\n"
830 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
833 const GLchar* fragment_shader_glsl_120 =
835 " precision mediump float;\n"
837 "uniform sampler2D Texture;\n"
838 "varying vec2 Frag_UV;\n"
839 "varying vec4 Frag_Color;\n"
842 " gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n"
845 const GLchar* fragment_shader_glsl_130 =
846 "uniform sampler2D Texture;\n"
848 "in vec4 Frag_Color;\n"
849 "out vec4 Out_Color;\n"
852 " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
855 const GLchar* fragment_shader_glsl_300_es =
856 "precision mediump float;\n"
857 "uniform sampler2D Texture;\n"
859 "in vec4 Frag_Color;\n"
860 "layout (location = 0) out vec4 Out_Color;\n"
863 " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
866 const GLchar* fragment_shader_glsl_410_core =
868 "in vec4 Frag_Color;\n"
869 "uniform sampler2D Texture;\n"
870 "layout (location = 0) out vec4 Out_Color;\n"
873 " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
877 const GLchar* vertex_shader =
nullptr;
878 const GLchar* fragment_shader =
nullptr;
879 if (glsl_version < 130)
881 vertex_shader = vertex_shader_glsl_120;
882 fragment_shader = fragment_shader_glsl_120;
884 else if (glsl_version >= 410)
886 vertex_shader = vertex_shader_glsl_410_core;
887 fragment_shader = fragment_shader_glsl_410_core;
889 else if (glsl_version == 300)
891 vertex_shader = vertex_shader_glsl_300_es;
892 fragment_shader = fragment_shader_glsl_300_es;
896 vertex_shader = vertex_shader_glsl_130;
897 fragment_shader = fragment_shader_glsl_130;
901 const GLchar* vertex_shader_with_version[2] = { bd->
GlslVersionString, vertex_shader };
902 GLuint vert_handle = glCreateShader(GL_VERTEX_SHADER);
903 glShaderSource(vert_handle, 2, vertex_shader_with_version,
nullptr);
904 glCompileShader(vert_handle);
905 CheckShader(vert_handle,
"vertex shader");
907 const GLchar* fragment_shader_with_version[2] = { bd->
GlslVersionString, fragment_shader };
908 GLuint frag_handle = glCreateShader(GL_FRAGMENT_SHADER);
909 glShaderSource(frag_handle, 2, fragment_shader_with_version,
nullptr);
910 glCompileShader(frag_handle);
911 CheckShader(frag_handle,
"fragment shader");
922 glDeleteShader(vert_handle);
923 glDeleteShader(frag_handle);
938 glBindTexture(GL_TEXTURE_2D, last_texture);
939 glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
940#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_BUFFER_PIXEL_UNPACK
941 if (bd->
GlVersion >= 210) { glBindBuffer(GL_PIXEL_UNPACK_BUFFER, last_pixel_unpack_buffer); }
943#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
944 glBindVertexArray(last_vertex_array);