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 }