1 module hoekjed.dingen.wereld;
2 
3 import hoekjed;
4 
5 class Wereld : Ding {
6 	static Wereld[] werelden;
7 	Voorwerp[][Verver] voorwerpen;
8 	Ding[] dingen; // Bevat geen voorwerpen.
9 	Ding[] uitgeschakeld;
10 
11 	this() {
12 		this._wereld = this;
13 		Wereld.werelden ~= this;
14 	}
15 
16 	public void tekenWereld(Zicht zicht) {
17 		// Poging zo min mogelijk van verver te wisselen.
18 		this.teken();
19 		foreach (Verver verver; voorwerpen.byKey()) {
20 			verver.gebruik();
21 			verver.zetUniform(zicht);
22 			foreach (Voorwerp voorwerp; voorwerpen[verver])
23 				voorwerp.teken();
24 		}
25 		// VERBETER: overige dingen werken mogelijk met meerdere shaders of gebruiken andere tekenmethoden.
26 		foreach (Ding ding; dingen)
27 			ding.teken();
28 	}
29 
30 	public void denkWereld() {
31 		this.denk();
32 		foreach (Voorwerp[] voorwerpen2; voorwerpen.values)
33 			foreach (Voorwerp voorwerp; voorwerpen2)
34 				voorwerp.denk();
35 		foreach (Ding ding; dingen)
36 			ding.denk();
37 	}
38 
39 	public void werkWereldBij() {
40 		super.werkBij(false); // Werkt alles in de wereldboom bij.
41 	}
42 
43 	public override void teken() {
44 	}
45 
46 	public override void denk() {
47 	}
48 
49 	package void voegDing(Ding ding) {
50 		assert(ding._wereld is null);
51 		foreach (Ding kind; ding.kinderen)
52 			voegDing(kind);
53 		ding._wereld = this;
54 		if (Voorwerp voorwerp = cast(Voorwerp) ding) {
55 			voorwerpen[voorwerp.verver] ~= voorwerp;
56 		} else
57 			dingen ~= ding;
58 	}
59 
60 	package void verwijderDing(Ding ding) {
61 		assert(ding._wereld is this);
62 		foreach (Ding kind; ding.kinderen)
63 			verwijderDing(kind);
64 		if (Voorwerp voorwerp = cast(Voorwerp) ding)
65 			voorwerpen[voorwerp.verver].verwijder(voorwerp);
66 		else
67 			dingen.verwijder(ding);
68 		ding._wereld = null;
69 	}
70 
71 	void zetIngeschakeld(Ding ding, bool ingeschakeld) {
72 		if (Voorwerp voorwerp = cast(Voorwerp) ding) {
73 			if (ingeschakeld) {
74 				voorwerpen[voorwerp.verver].verwijder(voorwerp);
75 				uitgeschakeld ~= voorwerp;
76 			} else {
77 				uitgeschakeld.verwijder(voorwerp);
78 				voorwerpen[voorwerp.verver] ~= voorwerp;
79 			}
80 		} else {
81 			if (ingeschakeld) {
82 				dingen.verwijder(ding);
83 				uitgeschakeld ~= ding;
84 			} else {
85 				uitgeschakeld.verwijder(ding);
86 				dingen ~= ding;
87 			}
88 		}
89 	}
90 }