1 /** 2 Copyright: Copyright (c) 2014 Andrey Penechko. 3 License: a$(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 7 module anchovy.gui.application.application; 8 9 import std.stdio : writeln; 10 import anchovy.core.interfaces.iwindow; 11 import anchovy.gui; 12 13 public import anchovy.gui.application.eventaggregator; 14 public import anchovy.gui.application.fpshelper; 15 16 class Application(WindowType) 17 { 18 IWindow window; 19 FpsHelper fpsHelper; 20 TimerManager timerManager; 21 bool isRunning = true; 22 23 IRenderer renderer; 24 IGuiRenderer guiRenderer; 25 26 GuiContext context; 27 TemplateManager templateManager; 28 29 this(uvec2 windowSize, string caption) 30 { 31 window = new WindowType(); 32 33 auto eventAggregator = new EventAggregator!WindowType(this, window); 34 35 window.init(windowSize, caption); 36 } 37 38 void run(in string[] args) 39 { 40 init(args); 41 load(args); 42 43 double lastTime = window.elapsedTime; 44 double newTime; 45 46 while(isRunning) 47 { 48 window.processEvents(); 49 50 newTime = window.elapsedTime; 51 52 update(newTime - lastTime); 53 54 lastTime = newTime; 55 56 draw(); 57 58 fpsHelper.sleepAfterFrame(lastTime - window.elapsedTime); 59 } 60 61 window.releaseWindow; 62 } 63 64 string[] getHardwareInfo() 65 { 66 import core.cpuid; 67 import anchovy.utils.string : ZToString; 68 69 return [ 70 "CPU vendor: " ~ vendor, 71 "CPU name: " ~ processor, 72 "Cores: " ~ to!string(coresPerCPU), 73 "Threads: " ~ to!string(threadsPerCPU), 74 "CPU chache levels: " ~ to!string(cacheLevels), 75 "GPU vendor: " ~ ZToString(glGetString(GL_VENDOR)), 76 "Renderer: " ~ ZToString(glGetString(GL_RENDERER)), 77 "OpenGL version: " ~ ZToString(glGetString(GL_VERSION)), 78 "GLSL version: " ~ ZToString(glGetString(GL_SHADING_LANGUAGE_VERSION)), 79 ]; 80 } 81 82 void init(in string[] args) 83 { 84 writeln("---------------------- System info ----------------------"); 85 foreach(item; getHardwareInfo()) 86 writeln(item); 87 writeln("---------------------------------------------------------\n"); 88 89 dstring cyrillicChars = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюяє"d; 90 91 // ----------------------------- Setting renderer ----------------------------- 92 renderer = new Ogl3Renderer(window); 93 renderer.setClearColor(Color(50, 10, 45)); 94 95 // ----------------------------- Skin loading --------------------------------- 96 string graySkinSource = cast(string)read("skingray.json"); 97 auto skinParser = new JsonGuiSkinParser; 98 auto graySkin = skinParser.parse(graySkinSource); 99 100 // ----------------------------- Gui renderer --------------------------------- 101 guiRenderer = new SkinnedGuiRenderer(renderer, graySkin); 102 guiRenderer.fontManager.charCache ~= cyrillicChars; 103 graySkin.loadResources(guiRenderer); 104 105 timerManager = new TimerManager(delegate double(){return window.elapsedTime;}); 106 107 // ----------------------------- Template classes ----------------------------- 108 auto templateParser = new TemplateParser; 109 templateManager = new TemplateManager(templateParser); 110 111 // ----------------------------- Setting context ------------------------------ 112 context = new GuiContext(guiRenderer, timerManager, templateManager, graySkin); 113 context.setClipboardStringCallback = (dstring newStr) => window.clipboardString = to!string(newStr); 114 context.getClipboardStringCallback = delegate dstring(){return to!dstring(window.clipboardString);}; 115 context.attachDefaultBehaviors(); 116 context.attachDefaultLayouts(); 117 118 // ----------------------------- Rendering settings --------------------------- 119 renderer.enableAlphaBlending(); 120 glEnable(GL_SCISSOR_TEST); 121 } 122 123 void load(in string[] args) 124 { 125 126 } 127 128 void update(double dt) 129 { 130 fpsHelper.update(dt); 131 timerManager.updateTimers(window.elapsedTime); 132 context.update(dt); 133 } 134 135 void draw() 136 { 137 guiRenderer.setClientArea(Rect(0, 0, window.size.x, window.size.y)); 138 glClear(GL_COLOR_BUFFER_BIT); 139 140 context.draw(); 141 142 window.swapBuffers(); 143 } 144 145 void closePressed() 146 { 147 } 148 }