www

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

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 }