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 }