|
@@ -150,6 +150,56 @@ void ImGui_ImplOpenGL3_NewFrame()
|
|
ImGui_ImplOpenGL3_CreateDeviceObjects();
|
|
ImGui_ImplOpenGL3_CreateDeviceObjects();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height, GLuint vertex_array_object)
|
|
|
|
+{
|
|
|
|
+ // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill
|
|
|
|
+ glEnable(GL_BLEND);
|
|
|
|
+ glBlendEquation(GL_FUNC_ADD);
|
|
|
|
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
+ glDisable(GL_CULL_FACE);
|
|
|
|
+ glDisable(GL_DEPTH_TEST);
|
|
|
|
+ glEnable(GL_SCISSOR_TEST);
|
|
|
|
+#ifdef GL_POLYGON_MODE
|
|
|
|
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ // Setup viewport, orthographic projection matrix
|
|
|
|
+ // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps.
|
|
|
|
+ glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
|
|
|
+ float L = draw_data->DisplayPos.x;
|
|
|
|
+ float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
|
|
|
|
+ float T = draw_data->DisplayPos.y;
|
|
|
|
+ float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
|
|
|
|
+ const float ortho_projection[4][4] =
|
|
|
|
+ {
|
|
|
|
+ { 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
|
|
|
+ { 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
|
|
|
+ { 0.0f, 0.0f, -1.0f, 0.0f },
|
|
|
|
+ { (R+L)/(L-R), (T+B)/(B-T), 0.0f, 1.0f },
|
|
|
|
+ };
|
|
|
|
+ glUseProgram(g_ShaderHandle);
|
|
|
|
+ glUniform1i(g_AttribLocationTex, 0);
|
|
|
|
+ glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
|
|
|
|
+#ifdef GL_SAMPLER_BINDING
|
|
|
|
+ glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ (void)vertex_array_object;
|
|
|
|
+#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
|
|
+ glBindVertexArray(vertex_array_object);
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ // Bind vertex/index buffers and setup attributes for ImDrawVert
|
|
|
|
+ glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
|
|
|
|
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle);
|
|
|
|
+ glEnableVertexAttribArray(g_AttribLocationVtxPos);
|
|
|
|
+ glEnableVertexAttribArray(g_AttribLocationVtxUV);
|
|
|
|
+ glEnableVertexAttribArray(g_AttribLocationVtxColor);
|
|
|
|
+ glVertexAttribPointer(g_AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos));
|
|
|
|
+ glVertexAttribPointer(g_AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv));
|
|
|
|
+ glVertexAttribPointer(g_AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col));
|
|
|
|
+}
|
|
|
|
+
|
|
// OpenGL3 Render function.
|
|
// OpenGL3 Render function.
|
|
// (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop)
|
|
// (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop)
|
|
// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly, in order to be able to run within any OpenGL engine that doesn't do so.
|
|
// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly, in order to be able to run within any OpenGL engine that doesn't do so.
|
|
@@ -195,55 +245,14 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
|
clip_origin_lower_left = false;
|
|
clip_origin_lower_left = false;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill
|
|
|
|
- glEnable(GL_BLEND);
|
|
|
|
- glBlendEquation(GL_FUNC_ADD);
|
|
|
|
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
- glDisable(GL_CULL_FACE);
|
|
|
|
- glDisable(GL_DEPTH_TEST);
|
|
|
|
- glEnable(GL_SCISSOR_TEST);
|
|
|
|
-#ifdef GL_POLYGON_MODE
|
|
|
|
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- // Setup viewport, orthographic projection matrix
|
|
|
|
- // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps.
|
|
|
|
- glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
|
|
|
- float L = draw_data->DisplayPos.x;
|
|
|
|
- float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
|
|
|
|
- float T = draw_data->DisplayPos.y;
|
|
|
|
- float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
|
|
|
|
- const float ortho_projection[4][4] =
|
|
|
|
- {
|
|
|
|
- { 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
|
|
|
- { 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
|
|
|
- { 0.0f, 0.0f, -1.0f, 0.0f },
|
|
|
|
- { (R+L)/(L-R), (T+B)/(B-T), 0.0f, 1.0f },
|
|
|
|
- };
|
|
|
|
- glUseProgram(g_ShaderHandle);
|
|
|
|
- glUniform1i(g_AttribLocationTex, 0);
|
|
|
|
- glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
|
|
|
|
-#ifdef GL_SAMPLER_BINDING
|
|
|
|
- glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
|
|
+ // Setup desired GL state
|
|
// Recreate the VAO every time (this is to easily allow multiple GL contexts to be rendered to. VAO are not shared among GL contexts)
|
|
// Recreate the VAO every time (this is to easily allow multiple GL contexts to be rendered to. VAO are not shared among GL contexts)
|
|
// The renderer would actually work without any VAO bound, but then our VertexAttrib calls would overwrite the default one currently bound.
|
|
// The renderer would actually work without any VAO bound, but then our VertexAttrib calls would overwrite the default one currently bound.
|
|
-#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
|
|
GLuint vertex_array_object = 0;
|
|
GLuint vertex_array_object = 0;
|
|
|
|
+#ifndef IMGUI_IMPL_OPENGL_ES2
|
|
glGenVertexArrays(1, &vertex_array_object);
|
|
glGenVertexArrays(1, &vertex_array_object);
|
|
- glBindVertexArray(vertex_array_object);
|
|
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
- // Bind vertex/index buffers and setup attributes for ImDrawVert
|
|
|
|
- glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
|
|
|
|
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle);
|
|
|
|
- glEnableVertexAttribArray(g_AttribLocationVtxPos);
|
|
|
|
- glEnableVertexAttribArray(g_AttribLocationVtxUV);
|
|
|
|
- glEnableVertexAttribArray(g_AttribLocationVtxColor);
|
|
|
|
- glVertexAttribPointer(g_AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos));
|
|
|
|
- glVertexAttribPointer(g_AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv));
|
|
|
|
- glVertexAttribPointer(g_AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col));
|
|
|
|
|
|
+ ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
|
|
|
|
|
|
// Will project scissor/clipping rectangles into framebuffer space
|
|
// Will project scissor/clipping rectangles into framebuffer space
|
|
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
|
|
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
|
|
@@ -262,10 +271,14 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
|
|
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
|
|
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
|
|
{
|
|
{
|
|
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
|
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
|
- if (pcmd->UserCallback)
|
|
|
|
|
|
+ if (pcmd->UserCallback != NULL)
|
|
{
|
|
{
|
|
- // User callback (registered via ImDrawList::AddCallback)
|
|
|
|
- pcmd->UserCallback(cmd_list, pcmd);
|
|
|
|
|
|
+ // User callback, registered via ImDrawList::AddCallback()
|
|
|
|
+ // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
|
|
|
|
+ if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
|
|
|
|
+ ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
|
|
|
|
+ else
|
|
|
|
+ pcmd->UserCallback(cmd_list, pcmd);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|