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 }