1 module hoekjed.dingen.plattevorm; 2 import bindbc.opengl; 3 import hoekjed.kern; 4 import std.math : cos, PI, sin; 5 6 7 class PlatteVorm : Voorwerp { 8 // PAS OP: Dit kan opruiming van geheugen voorkomen. 9 private static Voorwerp[Oproeping] aangemaakt; 10 11 private struct Oproeping{ 12 uint hoektal; 13 Vec!3 plek; 14 bool maakNormalen; 15 bool maakBeeldplekken; 16 } 17 18 this(uint hoektal, Vec!3 plek = Vec!(3).nul, bool maakNormalen = false, 19 bool maakBeeldplekken = false) { 20 assert(hoektal >= 3); 21 Oproeping oproeping = Oproeping(hoektal, plek, maakNormalen, maakBeeldplekken); 22 if(oproeping in aangemaakt) { 23 super(aangemaakt[oproeping]); 24 return; 25 } 26 27 Vec!3[] plekken = new Vec!3[](hoektal); 28 immutable real stap = 2 * PI / hoektal; 29 foreach (i; 0 .. hoektal) 30 plekken[i] = Vec!3([ 31 -0.5*sin(i * stap) + plek.x, 0 + plek.y, 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 }