imgui_impl_opengl2.cpp
Go to the documentation of this file.
1 // dear imgui: Renderer for OpenGL2 (legacy OpenGL, fixed pipeline)
2 // This needs to be used along with a Platform Binding (e.g. GLFW, SDL, Win32, custom..)
3 
4 // Implemented features:
5 // [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
6 
7 // You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
8 // If you are new to dear imgui, read examples/README.txt and read the documentation at the top of imgui.cpp.
9 // https://github.com/ocornut/imgui
10 
11 // **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**
12 // **Prefer using the code in imgui_impl_opengl3.cpp**
13 // This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.
14 // If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more
15 // complicated, will require your code to reset every single OpenGL attributes to their initial state, and might
16 // confuse your GPU driver.
17 // The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API.
18 
19 // CHANGELOG
20 // (minor and older changes stripped away, please see git history for details)
21 // 2020-01-23: OpenGL: Explicitly backup, setup and restore GL_TEXTURE_ENV to increase compatibility with legacy OpenGL applications.
22 // 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
23 // 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
24 // 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
25 // 2018-08-03: OpenGL: Disabling/restoring GL_LIGHTING and GL_COLOR_MATERIAL to increase compatibility with legacy OpenGL applications.
26 // 2018-06-08: Misc: Extracted imgui_impl_opengl2.cpp/.h away from the old combined GLFW/SDL+OpenGL2 examples.
27 // 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
28 // 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplOpenGL2_RenderDrawData() in the .h file so you can call it yourself.
29 // 2017-09-01: OpenGL: Save and restore current polygon mode.
30 // 2016-09-10: OpenGL: Uploading font texture as RGBA32 to increase compatibility with users shaders (not ideal).
31 // 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
32 
33 #include "imgui.h"
34 #include "imgui_impl_opengl2.h"
35 #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
36 #include <stddef.h> // intptr_t
37 #else
38 #include <stdint.h> // intptr_t
39 #endif
40 
41 // Include OpenGL header (without an OpenGL loader) requires a bit of fiddling
42 #if defined(_WIN32) && !defined(APIENTRY)
43 #define APIENTRY __stdcall // It is customary to use APIENTRY for OpenGL function pointer declarations on all platforms. Additionally, the Windows OpenGL header needs APIENTRY.
44 #endif
45 #if defined(_WIN32) && !defined(WINGDIAPI)
46 #define WINGDIAPI __declspec(dllimport) // Some Windows OpenGL headers need this
47 #endif
48 #if defined(__APPLE__)
49 #define GL_SILENCE_DEPRECATION
50 #include <OpenGL/gl.h>
51 #else
52 #include <GL/gl.h>
53 #endif
54 
55 // OpenGL Data
56 static GLuint g_FontTexture = 0;
57 
58 // Functions
60 {
61  // Setup back-end capabilities flags
62  ImGuiIO& io = ImGui::GetIO();
63  io.BackendRendererName = "imgui_impl_opengl2";
64  return true;
65 }
66 
68 {
70 }
71 
73 {
74  if (!g_FontTexture)
76 }
77 
78 static void ImGui_ImplOpenGL2_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height)
79 {
80  // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill.
85  glDisable(GL_LIGHTING);
86  glDisable(GL_COLOR_MATERIAL);
88  glEnableClientState(GL_VERTEX_ARRAY);
89  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
90  glEnableClientState(GL_COLOR_ARRAY);
93  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
94 
95  // If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!),
96  // you may need to backup/reset/restore current shader using the lines below. DO NOT MODIFY THIS FILE! Add the code in your calling function:
97  // GLint last_program;
98  // glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
99  // glUseProgram(0);
100  // ImGui_ImplOpenGL2_RenderDrawData(...);
101  // glUseProgram(last_program)
102 
103  // Setup viewport, orthographic projection matrix
104  // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
105  glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
106  glMatrixMode(GL_PROJECTION);
107  glPushMatrix();
108  glLoadIdentity();
109  glOrtho(draw_data->DisplayPos.x, draw_data->DisplayPos.x + draw_data->DisplaySize.x, draw_data->DisplayPos.y + draw_data->DisplaySize.y, draw_data->DisplayPos.y, -1.0f, +1.0f);
110  glMatrixMode(GL_MODELVIEW);
111  glPushMatrix();
112  glLoadIdentity();
113 }
114 
115 // OpenGL2 Render function.
116 // (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop)
117 // 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.
119 {
120  // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
121  int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
122  int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
123  if (fb_width == 0 || fb_height == 0)
124  return;
125 
126  // Backup GL state
127  GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
128  GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
129  GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
130  GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
131  GLint last_tex_env_mode; glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &last_tex_env_mode);
132  glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);
133 
134  // Setup desired GL state
135  ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height);
136 
137  // Will project scissor/clipping rectangles into framebuffer space
138  ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
139  ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
140 
141  // Render command lists
142  for (int n = 0; n < draw_data->CmdListsCount; n++)
143  {
144  const ImDrawList* cmd_list = draw_data->CmdLists[n];
145  const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data;
146  const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data;
147  glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)));
148  glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv)));
149  glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col)));
150 
151  for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
152  {
153  const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
154  if (pcmd->UserCallback)
155  {
156  // User callback, registered via ImDrawList::AddCallback()
157  // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
159  ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height);
160  else
161  pcmd->UserCallback(cmd_list, pcmd);
162  }
163  else
164  {
165  // Project scissor/clipping rectangles into framebuffer space
166  ImVec4 clip_rect;
167  clip_rect.x = (pcmd->ClipRect.x - clip_off.x) * clip_scale.x;
168  clip_rect.y = (pcmd->ClipRect.y - clip_off.y) * clip_scale.y;
169  clip_rect.z = (pcmd->ClipRect.z - clip_off.x) * clip_scale.x;
170  clip_rect.w = (pcmd->ClipRect.w - clip_off.y) * clip_scale.y;
171 
172  if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f)
173  {
174  // Apply scissor/clipping rectangle
175  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));
176 
177  // Bind texture, Draw
178  glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);
180  }
181  }
182  idx_buffer += pcmd->ElemCount;
183  }
184  }
185 
186  // Restore modified GL state
187  glDisableClientState(GL_COLOR_ARRAY);
188  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
189  glDisableClientState(GL_VERTEX_ARRAY);
190  glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture);
191  glMatrixMode(GL_MODELVIEW);
192  glPopMatrix();
193  glMatrixMode(GL_PROJECTION);
194  glPopMatrix();
195  glPopAttrib();
196  glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]);
197  glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
198  glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
199  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, last_tex_env_mode);
200 }
201 
203 {
204  // Build texture atlas
205  ImGuiIO& io = ImGui::GetIO();
206  unsigned char* pixels;
207  int width, height;
208  io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
209 
210  // Upload texture to graphics system
211  GLint last_texture;
212  glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
219 
220  // Store our identifier
221  io.Fonts->TexID = (ImTextureID)(intptr_t)g_FontTexture;
222 
223  // Restore state
224  glBindTexture(GL_TEXTURE_2D, last_texture);
225 
226  return true;
227 }
228 
230 {
231  if (g_FontTexture)
232  {
233  ImGuiIO& io = ImGui::GetIO();
235  io.Fonts->TexID = 0;
236  g_FontTexture = 0;
237  }
238 }
239 
241 {
243 }
244 
246 {
248 }
ImGui_ImplOpenGL2_CreateFontsTexture
bool ImGui_ImplOpenGL2_CreateFontsTexture()
Definition: imgui_impl_opengl2.cpp:202
glEnable
#define glEnable
Definition: gl3w.h:647
glPixelStorei
#define glPixelStorei
Definition: gl3w.h:656
ImDrawData::FramebufferScale
ImVec2 FramebufferScale
Definition: imgui.h:2077
ImDrawIdx
unsigned short ImDrawIdx
Definition: imgui.h:1888
height
GLint GLsizei GLsizei height
Definition: glcorearb.h:2768
ImGui_ImplOpenGL2_CreateDeviceObjects
bool ImGui_ImplOpenGL2_CreateDeviceObjects()
Definition: imgui_impl_opengl2.cpp:240
ImDrawData::DisplayPos
ImVec2 DisplayPos
Definition: imgui.h:2075
ImGuiIO::Fonts
ImFontAtlas * Fonts
Definition: imgui.h:1435
ImDrawList::IdxBuffer
ImVector< ImDrawIdx > IdxBuffer
Definition: imgui.h:1965
GL_TEXTURE_MIN_FILTER
#define GL_TEXTURE_MIN_FILTER
Definition: glcorearb.h:302
ImFontAtlas::TexID
ImTextureID TexID
Definition: imgui.h:2247
ImDrawData::CmdListsCount
int CmdListsCount
Definition: imgui.h:2072
GLsizei
int GLsizei
Definition: glcorearb.h:81
GL_FLOAT
#define GL_FLOAT
Definition: glcorearb.h:241
ImVec4::z
float z
Definition: imgui.h:223
GL_TEXTURE_2D
#define GL_TEXTURE_2D
Definition: glcorearb.h:213
GL_SCISSOR_TEST
#define GL_SCISSOR_TEST
Definition: glcorearb.h:190
glGetIntegerv
#define glGetIntegerv
Definition: gl3w.h:663
ImDrawData::CmdLists
ImDrawList ** CmdLists
Definition: imgui.h:2071
GLuint
unsigned int GLuint
Definition: glcorearb.h:84
ImGui_ImplOpenGL2_RenderDrawData
void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData *draw_data)
Definition: imgui_impl_opengl2.cpp:118
ImDrawList
Definition: imgui.h:1961
ImTextureID
void * ImTextureID
Definition: imgui.h:172
GL_POLYGON_MODE
#define GL_POLYGON_MODE
Definition: glcorearb.h:161
imgui.h
glViewport
#define glViewport
Definition: gl3w.h:672
GL_TEXTURE_BINDING_2D
#define GL_TEXTURE_BINDING_2D
Definition: glcorearb.h:220
GL_UNSIGNED_SHORT
#define GL_UNSIGNED_SHORT
Definition: glcorearb.h:238
GLvoid
void GLvoid
Definition: glcorearb.h:90
ImVec2
Definition: imgui.h:208
ImGui::GetIO
IMGUI_API ImGuiIO & GetIO()
Definition: imgui.cpp:3286
ImGui_ImplOpenGL2_DestroyDeviceObjects
void ImGui_ImplOpenGL2_DestroyDeviceObjects()
Definition: imgui_impl_opengl2.cpp:245
GL_FRONT_AND_BACK
#define GL_FRONT_AND_BACK
Definition: glcorearb.h:143
ImDrawList::CmdBuffer
ImVector< ImDrawCmd > CmdBuffer
Definition: imgui.h:1964
g_FontTexture
static GLuint g_FontTexture
Definition: imgui_impl_opengl2.cpp:56
ImDrawCmd
Definition: imgui.h:1871
GL_FILL
#define GL_FILL
Definition: glcorearb.h:281
ImDrawCmd::TextureId
ImTextureID TextureId
Definition: imgui.h:1875
GL_UNPACK_ROW_LENGTH
#define GL_UNPACK_ROW_LENGTH
Definition: glcorearb.h:199
GL_UNSIGNED_BYTE
#define GL_UNSIGNED_BYTE
Definition: glcorearb.h:236
glTexImage2D
#define glTexImage2D
Definition: gl3w.h:637
ImDrawCmd::UserCallback
ImDrawCallback UserCallback
Definition: imgui.h:1878
ImVec4::y
float y
Definition: imgui.h:223
GL_BACK
#define GL_BACK
Definition: glcorearb.h:140
ImVector::Data
T * Data
Definition: imgui.h:1305
GLenum
unsigned int GLenum
Definition: glcorearb.h:75
glBindTexture
#define glBindTexture
Definition: gl3w.h:683
glDeleteTextures
#define glDeleteTextures
Definition: gl3w.h:684
glTexParameteri
#define glTexParameteri
Definition: gl3w.h:634
glDrawElements
#define glDrawElements
Definition: gl3w.h:674
ImDrawData
Definition: imgui.h:2068
ImGui_ImplOpenGL2_DestroyFontsTexture
void ImGui_ImplOpenGL2_DestroyFontsTexture()
Definition: imgui_impl_opengl2.cpp:229
ImVector::Size
int Size
Definition: imgui.h:1303
ImDrawVert
Definition: imgui.h:1893
ImVec2::x
float x
Definition: imgui.h:210
ImDrawCmd::ClipRect
ImVec4 ClipRect
Definition: imgui.h:1874
GL_TEXTURE_MAG_FILTER
#define GL_TEXTURE_MAG_FILTER
Definition: glcorearb.h:301
glPolygonMode
#define glPolygonMode
Definition: gl3w.h:630
IM_OFFSETOF
#define IM_OFFSETOF(_TYPE, _MEMBER)
Definition: imgui.h:93
GL_BLEND
#define GL_BLEND
Definition: glcorearb.h:184
GL_VIEWPORT
#define GL_VIEWPORT
Definition: glcorearb.h:180
GL_COLOR_BUFFER_BIT
#define GL_COLOR_BUFFER_BIT
Definition: glcorearb.h:98
ImGui_ImplOpenGL2_Init
bool ImGui_ImplOpenGL2_Init()
Definition: imgui_impl_opengl2.cpp:59
ImGui_ImplOpenGL2_SetupRenderState
static void ImGui_ImplOpenGL2_SetupRenderState(ImDrawData *draw_data, int fb_width, int fb_height)
Definition: imgui_impl_opengl2.cpp:78
ImVec4::x
float x
Definition: imgui.h:223
GL_UNSIGNED_INT
#define GL_UNSIGNED_INT
Definition: glcorearb.h:240
GL_FRONT
#define GL_FRONT
Definition: glcorearb.h:139
n
GLdouble n
Definition: glcorearb.h:4153
ImDrawList::VtxBuffer
ImVector< ImDrawVert > VtxBuffer
Definition: imgui.h:1966
GL_CULL_FACE
#define GL_CULL_FACE
Definition: glcorearb.h:163
glGenTextures
#define glGenTextures
Definition: gl3w.h:685
GL_ONE_MINUS_SRC_ALPHA
#define GL_ONE_MINUS_SRC_ALPHA
Definition: glcorearb.h:126
ImVec4::w
float w
Definition: imgui.h:223
glScissor
#define glScissor
Definition: gl3w.h:631
glDisable
#define glDisable
Definition: gl3w.h:646
GL_RGBA
#define GL_RGBA
Definition: glcorearb.h:277
ImDrawCallback_ResetRenderState
#define ImDrawCallback_ResetRenderState
Definition: imgui.h:1866
ImGuiIO::BackendRendererName
const char * BackendRendererName
Definition: imgui.h:1456
ImGuiIO
Definition: imgui.h:1414
GL_TRIANGLES
#define GL_TRIANGLES
Definition: glcorearb.h:107
ImVec4
Definition: imgui.h:221
GL_LINEAR
#define GL_LINEAR
Definition: glcorearb.h:294
GL_DEPTH_TEST
#define GL_DEPTH_TEST
Definition: glcorearb.h:167
ImGui_ImplOpenGL2_Shutdown
void ImGui_ImplOpenGL2_Shutdown()
Definition: imgui_impl_opengl2.cpp:67
ImDrawData::DisplaySize
ImVec2 DisplaySize
Definition: imgui.h:2076
GL_SCISSOR_BOX
#define GL_SCISSOR_BOX
Definition: glcorearb.h:189
pixels
GLint GLint GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: glcorearb.h:2773
imgui_impl_opengl2.h
GL_SRC_ALPHA
#define GL_SRC_ALPHA
Definition: glcorearb.h:125
GLint
int GLint
Definition: glcorearb.h:80
ImVec2::y
float y
Definition: imgui.h:210
width
GLint GLsizei width
Definition: glcorearb.h:2768
ImDrawCmd::ElemCount
unsigned int ElemCount
Definition: imgui.h:1873
glBlendFunc
#define glBlendFunc
Definition: gl3w.h:650
ImFontAtlas::GetTexDataAsRGBA32
IMGUI_API void GetTexDataAsRGBA32(unsigned char **out_pixels, int *out_width, int *out_height, int *out_bytes_per_pixel=NULL)
Definition: imgui_draw.cpp:1679
ImGui_ImplOpenGL2_NewFrame
void ImGui_ImplOpenGL2_NewFrame()
Definition: imgui_impl_opengl2.cpp:72


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:54