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 }