main.cpp (10716B)
1 // Dear ImGui: standalone example application for GLFW + OpenGL 3, using programmable pipeline 2 // (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) 3 // If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. 4 // Read online: https://github.com/ocornut/imgui/tree/master/docs 5 6 #include "imgui.h" 7 #include "imgui_impl_glfw.h" 8 #include "imgui_impl_opengl3.h" 9 #include <stdio.h> 10 11 #if defined(IMGUI_IMPL_OPENGL_ES2) 12 #include <GLES2/gl2.h> 13 // About Desktop OpenGL function loaders: 14 // Modern desktop OpenGL doesn't have a standard portable header file to load OpenGL function pointers. 15 // Helper libraries are often used for this purpose! Here we are supporting a few common ones (gl3w, glew, glad). 16 // You may use another loader/header of your choice (glext, glLoadGen, etc.), or chose to manually implement your own. 17 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GL3W) 18 #include <GL/gl3w.h> // Initialize with gl3wInit() 19 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW) 20 #include <GL/glew.h> // Initialize with glewInit() 21 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD) 22 #include <glad/glad.h> // Initialize with gladLoadGL() 23 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD2) 24 #include <glad/gl.h> // Initialize with gladLoadGL(...) or gladLoaderLoadGL() 25 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING2) 26 #define GLFW_INCLUDE_NONE // GLFW including OpenGL headers causes ambiguity or multiple definition errors. 27 #include <glbinding/Binding.h> // Initialize with glbinding::Binding::initialize() 28 #include <glbinding/gl/gl.h> 29 using namespace gl; 30 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING3) 31 #define GLFW_INCLUDE_NONE // GLFW including OpenGL headers causes ambiguity or multiple definition errors. 32 #include <glbinding/glbinding.h>// Initialize with glbinding::initialize() 33 #include <glbinding/gl/gl.h> 34 using namespace gl; 35 #else 36 #include IMGUI_IMPL_OPENGL_LOADER_CUSTOM 37 #endif 38 39 // Include glfw3.h after our OpenGL definitions 40 #include <GLFW/glfw3.h> 41 42 // [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. 43 // To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. 44 // Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. 45 #if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) 46 #pragma comment(lib, "legacy_stdio_definitions") 47 #endif 48 49 static void glfw_error_callback(int error, const char* description) 50 { 51 fprintf(stderr, "Glfw Error %d: %s\n", error, description); 52 } 53 54 int main(int, char**) 55 { 56 // Setup window 57 glfwSetErrorCallback(glfw_error_callback); 58 if (!glfwInit()) 59 return 1; 60 61 // Decide GL+GLSL versions 62 #if defined(IMGUI_IMPL_OPENGL_ES2) 63 // GL ES 2.0 + GLSL 100 64 const char* glsl_version = "#version 100"; 65 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); 66 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); 67 glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); 68 #elif defined(__APPLE__) 69 // GL 3.2 + GLSL 150 70 const char* glsl_version = "#version 150"; 71 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 72 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 73 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only 74 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac 75 #else 76 // GL 3.0 + GLSL 130 77 const char* glsl_version = "#version 130"; 78 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 79 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); 80 //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only 81 //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only 82 #endif 83 84 // Create window with graphics context 85 GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", NULL, NULL); 86 if (window == NULL) 87 return 1; 88 glfwMakeContextCurrent(window); 89 glfwSwapInterval(1); // Enable vsync 90 91 // Initialize OpenGL loader 92 #if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W) 93 bool err = gl3wInit() != 0; 94 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW) 95 bool err = glewInit() != GLEW_OK; 96 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD) 97 bool err = gladLoadGL() == 0; 98 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD2) 99 bool err = gladLoadGL(glfwGetProcAddress) == 0; // glad2 recommend using the windowing library loader instead of the (optionally) bundled one. 100 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING2) 101 bool err = false; 102 glbinding::Binding::initialize(); 103 #elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING3) 104 bool err = false; 105 glbinding::initialize([](const char* name) { return (glbinding::ProcAddress)glfwGetProcAddress(name); }); 106 #else 107 bool err = false; // If you use IMGUI_IMPL_OPENGL_LOADER_CUSTOM, your loader is likely to requires some form of initialization. 108 #endif 109 if (err) 110 { 111 fprintf(stderr, "Failed to initialize OpenGL loader!\n"); 112 return 1; 113 } 114 115 // Setup Dear ImGui context 116 IMGUI_CHECKVERSION(); 117 ImGui::CreateContext(); 118 ImGuiIO& io = ImGui::GetIO(); (void)io; 119 //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls 120 //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls 121 122 // Setup Dear ImGui style 123 ImGui::StyleColorsDark(); 124 //ImGui::StyleColorsClassic(); 125 126 // Setup Platform/Renderer backends 127 ImGui_ImplGlfw_InitForOpenGL(window, true); 128 ImGui_ImplOpenGL3_Init(glsl_version); 129 130 // Load Fonts 131 // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. 132 // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. 133 // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). 134 // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. 135 // - Read 'docs/FONTS.md' for more instructions and details. 136 // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! 137 //io.Fonts->AddFontDefault(); 138 //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); 139 //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); 140 //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); 141 //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); 142 //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); 143 //IM_ASSERT(font != NULL); 144 145 // Our state 146 bool show_demo_window = true; 147 bool show_another_window = false; 148 ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); 149 150 // Main loop 151 while (!glfwWindowShouldClose(window)) 152 { 153 // Poll and handle events (inputs, window resize, etc.) 154 // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. 155 // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. 156 // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. 157 // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. 158 glfwPollEvents(); 159 160 // Start the Dear ImGui frame 161 ImGui_ImplOpenGL3_NewFrame(); 162 ImGui_ImplGlfw_NewFrame(); 163 ImGui::NewFrame(); 164 165 // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). 166 if (show_demo_window) 167 ImGui::ShowDemoWindow(&show_demo_window); 168 169 // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. 170 { 171 static float f = 0.0f; 172 static int counter = 0; 173 174 ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. 175 176 ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) 177 ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state 178 ImGui::Checkbox("Another Window", &show_another_window); 179 180 ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f 181 ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color 182 183 if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) 184 counter++; 185 ImGui::SameLine(); 186 ImGui::Text("counter = %d", counter); 187 188 ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); 189 ImGui::End(); 190 } 191 192 // 3. Show another simple window. 193 if (show_another_window) 194 { 195 ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) 196 ImGui::Text("Hello from another window!"); 197 if (ImGui::Button("Close Me")) 198 show_another_window = false; 199 ImGui::End(); 200 } 201 202 // Rendering 203 ImGui::Render(); 204 int display_w, display_h; 205 glfwGetFramebufferSize(window, &display_w, &display_h); 206 glViewport(0, 0, display_w, display_h); 207 glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); 208 glClear(GL_COLOR_BUFFER_BIT); 209 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); 210 211 glfwSwapBuffers(window); 212 } 213 214 // Cleanup 215 ImGui_ImplOpenGL3_Shutdown(); 216 ImGui_ImplGlfw_Shutdown(); 217 ImGui::DestroyContext(); 218 219 glfwDestroyWindow(window); 220 glfwTerminate(); 221 222 return 0; 223 }