109 ImGui::SetCurrentContext(
g_ctx);
112 const ImGuiIO& io = ImGui::GetIO();
113 int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
114 int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
115 if (fb_width == 0 || fb_height == 0)
117 draw_data->ScaleClipRects(io.DisplayFramebufferScale);
120 GLint last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, &last_active_texture);
121 glActiveTexture(GL_TEXTURE0);
122 GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
123 GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
124 GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
125 GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);
126 GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
127 GLint last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, &last_blend_src_rgb);
128 GLint last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, &last_blend_dst_rgb);
129 GLint last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, &last_blend_src_alpha);
130 GLint last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, &last_blend_dst_alpha);
131 GLint last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb);
132 GLint last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha);
133 GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
134 GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
135 GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
136 GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
137 GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
138 GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
142 glBlendEquation(GL_FUNC_ADD);
143 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
144 glDisable(GL_CULL_FACE);
145 glDisable(GL_DEPTH_TEST);
146 glEnable(GL_SCISSOR_TEST);
149 glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
150 const float ortho_projection[4][4] =
152 { 2.0f/io.DisplaySize.x, 0.0f, 0.0f, 0.0f },
153 { 0.0f, 2.0f/-io.DisplaySize.y, 0.0f, 0.0f },
154 { 0.0f, 0.0f, -1.0f, 0.0f },
155 {-1.0f, 1.0f, 0.0f, 1.0f },
162 for (
int n = 0; n < draw_data->CmdListsCount; n++)
164 const ImDrawList* cmd_list = draw_data->CmdLists[n];
165 const ImDrawIdx* idx_buffer_offset = 0;
168 glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.Size *
sizeof(ImDrawVert), (
const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW);
171 glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size *
sizeof(ImDrawIdx), (
const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW);
173 for (
int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
175 const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
176 if (pcmd->UserCallback)
178 pcmd->UserCallback(cmd_list, pcmd);
182 glBindTexture(GL_TEXTURE_2D, (GLuint)(
size_t)pcmd->TextureId);
183 glScissor((
int)pcmd->ClipRect.x, (
int)(fb_height - pcmd->ClipRect.w), (
int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (
int)(pcmd->ClipRect.w - pcmd->ClipRect.y));
184 glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount,
sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
186 idx_buffer_offset += pcmd->ElemCount;
191 glUseProgram(last_program);
192 glBindTexture(GL_TEXTURE_2D, last_texture);
193 glActiveTexture(last_active_texture);
194 glBindVertexArray(last_vertex_array);
195 glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
196 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
197 glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
198 glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
199 if (last_enable_blend) glEnable(GL_BLEND);
else glDisable(GL_BLEND);
200 if (last_enable_cull_face) glEnable(GL_CULL_FACE);
else glDisable(GL_CULL_FACE);
201 if (last_enable_depth_test) glEnable(GL_DEPTH_TEST);
else glDisable(GL_DEPTH_TEST);
202 if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST);
else glDisable(GL_SCISSOR_TEST);
203 glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
204 glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
239 ImGui::SetCurrentContext(
g_ctx);
242 GLint last_texture, last_array_buffer, last_vertex_array;
243 glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
244 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
245 glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
247 const GLchar *vertex_shader =
249 "uniform mat4 ProjMtx;\n"
250 "in vec2 Position;\n"
253 "out vec2 Frag_UV;\n"
254 "out vec4 Frag_Color;\n"
258 " Frag_Color = Color;\n"
259 " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
262 const GLchar* fragment_shader =
264 "precision mediump float;"
265 "uniform sampler2D Texture;\n"
267 "in vec4 Frag_Color;\n"
268 "out vec4 Out_Color;\n"
271 " Out_Color = Frag_Color * texture( Texture, Frag_UV.st);\n"
301#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
310 glBindTexture(GL_TEXTURE_2D, last_texture);
311 glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
312 glBindVertexArray(last_vertex_array);