1 module hoekjed.dingen.zicht;
2 import hoekjed.kern;
3 
4 abstract class Zicht : Ding { // VOEG TOE: zicht als ding in de wereld.
5 	Mat!4 projectieM;
6 	Mat!4 zichtM;
7 
8 	override void teken() {
9 	}
10 
11 	override void denk() {
12 	}
13 
14 	override protected void werkBij(bool ouderAangepast) {
15 		werkZichtMBij();
16 		werkProjectieMBij();
17 		super.werkBij(ouderAangepast);
18 	}
19 
20 	abstract void werkProjectieMBij();
21 	void werkZichtMBij() {
22 		zichtM = Mat!(4).identiteit;
23 		zichtM[0][3] = -_plek.x;
24 		zichtM[1][3] = -_plek.y;
25 		zichtM[2][3] = -_plek.z;
26 		zichtM = Mat!(4).draaiMy(-_draai.y).maal(Mat!(4).draaiMx(-_draai.x)
27 				.maal(Mat!(4).draaiMz(-_draai.z)).maal(zichtM));
28 		zichtM[0][] = zichtM[0][] / grootte.x;
29 		zichtM[1][] = zichtM[1][] / grootte.y;
30 		zichtM[2][] = zichtM[2][] / grootte.z;
31 	}
32 }
33 
34 class DiepteZicht : Zicht {
35 	nauwkeurigheid schermverhouding;
36 	nauwkeurigheid zichthoek;
37 	nauwkeurigheid voorvlak;
38 	nauwkeurigheid achtervlak;
39 
40 	this(nauwkeurigheid schermverhouding = 1920.0 / 1080.0, nauwkeurigheid zichthoek = 90,
41 		nauwkeurigheid voorvlak = 0.01, nauwkeurigheid achtervlak = 100) {
42 		this.voorvlak = voorvlak;
43 		this.achtervlak = achtervlak;
44 		this.zichthoek = zichthoek;
45 		this.schermverhouding = schermverhouding;
46 	}
47 
48 	override void werkProjectieMBij() {
49 		import std.math : tan;
50 
51 		alias A = achtervlak;
52 		alias V = voorvlak;
53 
54 		const nauwkeurigheid a = 1 / tan(zichthoek / 2);
55 		projectieM.mat = [
56 			[a, 0, 0, 0], [0, 0, schermverhouding * a, 0],
57 			[0, (A + V) / (A - V), 0, -(2 * A * V) / (A - V)],
58 			[0, cast(nauwkeurigheid) 1, 0, 0]
59 		];
60 	}
61 }
62 
63 // VOEG TOE: VlakteZicht
64 class VlakteZicht : Zicht {
65 	nauwkeurigheid breedte_1;
66 	nauwkeurigheid hoogte_1;
67 	nauwkeurigheid voorvlak;
68 	nauwkeurigheid achtervlak;
69 
70 	this(nauwkeurigheid breedte = 16, nauwkeurigheid hoogte = 9, nauwkeurigheid voorvlak = 0, nauwkeurigheid achtervlak = 100) {
71 		this.breedte_1 = 1 / breedte;
72 		this.hoogte_1 = 1 / hoogte;
73 		this.voorvlak = voorvlak;
74 		this.achtervlak = achtervlak;
75 	}
76 
77 	override void werkProjectieMBij() {
78 		nauwkeurigheid a = 1 / (achtervlak - voorvlak);
79 		projectieM.mat = [
80 			[2 * breedte_1, 0, 0, 0], [0, 0, 2 * hoogte_1, 0],
81 			[0, 2 * a, 0, -(achtervlak + voorvlak) * a],
82 			[0, 0, 0, cast(nauwkeurigheid) 1]
83 		];
84 	}
85 }