etage.cpp (3984B)
1 #include "all_includes.hh" 2 3 EtageQuad::EtageQuad(Quad _c, Quad _ch, QuadBool _w, int _etage, int _nbEtages) : Chose(), c(_c), ch(_ch), w(_w), etage(_etage), nbEtages(_nbEtages) { 4 addEntropy(c); 5 addEntropy(ch); 6 for (int i = 0; i < 4; i++) 7 addEntropy(w[N+i] ? 0 : 1); 8 } 9 10 void EtageQuad::getBoundingBoxPoints() { 11 addBBPoints(c); 12 addBBPoints(ch); 13 } 14 15 void EtageQuad::split() { 16 if (nbEtages > 1 && etage == 0 && ((w[N] && w[S]) || (w[E] && w[W])) && c.minLengthEW() > 800 && proba(seed, 0, 0.8)) { 17 Quad q = c << ((w[N] && w[S]) ? 0 : 1); 18 Quad qh = ch << ((w[N] && w[S]) ? 0 : 1); 19 Vertex n = (q[NW] + q[NE]) / 2.f; 20 Vertex s = (q[SE] + q[SW]) / 2.f; 21 Vertex nh = (qh[NW] + qh[NE]) / 2.f; 22 Vertex sh = (qh[SE] + qh[SW]) / 2.f; 23 Quad e = Quad(q[NE], q[SE], s, n).inset(W, 200); 24 Quad w = Quad(n, s, q[SW], q[NW]).inset(E, 200); 25 Quad eh = Quad(qh[NE], qh[SE], sh, nh).inset(W, 200); 26 Quad wh = Quad(nh, sh, qh[SW], qh[NW]).inset(E, 200); 27 Quad ei = e.insetNESW(28, 28, 28, 0); 28 Quad wi = w.insetNESW(28, 0, 28, 28); 29 Quad eih = eh.insetNESW(28, 28, 28, 0); 30 Quad wih = wh.insetNESW(28, 0, 28, 28); 31 // TODO : ArcheQuad(Quad, Quad); 32 addChild(new ArcheQuad(Quad(e[NW], e[SW], w[SE], w[NE]), Segment(qh[NE], q[NE]).length())); 33 // Mur sur e[N], e[E], e[S], w[S], w[W], w[N]; 34 for (int i = 0; i < 3; i++) { 35 addChild(new MurQuad(Quad(e[NE+i], ei[NE+i], ei[NW+i], e[NW+i]), Quad(eh[NE+i], eih[NE+i], eih[NW+i], eh[NW+i]))); 36 addChild(new MurQuad(Quad(w[SE+i], w[SW+i], wi[SW+i], wi[SE+i]), Quad(wh[SE+i], wh[SW+i], wih[SW+i], wih[SE+i]))); 37 } 38 } else { 39 Quad me = c.insetOpp(E,28); 40 Quad ms = c.inset(E,28).inset(W,28).insetOpp(S,28); 41 Quad mw = c.insetOpp(W,28); 42 Quad mn = c.inset(E,28).inset(W,28).insetOpp(N,28); 43 Quad meh = ch.insetOpp(E,28); 44 Quad msh = ch.inset(E,28).inset(W,28).insetOpp(S,28); 45 Quad mwh = ch.insetOpp(W,28); 46 Quad mnh = ch.inset(E,28).inset(W,28).insetOpp(N,28); 47 48 QuadBool d = QuadBool(false,false,false,false); 49 50 if(etage == 0) { 51 if(w[E]) d[E] = true; 52 else if(w[W]) d[W] = true; 53 else if(w[N]) d[N] = true; 54 else if(w[S]) d[S] = true; 55 } 56 57 addChild(new MurQuad(me << 1,meh << 1,w[E]^d[E],false,false,d[E])); 58 addChild(new MurQuad(mw >> 1,mwh >> 1,w[W]^d[W],false,false,d[W])); 59 addChild(new MurQuad(mn,mnh,w[N]^d[N],false,false,d[N])); 60 addChild(new MurQuad(ms >> 2,msh >> 2,w[S]^d[S],false,false,d[S])); 61 } 62 addChild(new PlancherPlafond(c, PlancherPlafond::PLANCHER)); 63 addChild(new PlancherPlafond(ch.offsetNormal(-10), PlancherPlafond::PLAFOND)); 64 } 65 66 void EtageQuad::triangulation() { 67 addGPUFourQuads(c,ch, Couleurs::mur); 68 addGPUQuad(ch.offsetNormal(-30), Couleurs::plafond); 69 addGPUQuad(c, Couleurs::plancher); 70 } 71 72 EtageTri::EtageTri(Triangle _c, Triangle _ch, TriBool _w, int _etage, int _nbEtages) : Chose(), c(_c), ch(_ch), w(_w), etage(_etage), nbEtages(_nbEtages) { 73 addEntropy(c); 74 addEntropy(ch); 75 for (int i = 0; i < 3; i++) 76 addEntropy(w[LEFTSIDE+i] ? 0 : 1); 77 } 78 79 void EtageTri::getBoundingBoxPoints() { 80 addBBPoints(c); 81 addBBPoints(ch); 82 } 83 84 void EtageTri::split() { 85 Triangle small = c.insetLTR(28); 86 Triangle smallh = ch.insetLTR(28); 87 88 TriBool d(false,false,false); 89 90 if(etage == 0) { 91 if(w[LEFTSIDE]) d[LEFTSIDE] = true; 92 else if(w[RIGHTSIDE]) d[RIGHTSIDE] = true; 93 else if(w[BASE]) d[BASE] = true; 94 } 95 96 for (int i = 0; i < 3; i++) { 97 Quad q = Quad(c[TOP+i], small[TOP+i], small[LEFT+i], c[LEFT+i]); 98 Quad qh = Quad(ch[TOP+i], smallh[TOP+i], smallh[LEFT+i], ch[LEFT+i]); 99 addChild(new MurQuad(q, qh, w[LEFTSIDE+i]^d[LEFTSIDE+i],false,false,d[LEFTSIDE+i])); 100 } 101 102 addChild(new PlancherPlafondTri(c, PlancherPlafondTri::PLANCHER)); 103 addChild(new PlancherPlafondTri(ch.offsetNormal(-10), PlancherPlafondTri::PLAFOND)); 104 } 105 106 void EtageTri::triangulation() { 107 addGPUThreeQuads(c,ch, Couleurs::mur); 108 addGPUTriangle(ch.offsetNormal(-30), Couleurs::plafond); 109 addGPUTriangle(c, Couleurs::plancher); 110 }