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 
35 	glfwSetErrorCallback(&glfw_foutterugroep);
36 	glfwInit();
37 	_hdTijd = StopWatch(AutoStart.yes); // Herstelt naar 0 zodra hdLus op wordt geroepen.
38 }
39 
40 private ulong _hdStaptal = 0;
41 private StopWatch _hdTijd;
42 
43 @property
44 public ulong hdStaptal(){
45 	return _hdStaptal;
46 }
47 
48 @property
49 public Duration hdTijd(){
50 	return _hdTijd.peek();
51 }
52 
53 public void hdStap() {
54 	_hdStaptal += 1;
55 
56 	foreach (Venster venster; Venster.vensters.values)
57 		venster.verwerkInvoer();
58 
59 	foreach (Wereld wereld; Wereld.werelden)
60 		wereld.denkWereld();
61 
62 	foreach (Wereld wereld; Wereld.werelden)
63 		wereld.werkWereldBij();
64 
65 	import std.stdio;
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 
77 	foreach (Venster venster; Venster.vensters.values)
78 		venster.leegInvoer();
79 
80 	glfwPollEvents();
81 }
82 
83 public void hdLus() {
84 	_hdTijd.reset();
85 	while (Venster.vensters.length > 0)
86 		hdStap();
87 }