toit.cpp (5008B)
1 #include "all_includes.hh" 2 3 ToitQuad::ToitQuad(Quad _c, float _height) : Chose(), c(_c), height(_height) { 4 addEntropy(c); 5 } 6 7 void ToitQuad::getBoundingBoxPoints() { 8 addBBPoints(c); 9 addBBPoints(c.offsetNormal(height)); 10 } 11 12 void ToitQuad::triangulation() { 13 bool anglesOk = (c.maxAngle() <= Angle::d2r(90+40) && c.minAngle() < Angle::d2r(90-40)); 14 switch (hash2(seed, -1) % 5) { 15 case 0: plat(); break; 16 case 1: if (anglesOk) { quatrePoints(); break; } 17 case 2: if (anglesOk) { deuxPoints(); break; } 18 case 3: if (anglesOk) { deuxPointsVerticaux(); break; } 19 case 4: 20 default: pointCentral(); break; 21 } 22 } 23 24 void ToitQuad::pointCentral() { 25 Quad qh = c.offsetNormal(height); 26 Vertex center = qh.insetProportionnal(0.3f).randomPoint(seed, 0); 27 for (int i = 0; i < 4; i++) 28 addGPUTriangle(c[SE+i], center, c[NE+i], Couleurs::toit); 29 } 30 31 void ToitQuad::quatrePoints() { 32 Quad ch = c.offsetNormal(height).insetProportionnal(0.6f); 33 addGPUQuad(ch, Couleurs::toit); 34 for (int i = 0; i < 4; i++) 35 addGPUQuad(ch[NE+i], c[NE+i], c[SE+i], ch[SE+i], Couleurs::toit); 36 } 37 38 void ToitQuad::deuxPoints() { 39 // Orienter c dans le sens de la longueur d'est en ouest. 40 Quad q = c >> ((c.maxLengthNS() > c.maxLengthEW()) ? 1 : 0); 41 Quad qh = q.offsetNormal(height); 42 43 float coef = height / Segment(q[NW],q[SW]).length(); 44 float eLength = Segment(q[NE],q[SE]).length(); 45 qh[NE] = q[NE] + Vertex(qh[NE]-q[NE]).setNorm(coef*eLength); 46 qh[SE] = q[SE] + Vertex(qh[SE]-q[SE]).setNorm(coef*eLength); 47 48 //Vertex w = Segment(qh[NW], qh[SW]).randomPos(seed, 0, 1.f/3.f, 2.f/3.f); 49 //Vertex e = Segment(qh[NE], qh[SE]).randomPos(seed, 1, 1.f/3.f, 2.f/3.f); 50 Vertex w = qh[SW] + Vertex(qh[NW] - qh[SW])/2; 51 Vertex e = qh[SE] + Vertex(qh[NE] - qh[SE])/2; 52 Vertex centerE = Segment(e,w).randomPos(seed, 2, 0.6f, 0.8f); 53 Vertex centerW = Segment(e,w).randomPos(seed, 2, 0.2f, 0.4f); 54 addGPUTriangle(q[SE], centerE, q[NE], Couleurs::toit); 55 addGPUTriangle(q[NW], centerW, q[SW], Couleurs::toit); 56 addGPUQuad(q[SE], q[SW], centerW, centerE, Couleurs::toit); 57 addGPUQuad(q[NW], q[NE], centerE, centerW, Couleurs::toit); 58 } 59 60 void ToitQuad::deuxPointsVerticaux() { 61 // Orienter c dans le sens de la longueur d'est en ouest. 62 Quad q = c >> ((c.maxLengthNS() > c.maxLengthEW()) ? 1 : 0); 63 Quad qh = q.offsetNormal(height); 64 65 66 float coef = height / Segment(q[NW],q[SW]).length(); 67 float eLength = Segment(q[NE],q[SE]).length(); 68 qh[NE] = q[NE] + Vertex(qh[NE]-q[NE]).setNorm(coef*eLength); 69 qh[SE] = q[SE] + Vertex(qh[SE]-q[SE]).setNorm(coef*eLength); 70 71 //Vertex w = Segment(qh[NW], qh[SW]).randomPos(seed, 0, 1.f/3.f, 2.f/3.f); 72 //Vertex e = Segment(qh[NE], qh[SE]).randomPos(seed, 1, 1.f/3.f, 2.f/3.f); 73 Vertex w = qh[SW] + Vertex(qh[NW] - qh[SW])/2; 74 Vertex e = qh[SE] + Vertex(qh[NE] - qh[SE])/2; 75 76 77 78 79 addGPUTriangle(q[SE], e, q[NE], Couleurs::mur); 80 addGPUTriangle(q[NW], w, q[SW], Couleurs::mur); 81 addGPUQuad(q[SE], q[SW], w, e, Couleurs::toit); 82 addGPUQuad(q[NW], q[NE], e, w, Couleurs::toit); 83 } 84 85 void ToitQuad::plat() { 86 Quad ch = c.offsetNormal(Dimensions::hauteurToit * 0.6f); 87 addGPUFourQuads(c, ch, Couleurs::toit); 88 addGPUQuad(ch, Couleurs::toit); 89 } 90 91 ToitTri::ToitTri(Triangle _c, float _height) : Chose(), c(_c), height(_height) { 92 addEntropy(c); 93 } 94 95 void ToitTri::getBoundingBoxPoints() { 96 addBBPoints(c); 97 addBBPoints(c.offsetNormal(height)); 98 } 99 100 void ToitTri::triangulation() { 101 bool anglesOk = (c.maxAngle() <= Angle::d2r(120) && c.minAngle() >= Angle::d2r(30)); 102 switch (hash2(seed, -1) % 5) { 103 case 0: pointCentral(); break; 104 case 1: if (anglesOk) { troisPoints(); break; } 105 case 2: unPointVertical(); break; 106 case 3: if (anglesOk) { deuxPointsVerticaux(); break; } 107 case 4: 108 default: plat(); break; 109 } 110 } 111 112 void ToitTri::pointCentral() { 113 Triangle th = c.offsetNormal(height); 114 Vertex center = th.insetProportionnal(0.3f).randomPoint(seed, 0); 115 for (int i = 0; i < 3; i++) 116 addGPUTriangle(c[LEFT+i], center, c[TOP+i], Couleurs::toit); 117 } 118 119 void ToitTri::troisPoints() { 120 Triangle th = c.offsetNormal(height).insetProportionnal(0.6f); 121 addGPUTriangle(th, Couleurs::toit); 122 for (int i = 0; i < 3; i++) 123 addGPUQuad(c[LEFT+i], c[TOP+i], th[TOP+i], th[LEFT+i], Couleurs::toit); 124 } 125 126 void ToitTri::unPointVertical() { 127 // Rotation aléatoire du triangle 128 Triangle t = c >> (hash2(seed, 0) % 3); 129 Triangle th = t.offsetNormal(height); 130 addGPUTriangle(t[LEFT], th[TOP], t[RIGHT], Couleurs::toit); 131 addGPUTriangle(t[TOP], th[TOP], t[LEFT], Couleurs::toit); 132 addGPUTriangle(t[RIGHT], th[TOP], t[TOP], Couleurs::toit); 133 } 134 135 void ToitTri::deuxPointsVerticaux() { 136 // Rotation aléatoire du triangle 137 Triangle t = c >> (hash2(seed, 0) % 3); 138 Triangle th = t.offsetNormal(height); 139 addGPUTriangle(th[LEFT], t[TOP], th[RIGHT], Couleurs::toit); 140 addGPUTriangle(t[TOP], th[LEFT], t[LEFT], Couleurs::toit); 141 addGPUTriangle(t[RIGHT], th[RIGHT], t[TOP], Couleurs::toit); 142 } 143 144 void ToitTri::plat() { 145 Triangle ch = c.offsetNormal(Dimensions::hauteurToit * 0.6f); 146 addGPUThreeQuads(c, ch, Couleurs::toit); 147 addGPUTriangle(ch, Couleurs::toit); 148 }