www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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 }