1 module gui.guimain; 2 3 import std.string; 4 import std.conv; 5 6 import derelict.opengl3.gl3; 7 import derelict.glfw3.glfw3; 8 import derelict.imgui.imgui; 9 import imgui_glfw; 10 import imgui_demo; 11 12 GLFWwindow* window; 13 float[3] clear_color = [0.3f, 0.4f, 0.8f]; 14 bool showDDemoWindow; 15 bool showOrgDemoWindow; 16 17 void main(string[] argv) { 18 19 DerelictGL3.load(); 20 DerelictGLFW3.load(); 21 DerelictImgui.load(); 22 23 // Setup window 24 window = initWindow("ImGui OpenGL3 example"); 25 if(!window) return; 26 27 // Setup ImGui binding 28 igImplGlfwGL3_Init(window, true); 29 30 // Main loop 31 while (!glfwWindowShouldClose(window)) { 32 glfwPollEvents(); 33 igImplGlfwGL3_NewFrame(); 34 35 // contents 36 if(igButton("RUN imgui_demo (D-lang version)")) showDDemoWindow = !showDDemoWindow; 37 if(igButton("RUN imgui_demo (C++ version)")) showOrgDemoWindow = !showOrgDemoWindow; 38 if(showDDemoWindow) { 39 igSetNextWindowPos(ImVec2(660, 30), ImGuiCond_FirstUseEver); 40 imgui_demo.igShowDemoWindow(&showDDemoWindow); 41 } 42 if(showOrgDemoWindow) { 43 igSetNextWindowPos(ImVec2(650, 20), ImGuiCond_FirstUseEver); 44 derelict.imgui.imgui.igShowDemoWindow(&showOrgDemoWindow); 45 } 46 47 // Rendering 48 auto io = igGetIO(); 49 glViewport(0, 0, cast(int)io.DisplaySize.x, cast(int)io.DisplaySize.y); 50 glClearColor(clear_color[0], clear_color[1], clear_color[2], 0); 51 glClear(GL_COLOR_BUFFER_BIT); 52 igRender(); 53 glfwSwapBuffers(window); 54 } 55 56 // Cleanup 57 igImplGlfwGL3_Shutdown(); 58 glfwTerminate(); 59 } 60 61 GLFWwindow* initWindow(string title) { 62 63 // Setup window 64 glfwSetErrorCallback(&error_callback); 65 if (!glfwInit()) 66 return null; 67 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 68 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 69 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 70 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, true); 71 auto window = glfwCreateWindow(1280, 720, title.toStringz(), null, null); 72 glfwMakeContextCurrent(window); 73 glfwSwapInterval(1); // Enable vsync 74 glfwInit(); 75 76 DerelictGL3.reload(); 77 return window; 78 } 79 80 extern(C) nothrow void error_callback(int error, const(char)* description) { 81 import std.stdio; 82 import std.conv; 83 try writefln("glfw err: %s ('%s')",error, to!string(description)); 84 catch(Throwable) {} 85 }