| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) |
| | #define _CRT_SECURE_NO_WARNINGS |
| | #endif |
| |
|
| | #include "imgui.h" |
| | #include "imgui_impl_opengl3.h" |
| | #include <stdio.h> |
| | #if defined(_MSC_VER) && _MSC_VER <= 1500 |
| | #include <stddef.h> |
| | #else |
| | #include <stdint.h> |
| | #endif |
| |
|
| | |
| | #if defined(__clang__) |
| | #pragma clang diagnostic push |
| | #pragma clang diagnostic ignored "-Wold-style-cast" |
| | #pragma clang diagnostic ignored "-Wsign-conversion" |
| | #if __has_warning("-Wzero-as-null-pointer-constant") |
| | #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" |
| | #endif |
| | #endif |
| |
|
| | |
| | #if defined(IMGUI_IMPL_OPENGL_ES2) |
| | #if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) |
| | #include <OpenGLES/ES2/gl.h> |
| | #else |
| | #include <GLES2/gl2.h> |
| | #endif |
| | #if defined(__EMSCRIPTEN__) |
| | #ifndef GL_GLEXT_PROTOTYPES |
| | #define GL_GLEXT_PROTOTYPES |
| | #endif |
| | #include <GLES2/gl2ext.h> |
| | #endif |
| | #elif defined(IMGUI_IMPL_OPENGL_ES3) |
| | #if defined(__APPLE__) |
| | #include <TargetConditionals.h> |
| | #endif |
| | #if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) |
| | #include <OpenGLES/ES3/gl.h> |
| | #else |
| | #include <GLES3/gl3.h> |
| | #endif |
| | #elif !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM) |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #define IMGL3W_IMPL |
| | #include "imgui_impl_opengl3_loader.h" |
| | #endif |
| |
|
| | |
| | #ifndef IMGUI_IMPL_OPENGL_ES2 |
| | #define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | #elif defined(__EMSCRIPTEN__) |
| | #define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | #define glBindVertexArray glBindVertexArrayOES |
| | #define glGenVertexArrays glGenVertexArraysOES |
| | #define glDeleteVertexArrays glDeleteVertexArraysOES |
| | #define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES |
| | #endif |
| |
|
| | |
| | #ifdef GL_POLYGON_MODE |
| | #define IMGUI_IMPL_HAS_POLYGON_MODE |
| | #endif |
| |
|
| | |
| | #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_2) |
| | #define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET |
| | #endif |
| |
|
| | |
| | #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_3) |
| | #define IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER |
| | #endif |
| |
|
| | |
| | #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_1) |
| | #define IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART |
| | #endif |
| |
|
| | |
| | #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) |
| | #define IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS |
| | #endif |
| |
|
| | |
| | struct ImGui_ImplOpenGL3_Data |
| | { |
| | GLuint GlVersion; |
| | char GlslVersionString[32]; |
| | GLuint FontTexture; |
| | GLuint ShaderHandle; |
| | GLint AttribLocationTex; |
| | GLint AttribLocationProjMtx; |
| | GLuint AttribLocationVtxPos; |
| | GLuint AttribLocationVtxUV; |
| | GLuint AttribLocationVtxColor; |
| | unsigned int VboHandle, ElementsHandle; |
| | GLsizeiptr VertexBufferSize; |
| | GLsizeiptr IndexBufferSize; |
| | bool HasClipOrigin; |
| |
|
| | ImGui_ImplOpenGL3_Data() { memset(this, 0, sizeof(*this)); } |
| | }; |
| |
|
| | |
| | |
| | static ImGui_ImplOpenGL3_Data* ImGui_ImplOpenGL3_GetBackendData() |
| | { |
| | return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL3_Data*)ImGui::GetIO().BackendRendererUserData : NULL; |
| | } |
| |
|
| | |
| | bool ImGui_ImplOpenGL3_Init(const char* glsl_version) |
| | { |
| | ImGuiIO& io = ImGui::GetIO(); |
| | IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!"); |
| |
|
| | |
| | #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM) |
| | if (imgl3wInit() != 0) |
| | { |
| | fprintf(stderr, "Failed to initialize OpenGL loader!\n"); |
| | return false; |
| | } |
| | #endif |
| |
|
| | |
| | ImGui_ImplOpenGL3_Data* bd = IM_NEW(ImGui_ImplOpenGL3_Data)(); |
| | io.BackendRendererUserData = (void*)bd; |
| | io.BackendRendererName = "imgui_impl_opengl3"; |
| |
|
| | |
| | #if !defined(IMGUI_IMPL_OPENGL_ES2) |
| | GLint major = 0; |
| | GLint minor = 0; |
| | glGetIntegerv(GL_MAJOR_VERSION, &major); |
| | glGetIntegerv(GL_MINOR_VERSION, &minor); |
| | if (major == 0 && minor == 0) |
| | { |
| | |
| | const char* gl_version = (const char*)glGetString(GL_VERSION); |
| | sscanf(gl_version, "%d.%d", &major, &minor); |
| | } |
| | bd->GlVersion = (GLuint)(major * 100 + minor * 10); |
| | #else |
| | bd->GlVersion = 200; |
| | #endif |
| |
|
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET |
| | if (bd->GlVersion >= 320) |
| | io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; |
| | #endif |
| |
|
| | |
| | |
| | if (glsl_version == NULL) |
| | { |
| | #if defined(IMGUI_IMPL_OPENGL_ES2) |
| | glsl_version = "#version 100"; |
| | #elif defined(IMGUI_IMPL_OPENGL_ES3) |
| | glsl_version = "#version 300 es"; |
| | #elif defined(__APPLE__) |
| | glsl_version = "#version 150"; |
| | #else |
| | glsl_version = "#version 130"; |
| | #endif |
| | } |
| | IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(bd->GlslVersionString)); |
| | strcpy(bd->GlslVersionString, glsl_version); |
| | strcat(bd->GlslVersionString, "\n"); |
| |
|
| | |
| | |
| | GLint current_texture; |
| | glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); |
| |
|
| | |
| | bd->HasClipOrigin = (bd->GlVersion >= 450); |
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS |
| | GLint num_extensions = 0; |
| | glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); |
| | for (GLint i = 0; i < num_extensions; i++) |
| | { |
| | const char* extension = (const char*)glGetStringi(GL_EXTENSIONS, i); |
| | if (extension != NULL && strcmp(extension, "GL_ARB_clip_control") == 0) |
| | bd->HasClipOrigin = true; |
| | } |
| | #endif |
| |
|
| | return true; |
| | } |
| |
|
| | void ImGui_ImplOpenGL3_Shutdown() |
| | { |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| | IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?"); |
| | ImGuiIO& io = ImGui::GetIO(); |
| |
|
| | ImGui_ImplOpenGL3_DestroyDeviceObjects(); |
| | io.BackendRendererName = NULL; |
| | io.BackendRendererUserData = NULL; |
| | IM_DELETE(bd); |
| | } |
| |
|
| | void ImGui_ImplOpenGL3_NewFrame() |
| | { |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| | IM_ASSERT(bd != NULL && "Did you call ImGui_ImplOpenGL3_Init()?"); |
| |
|
| | if (!bd->ShaderHandle) |
| | ImGui_ImplOpenGL3_CreateDeviceObjects(); |
| | } |
| |
|
| | static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height, GLuint vertex_array_object) |
| | { |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| |
|
| | |
| | glEnable(GL_BLEND); |
| | glBlendEquation(GL_FUNC_ADD); |
| | glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); |
| | glDisable(GL_CULL_FACE); |
| | glDisable(GL_DEPTH_TEST); |
| | glDisable(GL_STENCIL_TEST); |
| | glEnable(GL_SCISSOR_TEST); |
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART |
| | if (bd->GlVersion >= 310) |
| | glDisable(GL_PRIMITIVE_RESTART); |
| | #endif |
| | #ifdef IMGUI_IMPL_HAS_POLYGON_MODE |
| | glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); |
| | #endif |
| |
|
| | |
| | #if defined(GL_CLIP_ORIGIN) |
| | bool clip_origin_lower_left = true; |
| | if (bd->HasClipOrigin) |
| | { |
| | GLenum current_clip_origin = 0; glGetIntegerv(GL_CLIP_ORIGIN, (GLint*)¤t_clip_origin); |
| | if (current_clip_origin == GL_UPPER_LEFT) |
| | clip_origin_lower_left = false; |
| | } |
| | #endif |
| |
|
| | |
| | |
| | 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; |
| | #if defined(GL_CLIP_ORIGIN) |
| | if (!clip_origin_lower_left) { float tmp = T; T = B; B = tmp; } |
| | #endif |
| | 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(bd->ShaderHandle); |
| | glUniform1i(bd->AttribLocationTex, 0); |
| | glUniformMatrix4fv(bd->AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]); |
| |
|
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER |
| | if (bd->GlVersion >= 330) |
| | glBindSampler(0, 0); |
| | #endif |
| |
|
| | (void)vertex_array_object; |
| | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | glBindVertexArray(vertex_array_object); |
| | #endif |
| |
|
| | |
| | glBindBuffer(GL_ARRAY_BUFFER, bd->VboHandle); |
| | glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bd->ElementsHandle); |
| | glEnableVertexAttribArray(bd->AttribLocationVtxPos); |
| | glEnableVertexAttribArray(bd->AttribLocationVtxUV); |
| | glEnableVertexAttribArray(bd->AttribLocationVtxColor); |
| | glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos)); |
| | glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv)); |
| | glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col)); |
| | } |
| |
|
| | |
| | |
| | |
| | void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) |
| | { |
| | |
| | int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x); |
| | int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y); |
| | if (fb_width <= 0 || fb_height <= 0) |
| | return; |
| |
|
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| |
|
| | |
| | GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture); |
| | glActiveTexture(GL_TEXTURE0); |
| | GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program); |
| | GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture); |
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER |
| | GLuint last_sampler; if (bd->GlVersion >= 330) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; } |
| | #endif |
| | GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer); |
| | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object); |
| | #endif |
| | #ifdef IMGUI_IMPL_HAS_POLYGON_MODE |
| | GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); |
| | #endif |
| | GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); |
| | GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); |
| | GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb); |
| | GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb); |
| | GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha); |
| | GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha); |
| | GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb); |
| | GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha); |
| | GLboolean last_enable_blend = glIsEnabled(GL_BLEND); |
| | GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE); |
| | GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST); |
| | GLboolean last_enable_stencil_test = glIsEnabled(GL_STENCIL_TEST); |
| | GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST); |
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART |
| | GLboolean last_enable_primitive_restart = (bd->GlVersion >= 310) ? glIsEnabled(GL_PRIMITIVE_RESTART) : GL_FALSE; |
| | #endif |
| |
|
| | |
| | |
| | |
| | GLuint vertex_array_object = 0; |
| | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | glGenVertexArrays(1, &vertex_array_object); |
| | #endif |
| | ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object); |
| |
|
| | |
| | ImVec2 clip_off = draw_data->DisplayPos; |
| | ImVec2 clip_scale = draw_data->FramebufferScale; |
| |
|
| | |
| | for (int n = 0; n < draw_data->CmdListsCount; n++) |
| | { |
| | const ImDrawList* cmd_list = draw_data->CmdLists[n]; |
| |
|
| | |
| | GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); |
| | GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx); |
| | if (bd->VertexBufferSize < vtx_buffer_size) |
| | { |
| | bd->VertexBufferSize = vtx_buffer_size; |
| | glBufferData(GL_ARRAY_BUFFER, bd->VertexBufferSize, NULL, GL_STREAM_DRAW); |
| | } |
| | if (bd->IndexBufferSize < idx_buffer_size) |
| | { |
| | bd->IndexBufferSize = idx_buffer_size; |
| | glBufferData(GL_ELEMENT_ARRAY_BUFFER, bd->IndexBufferSize, NULL, GL_STREAM_DRAW); |
| | } |
| | glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data); |
| | glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data); |
| |
|
| | for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) |
| | { |
| | const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; |
| | if (pcmd->UserCallback != NULL) |
| | { |
| | |
| | |
| | if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) |
| | ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object); |
| | else |
| | pcmd->UserCallback(cmd_list, pcmd); |
| | } |
| | else |
| | { |
| | |
| | ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); |
| | ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); |
| | if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) |
| | continue; |
| |
|
| | |
| | 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)); |
| |
|
| | |
| | glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID()); |
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET |
| | if (bd->GlVersion >= 320) |
| | 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); |
| | else |
| | #endif |
| | glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx))); |
| | } |
| | } |
| | } |
| |
|
| | |
| | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | glDeleteVertexArrays(1, &vertex_array_object); |
| | #endif |
| |
|
| | |
| | glUseProgram(last_program); |
| | glBindTexture(GL_TEXTURE_2D, last_texture); |
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER |
| | if (bd->GlVersion >= 330) |
| | glBindSampler(0, last_sampler); |
| | #endif |
| | glActiveTexture(last_active_texture); |
| | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | glBindVertexArray(last_vertex_array_object); |
| | #endif |
| | glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); |
| | glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha); |
| | glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha); |
| | if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND); |
| | if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); |
| | if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); |
| | if (last_enable_stencil_test) glEnable(GL_STENCIL_TEST); else glDisable(GL_STENCIL_TEST); |
| | if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST); |
| | #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART |
| | if (bd->GlVersion >= 310) { if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART); else glDisable(GL_PRIMITIVE_RESTART); } |
| | #endif |
| |
|
| | #ifdef IMGUI_IMPL_HAS_POLYGON_MODE |
| | glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]); |
| | #endif |
| | glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); |
| | glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]); |
| | (void)bd; |
| | } |
| |
|
| | bool ImGui_ImplOpenGL3_CreateFontsTexture() |
| | { |
| | ImGuiIO& io = ImGui::GetIO(); |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| |
|
| | |
| | unsigned char* pixels; |
| | int width, height; |
| | io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); |
| |
|
| | |
| | GLint last_texture; |
| | glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); |
| | glGenTextures(1, &bd->FontTexture); |
| | glBindTexture(GL_TEXTURE_2D, bd->FontTexture); |
| | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| | #ifdef GL_UNPACK_ROW_LENGTH |
| | glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); |
| | #endif |
| | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); |
| |
|
| | |
| | io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture); |
| |
|
| | |
| | glBindTexture(GL_TEXTURE_2D, last_texture); |
| |
|
| | return true; |
| | } |
| |
|
| | void ImGui_ImplOpenGL3_DestroyFontsTexture() |
| | { |
| | ImGuiIO& io = ImGui::GetIO(); |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| | if (bd->FontTexture) |
| | { |
| | glDeleteTextures(1, &bd->FontTexture); |
| | io.Fonts->SetTexID(0); |
| | bd->FontTexture = 0; |
| | } |
| | } |
| |
|
| | |
| | static bool CheckShader(GLuint handle, const char* desc) |
| | { |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| | GLint status = 0, log_length = 0; |
| | glGetShaderiv(handle, GL_COMPILE_STATUS, &status); |
| | glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length); |
| | if ((GLboolean)status == GL_FALSE) |
| | fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to compile %s! With GLSL: %s\n", desc, bd->GlslVersionString); |
| | if (log_length > 1) |
| | { |
| | ImVector<char> buf; |
| | buf.resize((int)(log_length + 1)); |
| | glGetShaderInfoLog(handle, log_length, NULL, (GLchar*)buf.begin()); |
| | fprintf(stderr, "%s\n", buf.begin()); |
| | } |
| | return (GLboolean)status == GL_TRUE; |
| | } |
| |
|
| | |
| | static bool CheckProgram(GLuint handle, const char* desc) |
| | { |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| | GLint status = 0, log_length = 0; |
| | glGetProgramiv(handle, GL_LINK_STATUS, &status); |
| | glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length); |
| | if ((GLboolean)status == GL_FALSE) |
| | fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to link %s! With GLSL %s\n", desc, bd->GlslVersionString); |
| | if (log_length > 1) |
| | { |
| | ImVector<char> buf; |
| | buf.resize((int)(log_length + 1)); |
| | glGetProgramInfoLog(handle, log_length, NULL, (GLchar*)buf.begin()); |
| | fprintf(stderr, "%s\n", buf.begin()); |
| | } |
| | return (GLboolean)status == GL_TRUE; |
| | } |
| |
|
| | bool ImGui_ImplOpenGL3_CreateDeviceObjects() |
| | { |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| |
|
| | |
| | GLint last_texture, last_array_buffer; |
| | glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); |
| | glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); |
| | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | GLint last_vertex_array; |
| | glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); |
| | #endif |
| |
|
| | |
| | int glsl_version = 130; |
| | sscanf(bd->GlslVersionString, "#version %d", &glsl_version); |
| |
|
| | const GLchar* vertex_shader_glsl_120 = |
| | "uniform mat4 ProjMtx;\n" |
| | "attribute vec2 Position;\n" |
| | "attribute vec2 UV;\n" |
| | "attribute vec4 Color;\n" |
| | "varying vec2 Frag_UV;\n" |
| | "varying vec4 Frag_Color;\n" |
| | "void main()\n" |
| | "{\n" |
| | " Frag_UV = UV;\n" |
| | " Frag_Color = Color;\n" |
| | " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" |
| | "}\n"; |
| |
|
| | const GLchar* vertex_shader_glsl_130 = |
| | "uniform mat4 ProjMtx;\n" |
| | "in vec2 Position;\n" |
| | "in vec2 UV;\n" |
| | "in vec4 Color;\n" |
| | "out vec2 Frag_UV;\n" |
| | "out vec4 Frag_Color;\n" |
| | "void main()\n" |
| | "{\n" |
| | " Frag_UV = UV;\n" |
| | " Frag_Color = Color;\n" |
| | " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" |
| | "}\n"; |
| |
|
| | const GLchar* vertex_shader_glsl_300_es = |
| | "precision highp float;\n" |
| | "layout (location = 0) in vec2 Position;\n" |
| | "layout (location = 1) in vec2 UV;\n" |
| | "layout (location = 2) in vec4 Color;\n" |
| | "uniform mat4 ProjMtx;\n" |
| | "out vec2 Frag_UV;\n" |
| | "out vec4 Frag_Color;\n" |
| | "void main()\n" |
| | "{\n" |
| | " Frag_UV = UV;\n" |
| | " Frag_Color = Color;\n" |
| | " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" |
| | "}\n"; |
| |
|
| | const GLchar* vertex_shader_glsl_410_core = |
| | "layout (location = 0) in vec2 Position;\n" |
| | "layout (location = 1) in vec2 UV;\n" |
| | "layout (location = 2) in vec4 Color;\n" |
| | "uniform mat4 ProjMtx;\n" |
| | "out vec2 Frag_UV;\n" |
| | "out vec4 Frag_Color;\n" |
| | "void main()\n" |
| | "{\n" |
| | " Frag_UV = UV;\n" |
| | " Frag_Color = Color;\n" |
| | " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" |
| | "}\n"; |
| |
|
| | const GLchar* fragment_shader_glsl_120 = |
| | "#ifdef GL_ES\n" |
| | " precision mediump float;\n" |
| | "#endif\n" |
| | "uniform sampler2D Texture;\n" |
| | "varying vec2 Frag_UV;\n" |
| | "varying vec4 Frag_Color;\n" |
| | "void main()\n" |
| | "{\n" |
| | " gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n" |
| | "}\n"; |
| |
|
| | const GLchar* fragment_shader_glsl_130 = |
| | "uniform sampler2D Texture;\n" |
| | "in vec2 Frag_UV;\n" |
| | "in vec4 Frag_Color;\n" |
| | "out vec4 Out_Color;\n" |
| | "void main()\n" |
| | "{\n" |
| | " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" |
| | "}\n"; |
| |
|
| | const GLchar* fragment_shader_glsl_300_es = |
| | "precision mediump float;\n" |
| | "uniform sampler2D Texture;\n" |
| | "in vec2 Frag_UV;\n" |
| | "in vec4 Frag_Color;\n" |
| | "layout (location = 0) out vec4 Out_Color;\n" |
| | "void main()\n" |
| | "{\n" |
| | " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" |
| | "}\n"; |
| |
|
| | const GLchar* fragment_shader_glsl_410_core = |
| | "in vec2 Frag_UV;\n" |
| | "in vec4 Frag_Color;\n" |
| | "uniform sampler2D Texture;\n" |
| | "layout (location = 0) out vec4 Out_Color;\n" |
| | "void main()\n" |
| | "{\n" |
| | " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" |
| | "}\n"; |
| |
|
| | |
| | const GLchar* vertex_shader = NULL; |
| | const GLchar* fragment_shader = NULL; |
| | if (glsl_version < 130) |
| | { |
| | vertex_shader = vertex_shader_glsl_120; |
| | fragment_shader = fragment_shader_glsl_120; |
| | } |
| | else if (glsl_version >= 410) |
| | { |
| | vertex_shader = vertex_shader_glsl_410_core; |
| | fragment_shader = fragment_shader_glsl_410_core; |
| | } |
| | else if (glsl_version == 300) |
| | { |
| | vertex_shader = vertex_shader_glsl_300_es; |
| | fragment_shader = fragment_shader_glsl_300_es; |
| | } |
| | else |
| | { |
| | vertex_shader = vertex_shader_glsl_130; |
| | fragment_shader = fragment_shader_glsl_130; |
| | } |
| |
|
| | |
| | const GLchar* vertex_shader_with_version[2] = { bd->GlslVersionString, vertex_shader }; |
| | GLuint vert_handle = glCreateShader(GL_VERTEX_SHADER); |
| | glShaderSource(vert_handle, 2, vertex_shader_with_version, NULL); |
| | glCompileShader(vert_handle); |
| | CheckShader(vert_handle, "vertex shader"); |
| |
|
| | const GLchar* fragment_shader_with_version[2] = { bd->GlslVersionString, fragment_shader }; |
| | GLuint frag_handle = glCreateShader(GL_FRAGMENT_SHADER); |
| | glShaderSource(frag_handle, 2, fragment_shader_with_version, NULL); |
| | glCompileShader(frag_handle); |
| | CheckShader(frag_handle, "fragment shader"); |
| |
|
| | |
| | bd->ShaderHandle = glCreateProgram(); |
| | glAttachShader(bd->ShaderHandle, vert_handle); |
| | glAttachShader(bd->ShaderHandle, frag_handle); |
| | glLinkProgram(bd->ShaderHandle); |
| | CheckProgram(bd->ShaderHandle, "shader program"); |
| |
|
| | glDetachShader(bd->ShaderHandle, vert_handle); |
| | glDetachShader(bd->ShaderHandle, frag_handle); |
| | glDeleteShader(vert_handle); |
| | glDeleteShader(frag_handle); |
| |
|
| | bd->AttribLocationTex = glGetUniformLocation(bd->ShaderHandle, "Texture"); |
| | bd->AttribLocationProjMtx = glGetUniformLocation(bd->ShaderHandle, "ProjMtx"); |
| | bd->AttribLocationVtxPos = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Position"); |
| | bd->AttribLocationVtxUV = (GLuint)glGetAttribLocation(bd->ShaderHandle, "UV"); |
| | bd->AttribLocationVtxColor = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Color"); |
| |
|
| | |
| | glGenBuffers(1, &bd->VboHandle); |
| | glGenBuffers(1, &bd->ElementsHandle); |
| |
|
| | ImGui_ImplOpenGL3_CreateFontsTexture(); |
| |
|
| | |
| | glBindTexture(GL_TEXTURE_2D, last_texture); |
| | glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); |
| | #ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY |
| | glBindVertexArray(last_vertex_array); |
| | #endif |
| |
|
| | return true; |
| | } |
| |
|
| | void ImGui_ImplOpenGL3_DestroyDeviceObjects() |
| | { |
| | ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); |
| | if (bd->VboHandle) { glDeleteBuffers(1, &bd->VboHandle); bd->VboHandle = 0; } |
| | if (bd->ElementsHandle) { glDeleteBuffers(1, &bd->ElementsHandle); bd->ElementsHandle = 0; } |
| | if (bd->ShaderHandle) { glDeleteProgram(bd->ShaderHandle); bd->ShaderHandle = 0; } |
| | ImGui_ImplOpenGL3_DestroyFontsTexture(); |
| | } |
| |
|
| | #if defined(__clang__) |
| | #pragma clang diagnostic pop |
| | #endif |
| |
|