mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Examples: OpenGL2/3: Save/setup/restore viewport as part of render function. Update SDL example to match GL2 one. (fix #392)
This commit is contained in:
		| @@ -43,6 +43,7 @@ void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data) | |||||||
| 	GLint last_blend_dst; glGetIntegerv(GL_BLEND_DST, &last_blend_dst); | 	GLint last_blend_dst; glGetIntegerv(GL_BLEND_DST, &last_blend_dst); | ||||||
| 	GLint last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb); | 	GLint last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb); | ||||||
| 	GLint last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha); | 	GLint last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha); | ||||||
|  |     GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); | ||||||
| 	GLboolean last_enable_blend = glIsEnabled(GL_BLEND); | 	GLboolean last_enable_blend = glIsEnabled(GL_BLEND); | ||||||
| 	GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE); | 	GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE); | ||||||
| 	GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST); | 	GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST); | ||||||
| @@ -62,7 +63,8 @@ void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data) | |||||||
|     float fb_height = io.DisplaySize.y * io.DisplayFramebufferScale.y; |     float fb_height = io.DisplaySize.y * io.DisplayFramebufferScale.y; | ||||||
|     draw_data->ScaleClipRects(io.DisplayFramebufferScale); |     draw_data->ScaleClipRects(io.DisplayFramebufferScale); | ||||||
|  |  | ||||||
|     // Setup orthographic projection matrix |     // Setup viewport, orthographic projection matrix | ||||||
|  |     glViewport(0, 0, (GLsizei)io.DisplaySize.x, (GLsizei)io.DisplaySize.y); | ||||||
|     const float ortho_projection[4][4] = |     const float ortho_projection[4][4] = | ||||||
|     { |     { | ||||||
|         { 2.0f/io.DisplaySize.x, 0.0f,                   0.0f, 0.0f }, |         { 2.0f/io.DisplaySize.x, 0.0f,                   0.0f, 0.0f }, | ||||||
| @@ -114,6 +116,7 @@ void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data) | |||||||
| 	if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); | 	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_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); | ||||||
| 	if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST); | 	if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST); | ||||||
|  |     glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); | ||||||
| } | } | ||||||
|  |  | ||||||
| static const char* ImGui_ImplGlfwGL3_GetClipboardText() | static const char* ImGui_ImplGlfwGL3_GetClipboardText() | ||||||
|   | |||||||
| @@ -30,8 +30,8 @@ void ImGui_ImplGlfw_RenderDrawLists(ImDrawData* draw_data) | |||||||
| { | { | ||||||
|     // We are using the OpenGL fixed pipeline to make the example code simpler to read! |     // We are using the OpenGL fixed pipeline to make the example code simpler to read! | ||||||
|     // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers. |     // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers. | ||||||
|     GLint last_texture; |     GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); | ||||||
|     glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); |     GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); | ||||||
|     glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT); |     glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT); | ||||||
|     glEnable(GL_BLEND); |     glEnable(GL_BLEND); | ||||||
|     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||||
| @@ -49,7 +49,8 @@ void ImGui_ImplGlfw_RenderDrawLists(ImDrawData* draw_data) | |||||||
|     float fb_height = io.DisplaySize.y * io.DisplayFramebufferScale.y; |     float fb_height = io.DisplaySize.y * io.DisplayFramebufferScale.y; | ||||||
|     draw_data->ScaleClipRects(io.DisplayFramebufferScale); |     draw_data->ScaleClipRects(io.DisplayFramebufferScale); | ||||||
|  |  | ||||||
|     // Setup orthographic projection matrix |     // Setup viewport, orthographic projection matrix | ||||||
|  |     glViewport(0, 0, (GLsizei)io.DisplaySize.x, (GLsizei)io.DisplaySize.y); | ||||||
|     glMatrixMode(GL_PROJECTION); |     glMatrixMode(GL_PROJECTION); | ||||||
|     glPushMatrix(); |     glPushMatrix(); | ||||||
|     glLoadIdentity(); |     glLoadIdentity(); | ||||||
| @@ -97,6 +98,7 @@ void ImGui_ImplGlfw_RenderDrawLists(ImDrawData* draw_data) | |||||||
|     glMatrixMode(GL_PROJECTION); |     glMatrixMode(GL_PROJECTION); | ||||||
|     glPopMatrix(); |     glPopMatrix(); | ||||||
|     glPopAttrib(); |     glPopAttrib(); | ||||||
|  |     glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); | ||||||
| } | } | ||||||
|  |  | ||||||
| static const char* ImGui_ImplGlfw_GetClipboardText() | static const char* ImGui_ImplGlfw_GetClipboardText() | ||||||
|   | |||||||
| @@ -22,8 +22,9 @@ static GLuint       g_FontTexture = 0; | |||||||
| void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data) | void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data) | ||||||
| { | { | ||||||
|     // We are using the OpenGL fixed pipeline to make the example code simpler to read! |     // We are using the OpenGL fixed pipeline to make the example code simpler to read! | ||||||
|     // A probable faster way to render would be to collate all vertices from all cmd_lists into a single vertex buffer. |  | ||||||
|     // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers. |     // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers. | ||||||
|  |     GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); | ||||||
|  |     GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); | ||||||
|     glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT); |     glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT); | ||||||
|     glEnable(GL_BLEND); |     glEnable(GL_BLEND); | ||||||
|     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||||
| @@ -36,13 +37,17 @@ void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data) | |||||||
|     glEnable(GL_TEXTURE_2D); |     glEnable(GL_TEXTURE_2D); | ||||||
|     //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context |     //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context | ||||||
|  |  | ||||||
|     // Setup orthographic projection matrix |     // Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays) | ||||||
|     const float width = ImGui::GetIO().DisplaySize.x; |     ImGuiIO& io = ImGui::GetIO(); | ||||||
|     const float height = ImGui::GetIO().DisplaySize.y; |     float fb_height = io.DisplaySize.y * io.DisplayFramebufferScale.y; | ||||||
|  |     draw_data->ScaleClipRects(io.DisplayFramebufferScale); | ||||||
|  |  | ||||||
|  |     // Setup viewport, orthographic projection matrix | ||||||
|  |     glViewport(0, 0, (GLsizei)io.DisplaySize.x, (GLsizei)io.DisplaySize.y); | ||||||
|     glMatrixMode(GL_PROJECTION); |     glMatrixMode(GL_PROJECTION); | ||||||
|     glPushMatrix(); |     glPushMatrix(); | ||||||
|     glLoadIdentity(); |     glLoadIdentity(); | ||||||
|     glOrtho(0.0f, width, height, 0.0f, -1.0f, +1.0f); |     glOrtho(0.0f, io.DisplaySize.x, io.DisplaySize.y, 0.0f, -1.0f, +1.0f); | ||||||
|     glMatrixMode(GL_MODELVIEW); |     glMatrixMode(GL_MODELVIEW); | ||||||
|     glPushMatrix(); |     glPushMatrix(); | ||||||
|     glLoadIdentity(); |     glLoadIdentity(); | ||||||
| @@ -68,7 +73,7 @@ void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data) | |||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId); |                 glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId); | ||||||
|                 glScissor((int)pcmd->ClipRect.x, (int)(height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y)); |                 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)); | ||||||
|                 glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, GL_UNSIGNED_SHORT, idx_buffer); |                 glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, GL_UNSIGNED_SHORT, idx_buffer); | ||||||
|             } |             } | ||||||
|             idx_buffer += pcmd->ElemCount; |             idx_buffer += pcmd->ElemCount; | ||||||
| @@ -80,12 +85,13 @@ void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data) | |||||||
|     glDisableClientState(GL_COLOR_ARRAY); |     glDisableClientState(GL_COLOR_ARRAY); | ||||||
|     glDisableClientState(GL_TEXTURE_COORD_ARRAY); |     glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||||
|     glDisableClientState(GL_VERTEX_ARRAY); |     glDisableClientState(GL_VERTEX_ARRAY); | ||||||
|     glBindTexture(GL_TEXTURE_2D, 0); |     glBindTexture(GL_TEXTURE_2D, last_texture); | ||||||
|     glMatrixMode(GL_MODELVIEW); |     glMatrixMode(GL_MODELVIEW); | ||||||
|     glPopMatrix(); |     glPopMatrix(); | ||||||
|     glMatrixMode(GL_PROJECTION); |     glMatrixMode(GL_PROJECTION); | ||||||
|     glPopMatrix(); |     glPopMatrix(); | ||||||
|     glPopAttrib(); |     glPopAttrib(); | ||||||
|  |     glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); | ||||||
| } | } | ||||||
|  |  | ||||||
| static const char* ImGui_ImplSdl_GetClipboardText() | static const char* ImGui_ImplSdl_GetClipboardText() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ocornut
					ocornut