-
Notifications
You must be signed in to change notification settings - Fork 287
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
5,221 additions
and
2,471 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,246 @@ | ||
// dear imgui: Renderer for OpenGL2 (legacy OpenGL, fixed pipeline) | ||
// This needs to be used along with a Platform Binding (e.g. GLFW, SDL, Win32, custom..) | ||
|
||
// Implemented features: | ||
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID in imgui.cpp. | ||
|
||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this. | ||
// If you are new to dear imgui, read examples/README.txt and read the documentation at the top of imgui.cpp. | ||
// https://github.com/ocornut/imgui | ||
|
||
// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** | ||
// **Prefer using the code in imgui_impl_opengl3.cpp** | ||
// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read. | ||
// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more | ||
// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might | ||
// confuse your GPU driver. | ||
// The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API. | ||
|
||
// CHANGELOG | ||
// (minor and older changes stripped away, please see git history for details) | ||
// 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display. | ||
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. | ||
// 2018-08-03: OpenGL: Disabling/restoring GL_LIGHTING and GL_COLOR_MATERIAL to increase compatibility with legacy OpenGL applications. | ||
// 2018-06-08: Misc: Extracted imgui_impl_opengl2.cpp/.h away from the old combined GLFW/SDL+OpenGL2 examples. | ||
// 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. | ||
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplGlfwGL2_RenderDrawData() in the .h file so you can call it yourself. | ||
// 2017-09-01: OpenGL: Save and restore current polygon mode. | ||
// 2016-09-10: OpenGL: Uploading font texture as RGBA32 to increase compatibility with users shaders (not ideal). | ||
// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle. | ||
|
||
#include "imgui.h" | ||
#include "imgui_impl_opengl2.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 OpenGL header (without an OpenGL loader) requires a bit of fiddling | ||
#if defined(_WIN32) && !defined(APIENTRY) | ||
#define APIENTRY __stdcall // It is customary to use APIENTRY for OpenGL function pointer declarations on all platforms. Additionally, the Windows OpenGL header needs APIENTRY. | ||
#endif | ||
#if defined(_WIN32) && !defined(WINGDIAPI) | ||
#define WINGDIAPI __declspec(dllimport) // Some Windows OpenGL headers need this | ||
#endif | ||
#if defined(__APPLE__) | ||
#define GL_SILENCE_DEPRECATION | ||
#include <OpenGL/gl.h> | ||
#else | ||
#include <GL/gl.h> | ||
#endif | ||
|
||
// OpenGL Data | ||
static GLuint g_FontTexture = 0; | ||
|
||
// Functions | ||
bool ImGui_ImplOpenGL2_Init() | ||
{ | ||
ImGuiIO& io = ImGui::GetIO(); | ||
io.BackendRendererName = "imgui_impl_opengl2"; | ||
return true; | ||
} | ||
|
||
void ImGui_ImplOpenGL2_Shutdown() | ||
{ | ||
ImGui_ImplOpenGL2_DestroyDeviceObjects(); | ||
} | ||
|
||
void ImGui_ImplOpenGL2_NewFrame() | ||
{ | ||
if (!g_FontTexture) | ||
ImGui_ImplOpenGL2_CreateDeviceObjects(); | ||
} | ||
|
||
// OpenGL2 Render function. | ||
// (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop) | ||
// 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. | ||
void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data) | ||
{ | ||
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) | ||
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; | ||
|
||
// 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, polygon fill. | ||
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); | ||
GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); | ||
GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); | ||
GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); | ||
glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT); | ||
glEnable(GL_BLEND); | ||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||
glDisable(GL_CULL_FACE); | ||
glDisable(GL_DEPTH_TEST); | ||
glDisable(GL_LIGHTING); | ||
glDisable(GL_COLOR_MATERIAL); | ||
glEnable(GL_SCISSOR_TEST); | ||
//--------------------------- | ||
// [BEGIN] Modified for DART | ||
//--------------------------- | ||
glPushClientAttrib(GL_VERTEX_ARRAY | GL_TEXTURE_COORD_ARRAY | GL_COLOR_ARRAY); | ||
//--------------------------- | ||
// [END] Modified for DART | ||
//--------------------------- | ||
glEnableClientState(GL_VERTEX_ARRAY); | ||
glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||
glEnableClientState(GL_COLOR_ARRAY); | ||
glEnable(GL_TEXTURE_2D); | ||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||
|
||
// If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!), | ||
// 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: | ||
// GLint last_program; | ||
// glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); | ||
// glUseProgram(0); | ||
// ImGui_ImplOpenGL2_RenderDrawData(...); | ||
// glUseProgram(last_program) | ||
|
||
// Setup viewport, orthographic projection matrix | ||
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps. | ||
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height); | ||
glMatrixMode(GL_PROJECTION); | ||
glPushMatrix(); | ||
glLoadIdentity(); | ||
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); | ||
glMatrixMode(GL_MODELVIEW); | ||
glPushMatrix(); | ||
glLoadIdentity(); | ||
|
||
// Will project scissor/clipping rectangles into framebuffer space | ||
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports | ||
ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) | ||
|
||
// Render command lists | ||
for (int n = 0; n < draw_data->CmdListsCount; n++) | ||
{ | ||
const ImDrawList* cmd_list = draw_data->CmdLists[n]; | ||
const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; | ||
const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; | ||
glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos))); | ||
glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv))); | ||
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col))); | ||
|
||
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) | ||
{ | ||
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; | ||
if (pcmd->UserCallback) | ||
{ | ||
// User callback (registered via ImDrawList::AddCallback) | ||
pcmd->UserCallback(cmd_list, pcmd); | ||
} | ||
else | ||
{ | ||
// Project scissor/clipping rectangles into framebuffer space | ||
ImVec4 clip_rect; | ||
clip_rect.x = (pcmd->ClipRect.x - clip_off.x) * clip_scale.x; | ||
clip_rect.y = (pcmd->ClipRect.y - clip_off.y) * clip_scale.y; | ||
clip_rect.z = (pcmd->ClipRect.z - clip_off.x) * clip_scale.x; | ||
clip_rect.w = (pcmd->ClipRect.w - clip_off.y) * clip_scale.y; | ||
|
||
if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f) | ||
{ | ||
// Apply scissor/clipping rectangle | ||
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)); | ||
|
||
// Bind texture, Draw | ||
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId); | ||
glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer); | ||
} | ||
} | ||
idx_buffer += pcmd->ElemCount; | ||
} | ||
} | ||
|
||
// Restore modified state | ||
|
||
glDisableClientState(GL_COLOR_ARRAY); | ||
glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||
glDisableClientState(GL_VERTEX_ARRAY); | ||
//--------------------------- | ||
// [BEGIN] Modified for DART | ||
//--------------------------- | ||
glPopClientAttrib(); | ||
//--------------------------- | ||
// [END] Modified for DART | ||
//--------------------------- | ||
glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture); | ||
glMatrixMode(GL_MODELVIEW); | ||
glPopMatrix(); | ||
glMatrixMode(GL_PROJECTION); | ||
glPopMatrix(); | ||
glPopAttrib(); | ||
glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]); | ||
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]); | ||
} | ||
|
||
bool ImGui_ImplOpenGL2_CreateFontsTexture() | ||
{ | ||
// Build texture atlas | ||
ImGuiIO& io = ImGui::GetIO(); | ||
unsigned char* pixels; | ||
int width, height; | ||
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bits (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. | ||
|
||
// Upload texture to graphics system | ||
GLint last_texture; | ||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); | ||
glGenTextures(1, &g_FontTexture); | ||
glBindTexture(GL_TEXTURE_2D, g_FontTexture); | ||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); | ||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); | ||
|
||
// Store our identifier | ||
io.Fonts->TexID = (ImTextureID)(intptr_t)g_FontTexture; | ||
|
||
// Restore state | ||
glBindTexture(GL_TEXTURE_2D, last_texture); | ||
|
||
return true; | ||
} | ||
|
||
void ImGui_ImplOpenGL2_DestroyFontsTexture() | ||
{ | ||
if (g_FontTexture) | ||
{ | ||
ImGuiIO& io = ImGui::GetIO(); | ||
glDeleteTextures(1, &g_FontTexture); | ||
io.Fonts->TexID = 0; | ||
g_FontTexture = 0; | ||
} | ||
} | ||
|
||
bool ImGui_ImplOpenGL2_CreateDeviceObjects() | ||
{ | ||
return ImGui_ImplOpenGL2_CreateFontsTexture(); | ||
} | ||
|
||
void ImGui_ImplOpenGL2_DestroyDeviceObjects() | ||
{ | ||
ImGui_ImplOpenGL2_DestroyFontsTexture(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// dear imgui: Renderer for OpenGL2 (legacy OpenGL, fixed pipeline) | ||
// This needs to be used along with a Platform Binding (e.g. GLFW, SDL, Win32, custom..) | ||
|
||
// Implemented features: | ||
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID in imgui.cpp. | ||
|
||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this. | ||
// If you are new to dear imgui, read examples/README.txt and read the documentation at the top of imgui.cpp. | ||
// https://github.com/ocornut/imgui | ||
|
||
// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** | ||
// **Prefer using the code in imgui_impl_opengl3.cpp** | ||
// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read. | ||
// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more | ||
// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might | ||
// confuse your GPU driver. | ||
// The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API. | ||
|
||
#pragma once | ||
|
||
IMGUI_IMPL_API bool ImGui_ImplOpenGL2_Init(); | ||
IMGUI_IMPL_API void ImGui_ImplOpenGL2_Shutdown(); | ||
IMGUI_IMPL_API void ImGui_ImplOpenGL2_NewFrame(); | ||
IMGUI_IMPL_API void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data); | ||
|
||
// Called by Init/NewFrame/Shutdown | ||
IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateFontsTexture(); | ||
IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyFontsTexture(); | ||
IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateDeviceObjects(); | ||
IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyDeviceObjects(); |
Oops, something went wrong.