1 module hoekjed.dingen.plattevorm;
2 import bindbc.opengl;
3 import hoekjed.kern;
4 import std.math : cos, PI, sin;
5 
6 class PlatteVorm : Voorwerp {
7 	// PAS OP: Dit kan opruiming van geheugen voorkomen.
8 	private static Voorwerp[Oproeping] aangemaakt;
9 
10 	private struct Oproeping {
11 		uint hoektal;
12 		Vec!3 plek;
13 		bool maakNormalen;
14 		bool maakBeeldplekken;
15 	}
16 
17 	this(uint hoektal, Vec!3 plek = Vec!(3).nul, bool maakNormalen = false,
18 		bool maakBeeldplekken = false) {
19 		assert(hoektal >= 3);
20 		Oproeping oproeping = Oproeping(hoektal, plek, maakNormalen, maakBeeldplekken);
21 		if (oproeping in aangemaakt) {
22 			super(aangemaakt[oproeping]);
23 			return;
24 		}
25 
26 		Vec!3[] plekken = new Vec!3[](hoektal);
27 		immutable real stap = 2 * PI / hoektal;
28 		foreach (i; 0 .. hoektal)
29 			plekken[i] = Vec!3([
30 				-0.5 * sin(i * stap) + plek.x, 0 + plek.y,
31 				0.5 * cos(i * stap) + plek.z
32 			]);
33 
34 		aangemaakt[oproeping] = this;
35 		this(plekken, maakNormalen, maakBeeldplekken);
36 	}
37 
38 	this(Vec!3[] plekken, bool maakNormalen = false, bool maakBeeldplekken = false) {
39 		assert(plekken.length >= 3);
40 
41 		Vec!(3, uint)[] volgorde;
42 		volgorde.length = plekken.length - 2;
43 		foreach (uint i; 0 .. cast(uint) volgorde.length) {
44 			volgorde[i] = Vec!(3, uint)([0, i + 1, i + 2]);
45 		}
46 
47 		Vec!3[] normalen = null;
48 		if (maakNormalen) {
49 			Vec!3 normaal = plekken[0].uitp(plekken[1]).normaliseer();
50 			normalen = new Vec!3[](plekken.length);
51 			normalen[] = normaal;
52 			// Normalen kunnen mogelijk ook voor alle voorwerpen berekend worden.
53 		}
54 
55 		Vec!2[] beeldplekken = null;
56 		if (maakBeeldplekken) {
57 			beeldplekken = new Vec!2[](plekken.length);
58 			Vec!3 plek = Vec!3([plekken[0].x, plekken[0].y, plekken[0].z - 1]);
59 			foreach (i; 0 .. plekken.length)
60 				beeldplekken[i] = Vec!2([
61 					(plekken[i].x - plek.x) * 0.5 + 0.5,
62 					(plekken[i].z - plek.z) * 0.5 + 0.5
63 				]);
64 		}
65 
66 		super(plekken, volgorde, normalen, beeldplekken);
67 	}
68 }