mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 01:34:32 +00:00 
			
		
		
		
	Examples: OpenGL3: Minor tweaks, clarifications + not calling glBindBuffer more than necessary in the render loop.
This commit is contained in:
		@@ -43,6 +43,7 @@ Other Changes:
 | 
				
			|||||||
- Inputs: Also add support for horizontal scroll with Shift+Mouse Wheel. (#2424, #1463) [@LucaRood]
 | 
					- Inputs: Also add support for horizontal scroll with Shift+Mouse Wheel. (#2424, #1463) [@LucaRood]
 | 
				
			||||||
- Examples: OpenGL: Added a dummy GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized
 | 
					- Examples: OpenGL: Added a dummy GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized
 | 
				
			||||||
  GL function loaders early, and help users understand what they are missing. (#2421)
 | 
					  GL function loaders early, and help users understand what they are missing. (#2421)
 | 
				
			||||||
 | 
					- Examples: OpenGL3: Minor tweaks + not calling glBindBuffer more than necessary in the render loop.
 | 
				
			||||||
- Examples: FreeGLUT: Made io.DeltaTime always > 0. (#2430)
 | 
					- Examples: FreeGLUT: Made io.DeltaTime always > 0. (#2430)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CHANGELOG
 | 
					// CHANGELOG
 | 
				
			||||||
// (minor and older changes stripped away, please see git history for details)
 | 
					// (minor and older changes stripped away, please see git history for details)
 | 
				
			||||||
 | 
					//  2019-03-29: OpenGL: Not calling glBindBuffer more than necessary in the render loop.
 | 
				
			||||||
//  2019-03-15: OpenGL: Added a dummy GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized GL function loaders early.
 | 
					//  2019-03-15: OpenGL: Added a dummy GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized GL function loaders early.
 | 
				
			||||||
//  2019-03-03: OpenGL: Fix support for ES 2.0 (WebGL 1.0).
 | 
					//  2019-03-03: OpenGL: Fix support for ES 2.0 (WebGL 1.0).
 | 
				
			||||||
//  2019-02-20: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN even if defined by the headers/loader.
 | 
					//  2019-02-20: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN even if defined by the headers/loader.
 | 
				
			||||||
@@ -104,8 +105,8 @@
 | 
				
			|||||||
static char         g_GlslVersionString[32] = "";
 | 
					static char         g_GlslVersionString[32] = "";
 | 
				
			||||||
static GLuint       g_FontTexture = 0;
 | 
					static GLuint       g_FontTexture = 0;
 | 
				
			||||||
static GLuint       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_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;                                // Uniforms location
 | 
				
			||||||
static int          g_AttribLocationPosition = 0, g_AttribLocationUV = 0, g_AttribLocationColor = 0;
 | 
					static int          g_AttribLocationVtxPos = 0, g_AttribLocationVtxUV = 0, g_AttribLocationVtxColor = 0; // Vertex attributes location
 | 
				
			||||||
static unsigned int g_VboHandle = 0, g_ElementsHandle = 0;
 | 
					static unsigned int g_VboHandle = 0, g_ElementsHandle = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Functions
 | 
					// Functions
 | 
				
			||||||
@@ -170,7 +171,7 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
    GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
 | 
					    GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
 | 
				
			||||||
#ifndef IMGUI_IMPL_OPENGL_ES2
 | 
					#ifndef IMGUI_IMPL_OPENGL_ES2
 | 
				
			||||||
    GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
 | 
					    GLint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array_object);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef GL_POLYGON_MODE
 | 
					#ifdef GL_POLYGON_MODE
 | 
				
			||||||
    GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
 | 
					    GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
 | 
				
			||||||
@@ -226,20 +227,23 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
				
			|||||||
    glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
 | 
					    glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 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.
 | 
				
			||||||
#ifndef IMGUI_IMPL_OPENGL_ES2
 | 
					#ifndef IMGUI_IMPL_OPENGL_ES2
 | 
				
			||||||
    // Recreate the VAO every time
 | 
					    GLuint vertex_array_object = 0;
 | 
				
			||||||
    // (This is to easily allow multiple GL contexts. VAO are not shared among GL contexts, and we don't track creation/deletion of windows so we don't have an obvious key to use to cache them.)
 | 
					    glGenVertexArrays(1, &vertex_array_object);
 | 
				
			||||||
    GLuint vao_handle = 0;
 | 
					    glBindVertexArray(vertex_array_object);
 | 
				
			||||||
    glGenVertexArrays(1, &vao_handle);
 | 
					 | 
				
			||||||
    glBindVertexArray(vao_handle);
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Bind vertex/index buffers and setup attributes for ImDrawVert
 | 
				
			||||||
    glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
 | 
					    glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
 | 
				
			||||||
    glEnableVertexAttribArray(g_AttribLocationPosition);
 | 
					    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle);
 | 
				
			||||||
    glEnableVertexAttribArray(g_AttribLocationUV);
 | 
					    glEnableVertexAttribArray(g_AttribLocationVtxPos);
 | 
				
			||||||
    glEnableVertexAttribArray(g_AttribLocationColor);
 | 
					    glEnableVertexAttribArray(g_AttribLocationVtxUV);
 | 
				
			||||||
    glVertexAttribPointer(g_AttribLocationPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos));
 | 
					    glEnableVertexAttribArray(g_AttribLocationVtxColor);
 | 
				
			||||||
    glVertexAttribPointer(g_AttribLocationUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv));
 | 
					    glVertexAttribPointer(g_AttribLocationVtxPos,   2, GL_FLOAT,         GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos));
 | 
				
			||||||
    glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col));
 | 
					    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));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 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
 | 
				
			||||||
@@ -251,10 +255,8 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
				
			|||||||
        const ImDrawList* cmd_list = draw_data->CmdLists[n];
 | 
					        const ImDrawList* cmd_list = draw_data->CmdLists[n];
 | 
				
			||||||
        size_t idx_buffer_offset = 0;
 | 
					        size_t idx_buffer_offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
 | 
					        // Upload vertex/index buffers
 | 
				
			||||||
        glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert), (const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW);
 | 
					        glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert), (const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle);
 | 
					 | 
				
			||||||
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx), (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW);
 | 
					        glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx), (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        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++)
 | 
				
			||||||
@@ -280,7 +282,7 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
				
			|||||||
                    if (clip_origin_lower_left)
 | 
					                    if (clip_origin_lower_left)
 | 
				
			||||||
                        glScissor((int)clip_rect.x, (int)(fb_height - clip_rect.w), (int)(clip_rect.z - clip_rect.x), (int)(clip_rect.w - clip_rect.y));
 | 
					                        glScissor((int)clip_rect.x, (int)(fb_height - clip_rect.w), (int)(clip_rect.z - clip_rect.x), (int)(clip_rect.w - clip_rect.y));
 | 
				
			||||||
                    else
 | 
					                    else
 | 
				
			||||||
                        glScissor((int)clip_rect.x, (int)clip_rect.y, (int)clip_rect.z, (int)clip_rect.w); // Support for GL 4.5's glClipControl(GL_UPPER_LEFT)
 | 
					                        glScissor((int)clip_rect.x, (int)clip_rect.y, (int)clip_rect.z, (int)clip_rect.w); // Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // Bind texture, Draw
 | 
					                    // Bind texture, Draw
 | 
				
			||||||
                    glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);
 | 
					                    glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);
 | 
				
			||||||
@@ -290,8 +292,10 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
				
			|||||||
            idx_buffer_offset += pcmd->ElemCount * sizeof(ImDrawIdx);
 | 
					            idx_buffer_offset += pcmd->ElemCount * sizeof(ImDrawIdx);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Destroy the temporary VAO
 | 
				
			||||||
#ifndef IMGUI_IMPL_OPENGL_ES2
 | 
					#ifndef IMGUI_IMPL_OPENGL_ES2
 | 
				
			||||||
    glDeleteVertexArrays(1, &vao_handle);
 | 
					    glDeleteVertexArrays(1, &vertex_array_object);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Restore modified GL state
 | 
					    // Restore modified GL state
 | 
				
			||||||
@@ -302,7 +306,7 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
    glActiveTexture(last_active_texture);
 | 
					    glActiveTexture(last_active_texture);
 | 
				
			||||||
#ifndef IMGUI_IMPL_OPENGL_ES2
 | 
					#ifndef IMGUI_IMPL_OPENGL_ES2
 | 
				
			||||||
    glBindVertexArray(last_vertex_array);
 | 
					    glBindVertexArray(last_vertex_array_object);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
 | 
					    glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
 | 
				
			||||||
    glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
 | 
					    glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
 | 
				
			||||||
@@ -554,9 +558,9 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, "Texture");
 | 
					    g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, "Texture");
 | 
				
			||||||
    g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, "ProjMtx");
 | 
					    g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, "ProjMtx");
 | 
				
			||||||
    g_AttribLocationPosition = glGetAttribLocation(g_ShaderHandle, "Position");
 | 
					    g_AttribLocationVtxPos = glGetAttribLocation(g_ShaderHandle, "Position");
 | 
				
			||||||
    g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, "UV");
 | 
					    g_AttribLocationVtxUV = glGetAttribLocation(g_ShaderHandle, "UV");
 | 
				
			||||||
    g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, "Color");
 | 
					    g_AttribLocationVtxColor = glGetAttribLocation(g_ShaderHandle, "Color");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Create buffers
 | 
					    // Create buffers
 | 
				
			||||||
    glGenBuffers(1, &g_VboHandle);
 | 
					    glGenBuffers(1, &g_VboHandle);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -221,7 +221,7 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm
 | 
				
			|||||||
    if (!fd->IndexBuffer || fd->IndexBufferSize < index_size)
 | 
					    if (!fd->IndexBuffer || fd->IndexBufferSize < index_size)
 | 
				
			||||||
        CreateOrResizeBuffer(fd->IndexBuffer, fd->IndexBufferMemory, fd->IndexBufferSize, index_size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
 | 
					        CreateOrResizeBuffer(fd->IndexBuffer, fd->IndexBufferMemory, fd->IndexBufferSize, index_size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Upload Vertex and index Data:
 | 
					    // Upload vertex/index data into a single contiguous GPU buffer
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        ImDrawVert* vtx_dst = NULL;
 | 
					        ImDrawVert* vtx_dst = NULL;
 | 
				
			||||||
        ImDrawIdx* idx_dst = NULL;
 | 
					        ImDrawIdx* idx_dst = NULL;
 | 
				
			||||||
@@ -305,6 +305,7 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm
 | 
				
			|||||||
            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
 | 
					            const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
 | 
				
			||||||
            if (pcmd->UserCallback)
 | 
					            if (pcmd->UserCallback)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
					                // User callback (registered via ImDrawList::AddCallback)
 | 
				
			||||||
                pcmd->UserCallback(cmd_list, pcmd);
 | 
					                pcmd->UserCallback(cmd_list, pcmd);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							@@ -19,7 +19,7 @@ Index of this file:
 | 
				
			|||||||
// Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload)
 | 
					// Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload)
 | 
				
			||||||
// Obsolete functions
 | 
					// Obsolete functions
 | 
				
			||||||
// Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor)
 | 
					// Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor)
 | 
				
			||||||
// Draw List API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListFlags, ImDrawList, ImDrawData)
 | 
					// Draw List API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListFlags, ImDrawList, ImDrawData)
 | 
				
			||||||
// Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont)
 | 
					// Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user