mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Merge branch 'master' into viewport
# Conflicts: # examples/imgui_impl_opengl3.cpp # imgui.cpp # imgui.h # imgui_draw.cpp # imgui_internal.h
This commit is contained in:
		| @@ -13,6 +13,7 @@ | ||||
| // CHANGELOG  | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2018-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface. | ||||
| //  2018-07-10: OpenGL: Support for more GLSL versions (based on the GLSL version string). Added error output when shaders fail to compile/link. | ||||
| //  2018-06-08: Misc: Extracted imgui_impl_opengl3.cpp/.h away from the old combined GLFW/SDL+OpenGL3 examples. | ||||
| //  2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. | ||||
| //  2018-05-25: OpenGL: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state. | ||||
| @@ -27,12 +28,36 @@ | ||||
| //  2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle. | ||||
| //  2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752) | ||||
|  | ||||
| //---------------------------------------- | ||||
| // OpenGL    GLSL      GLSL | ||||
| // version   version   string | ||||
| //---------------------------------------- | ||||
| //  2.0       110       "#version 110" | ||||
| //  2.1       120 | ||||
| //  3.0       130 | ||||
| //  3.1       140 | ||||
| //  3.2       150       "#version 150" | ||||
| //  3.3       330 | ||||
| //  4.0       400 | ||||
| //  4.1       410 | ||||
| //  4.2       420 | ||||
| //  4.3       430 | ||||
| //  ES 2.0    100       "#version 100" | ||||
| //  ES 3.0    300       "#version 300 es" | ||||
| //---------------------------------------- | ||||
|  | ||||
| #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 // MSVC 2008 or earlier | ||||
| #include <stddef.h>     // intptr_t | ||||
| #else | ||||
| #include <stdint.h>     // intptr_t | ||||
| #endif | ||||
|  | ||||
| #include <GL/gl3w.h>    // This example is using gl3w to access OpenGL functions. You may use another OpenGL loader/header such as: glew, glext, glad, glLoadGen, etc. | ||||
| //#include <glew.h> | ||||
| @@ -40,9 +65,9 @@ | ||||
| //#include <glad/glad.h> | ||||
|  | ||||
| // OpenGL Data | ||||
| static char         g_GlslVersion[32] = ""; | ||||
| static char         g_GlslVersionString[32] = ""; | ||||
| static GLuint       g_FontTexture = 0; | ||||
| static int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | ||||
| static GLuint       g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | ||||
| static int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0; | ||||
| static int          g_AttribLocationPosition = 0, g_AttribLocationUV = 0, g_AttribLocationColor = 0; | ||||
| static unsigned int g_VboHandle = 0, g_ElementsHandle = 0; | ||||
| @@ -56,10 +81,10 @@ bool    ImGui_ImplOpenGL3_Init(const char* glsl_version) | ||||
| { | ||||
|     // Store GLSL version string so we can refer to it later in case we recreate shaders. Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure. | ||||
|     if (glsl_version == NULL) | ||||
|         glsl_version = "#version 150"; | ||||
|     IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(g_GlslVersion)); | ||||
|     strcpy(g_GlslVersion, glsl_version); | ||||
|     strcat(g_GlslVersion, "\n"); | ||||
|         glsl_version = "#version 130"; | ||||
|     IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(g_GlslVersionString)); | ||||
|     strcpy(g_GlslVersionString, glsl_version); | ||||
|     strcat(g_GlslVersionString, "\n"); | ||||
|  | ||||
|     // Setup back-end capabilities flags | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
| @@ -253,6 +278,42 @@ void ImGui_ImplOpenGL3_DestroyFontsTexture() | ||||
|     } | ||||
| } | ||||
|  | ||||
| // If you get an error please report on github. You may try different GL context version or GLSL version. | ||||
| static bool CheckShader(GLuint handle, const char* desc) | ||||
| { | ||||
|     GLint status = 0, log_length = 0; | ||||
|     glGetShaderiv(handle, GL_COMPILE_STATUS, &status); | ||||
|     glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length); | ||||
|     if (status == GL_FALSE) | ||||
|         fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to compile %s!\n", desc); | ||||
|     if (log_length > 0) | ||||
|     { | ||||
|         ImVector<char> buf; | ||||
|         buf.resize((int)(log_length + 1)); | ||||
|         glGetShaderInfoLog(handle, log_length, NULL, (GLchar*)buf.begin()); | ||||
|         fprintf(stderr, "%s\n", buf.begin()); | ||||
|     } | ||||
|     return status == GL_TRUE; | ||||
| } | ||||
|  | ||||
| // If you get an error please report on github. You may try different GL context version or GLSL version. | ||||
| static bool CheckProgram(GLuint handle, const char* desc) | ||||
| { | ||||
|     GLint status = 0, log_length = 0; | ||||
|     glGetProgramiv(handle, GL_LINK_STATUS, &status); | ||||
|     glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length); | ||||
|     if (status == GL_FALSE) | ||||
|         fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to link %s!\n", desc); | ||||
|     if (log_length > 0) | ||||
|     { | ||||
|         ImVector<char> buf; | ||||
|         buf.resize((int)(log_length + 1)); | ||||
|         glGetProgramInfoLog(handle, log_length, NULL, (GLchar*)buf.begin()); | ||||
|         fprintf(stderr, "%s\n", buf.begin()); | ||||
|     } | ||||
|     return status == GL_TRUE; | ||||
| } | ||||
|  | ||||
| bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | ||||
| { | ||||
|     // Backup GL state | ||||
| @@ -261,8 +322,25 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | ||||
|     glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); | ||||
|     glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); | ||||
|  | ||||
|     // Create shaders | ||||
|     const GLchar *vertex_shader = | ||||
|     // Parse GLSL version string | ||||
|     int glsl_version = 130; | ||||
|     sscanf(g_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" | ||||
| @@ -271,34 +349,65 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | ||||
|         "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" | ||||
|         "    Frag_UV = UV;\n" | ||||
|         "    Frag_Color = Color;\n" | ||||
|         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* fragment_shader = | ||||
|     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" | ||||
|         "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" | ||||
|         "}\n"; | ||||
|  | ||||
|     const GLchar* vertex_shader_with_version[2] = { g_GlslVersion, vertex_shader }; | ||||
|     const GLchar* fragment_shader_with_version[2] = { g_GlslVersion, fragment_shader }; | ||||
|     // Select shaders matching our GLSL versions | ||||
|     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 | ||||
|     { | ||||
|         vertex_shader = vertex_shader_glsl_130; | ||||
|         fragment_shader = fragment_shader_glsl_130; | ||||
|     } | ||||
|  | ||||
|     // Create shaders | ||||
|     const GLchar* vertex_shader_with_version[2] = { g_GlslVersionString, vertex_shader }; | ||||
|     g_VertHandle = glCreateShader(GL_VERTEX_SHADER); | ||||
|     glShaderSource(g_VertHandle, 2, vertex_shader_with_version, NULL); | ||||
|     glCompileShader(g_VertHandle); | ||||
|     CheckShader(g_VertHandle, "vertex shader"); | ||||
|  | ||||
|     const GLchar* fragment_shader_with_version[2] = { g_GlslVersionString, fragment_shader }; | ||||
|     g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER); | ||||
|     glShaderSource(g_FragHandle, 2, fragment_shader_with_version, NULL); | ||||
|     glCompileShader(g_FragHandle); | ||||
|     CheckShader(g_FragHandle, "fragment shader"); | ||||
|  | ||||
|     g_ShaderHandle = glCreateProgram(); | ||||
|     g_VertHandle = glCreateShader(GL_VERTEX_SHADER); | ||||
|     g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER); | ||||
|     glShaderSource(g_VertHandle, 2, vertex_shader_with_version, NULL); | ||||
|     glShaderSource(g_FragHandle, 2, fragment_shader_with_version, NULL); | ||||
|     glCompileShader(g_VertHandle); | ||||
|     glCompileShader(g_FragHandle); | ||||
|     glAttachShader(g_ShaderHandle, g_VertHandle); | ||||
|     glAttachShader(g_ShaderHandle, g_FragHandle); | ||||
|     glLinkProgram(g_ShaderHandle); | ||||
|     CheckProgram(g_ShaderHandle, "shader program"); | ||||
|  | ||||
|     g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, "Texture"); | ||||
|     g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, "ProjMtx"); | ||||
| @@ -306,6 +415,7 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | ||||
|     g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, "UV"); | ||||
|     g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, "Color"); | ||||
|  | ||||
|     // Create buffers | ||||
|     glGenBuffers(1, &g_VboHandle); | ||||
|     glGenBuffers(1, &g_ElementsHandle); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 omar
					omar