1 module hoekjed.kern.kern;
2 import bindbc.glfw;
3 import core.sys.windows.windows;
4 import hoekjed.kern;
5 import std.conv : to;
6 import std.stdio : writefln;
7 import std.datetime.stopwatch;
8 
9 private extern (C) void glfw_foutterugroep(int soort, const char* beschrijving) nothrow {
10 	try {
11 		writefln("GLFW Fout %d: %s", soort, beschrijving.to!string);
12 	} catch (Exception e) {
13 	}
14 }
15 
16 debug {
17 	package HWND console = null;
18 	package bool _console_zichtbaar = false;
19 }
20 
21 debug void hdToonConsole(bool zichtbaar) {
22 	ShowWindow(console, zichtbaar ? SW_SHOW : SW_HIDE);
23 	_console_zichtbaar = zichtbaar;
24 }
25 
26 void hdZetOp() {
27 	debug {
28 		console = GetConsoleWindow();
29 		SetWindowPos(console, HWND_BOTTOM, 0, 0, 1920 / 3, 1080 / 3, SWP_HIDEWINDOW);
30 	} else {
31 		FreeConsole();
32 	}
33 
34 	glfwSetErrorCallback(&glfw_foutterugroep);
35 	glfwInit();
36 	_hdTijd = StopWatch(AutoStart.yes); // Herstelt naar 0 zodra hdLus op wordt geroepen.
37 }
38 
39 private ulong _hdStaptal = 0;
40 private StopWatch _hdTijd;
41 
42 @property
43 public ulong hdStaptal() {
44 	return _hdStaptal;
45 }
46 
47 @property
48 public Duration hdTijd() {
49 	return _hdTijd.peek();
50 }
51 
52 public void hdStap() {
53 	_hdStaptal += 1;
54 
55 	foreach (Venster venster; Venster.vensters.values)
56 		venster.verwerkInvoer();
57 
58 	foreach (Wereld wereld; Wereld.werelden)
59 		wereld.denkWereld();
60 
61 	foreach (Wereld wereld; Wereld.werelden)
62 		wereld.werkWereldBij();
63 
64 	import std.stdio;
65 
66 	foreach (Venster venster; Venster.vensters.values) {
67 		GLFWwindow* glfw_venster = venster.glfw_venster;
68 		if (glfwWindowShouldClose(venster.glfw_venster)) {
69 			glfwDestroyWindow(glfw_venster);
70 			Venster.vensters.remove(glfw_venster);
71 			//PAS OP: mogelijke nullpointers wanneer werelden of voorwerpen dit venster gebruiken.
72 		} else
73 			venster.teken();
74 	}
75 
76 	foreach (Venster venster; Venster.vensters.values)
77 		venster.leegInvoer();
78 
79 	glfwPollEvents();
80 }
81 
82 public void hdLus() {
83 	_hdTijd.reset();
84 	while (Venster.vensters.length > 0)
85 		hdStap();
86 }