Création des routes dans les bâtiments au lieu des quartiers (il manque quelques modifs encore).

This commit is contained in:
Georges Dupéron 2012-01-10 11:42:20 +01:00
parent 8239cd8fbe
commit cee7e3a79d
14 changed files with 33 additions and 153 deletions

View File

@ -1,8 +1,7 @@
#include "all_includes.hh"
BatimentQuad::BatimentQuad(Quad _c, Cardinal _entry) : Chose(), c(_c), entry(_entry) {
BatimentQuad::BatimentQuad(Quad _c) : Chose(), c(_c) {
addEntropy(c);
addEntropy(entry);
}
void BatimentQuad::getBoundingBoxPoints() {
@ -12,23 +11,21 @@ void BatimentQuad::getBoundingBoxPoints() {
bool BatimentQuad::split() {
if(proba(seed, 0, 1, 10)) {
Quad q = Quad(c[NE],c[SE],c[SW],c[NW]);
// TODO ajouter une classe surface.
//addQuad(c[SE],c[SW],c[NW],c[NE],0xDD,0xDD,0xDD);
addChild(new BatimentQuadMaisonPont(q,800));
addChild(new BatimentQuadMaisonPont(c,800));
} else {
float th = 20; // Terrain height.
Quad q = Quad(c[NE],c[SE],c[SW],c[NW]).insetNESW(140);
Quad qtrottoir = c.insetNESW(250);
Quad qmaison = qtrottoir.insetNESW(140);
addChild(new TrottoirQuadNormal(Quad(c[NE],c[SE],q[SE],q[NE]),th));
addChild(new TrottoirQuadNormal(Quad(c[SE],c[SW],q[SW],q[SE]),th));
addChild(new TrottoirQuadNormal(Quad(c[SW],c[NW],q[NW],q[SW]),th));
addChild(new TrottoirQuadNormal(Quad(c[NW],c[NE],q[NE],q[NW]),th));
for (int i = 0; i <4; i++) {
addChild(new RouteQuadChaussee(Quad(c[NE+i],c[SE+i],qtrottoir[SE+i],qtrottoir[NE+i])));
addChild(new TrottoirQuadNormal(Quad(qtrottoir[NE+i],qtrottoir[SE+i],qmaison[SE+i],qmaison[NE+i]),th));
}
Quad qh = q + Vertex(0,0,th);
addChild(new BatimentQuadJardin(qh));
Quad qhmaison = qmaison + Vertex(0,0,th);
addChild(new BatimentQuadJardin(qhmaison));
addChild(new BatimentQuadMaison(qh.inset(this->entry,400)));
addChild(new BatimentQuadMaison(qhmaison.inset(N,400)));
}
return true;
}

View File

@ -7,13 +7,12 @@
class BatimentQuad : public Chose {
private :
Quad c;
Cardinal entry;
public :
static const int minHeight = 400;
static const int maxHeight = 800;
BatimentQuad(Quad c, Cardinal entry);
BatimentQuad(Quad c);
virtual bool split();
virtual void triangulation();
virtual void getBoundingBoxPoints();

View File

@ -19,7 +19,7 @@ Chose* QuartierQuad::factory(int seed, int n, Quad c) {
if (!big && proba(seed, n, 1, 20)) {
return new TerrainQuadHerbe(c);
} else if (small && anglesAcceptable) {
return new BatimentQuad(c, N);
return new BatimentQuad(c);
} else if (!small && !anglesOk) {
return new QuartierQuadAngle(c);
} else if (!small && tooWideY) {

View File

@ -6,14 +6,8 @@ QuartierQuadAngle::QuartierQuadAngle(Quad _c) : QuartierQuad(_c) {
bool QuartierQuadAngle::split() {
for (int i = 0; i < 4; i++) {
if (Triangle(c[NW+i], c[NE+i], c[SE+i]).angle() >= Angle::d2r(130)) {
// TODO : maintenant que Triangle::offset prend un paramètre side, on peut simplifier ce bazaar.
Triangle t1 = Triangle(c[NE+i], c[SE+i], c[SW+i]).inset(BASE, hrw);
Triangle t2 = Triangle(c[SW+i], c[NW+i], c[NE+i]).inset(BASE, hrw);
addChild(QuartierTri::factory(seed, 0, t1));
addChild(QuartierTri::factory(seed, 1, t2));
addChild(new RouteQuadChaussee(Quad(t1[LEFT], t1[RIGHT], t2[LEFT], t2[RIGHT])));
addChild(new RouteTriChaussee(Triangle(t2[RIGHT], c[NE+i], t1[LEFT])));
addChild(new RouteTriChaussee(Triangle(t1[RIGHT], c[SW+i], t2[LEFT])));
addChild(QuartierTri::factory(seed, 0, Triangle(c[NE+i], c[SE+i], c[SW+i])));
addChild(QuartierTri::factory(seed, 1, Triangle(c[SW+i], c[NW+i], c[NE+i])));
return true;
}
}
@ -25,28 +19,17 @@ bool QuartierQuadAngle::split() {
Vertex e = Segment(c[NE+i], c[SE+i]).randomPos(seed, 1, 0.4f, 0.6f);
Triangle tn = Triangle(n, c[NE+i], c[SE+i]);
Triangle te = Triangle(c[NW+i], c[NE+i], e);
Quad q;
if (tn.minAngle() > te.minAngle()) {
q = Quad(n, c[SE+i], c[SW+i], c[NW+i]).inset(E, hrw);
Vertex oldtnright = tn[RIGHT];
tn = tn.inset(BASE, hrw);
addChild(QuartierTri::factory(seed, 0, tn));
addChild(QuartierQuad::factory(seed, 1, q));
addChild(new RouteQuadChaussee(Quad(tn[LEFT], tn[RIGHT], q[SE], q[NE])));
addChild(new RouteTriChaussee(Triangle(tn[RIGHT], oldtnright, q[SE])));
addChild(QuartierQuad::factory(seed, 1, Quad(n, c[SE+i], c[SW+i], c[NW+i])));
} else {
q = Quad(c[NW+i], e, c[SE+i], c[SW+i]).inset(E, hrw);
Vertex oldteleft = te[LEFT];
te = te.inset(BASE, hrw);
addChild(QuartierTri::factory(seed, 0, te));
addChild(QuartierQuad::factory(seed, 1, q));
addChild(new RouteQuadChaussee(Quad(te[LEFT], te[RIGHT], q[SE], q[NE])));
addChild(new RouteTriChaussee(Triangle(q[NE], oldteleft, te[LEFT])));
addChild(QuartierQuad::factory(seed, 1, Quad(c[NW+i], e, c[SE+i], c[SW+i])));
}
return true;
}
}
// Ne devait jamais arriver ici !
addChild(new TerrainQuadHerbe(c));
addChild(new BatimentQuad(c));
return true;
}

View File

@ -5,9 +5,6 @@
// QuadAngle est un quadrilatère avec des angles malfichus (< 90-40 ou > 90+40).
class QuartierQuadAngle : public QuartierQuad {
private :
static const int hrw = 150; // half road width : 1,50m.
public :
QuartierQuadAngle(Quad c);
virtual bool split();

View File

@ -5,23 +5,16 @@ QuartierQuadCarre::QuartierQuadCarre(Quad _c) : QuartierQuad(_c) {
bool QuartierQuadCarre::split() {
Vertex middle[4];
Quad q[4];
Vertex centerN = Segment(c[NW], c[NE]).randomPos(seed, -1, 0.25, 0.75);
Vertex centerS = Segment(c[SE], c[SW]).randomPos(seed, -2, 0.25, 0.75);
Vertex center = Segment(centerN, centerS).randomPos(seed, -3, 0.25, 0.75);
for (int i = 0; i < 4; i++) {
for (int i = 0; i < 4; i++)
middle[N+i] = Segment(c[NW+i], c[NE+i]).randomPos(seed, i, 0.25, 0.75);
}
for (int i = 0; i < 4; i++) {
q[i] = Quad(c[NE+i], middle[E+i], center, middle[N+i]);
q[i] = q[i].inset(W,hrw).inset(S,hrw);
}
addChild(new RouteQuadCarrefour(Quad(q[0][SW], q[1][SW], q[2][SW], q[3][SW])));
for (int i = 0; i < 4; i++) {
addChild(new RouteQuadChaussee(Quad(q[NE+i][NW], q[NE+i][SW], q[NW+i][SW], q[NW+i][SE])));
addChild(QuartierQuad::factory(seed, 4+i, q[i]));
}
for (int i = 0; i < 4; i++)
addChild(QuartierQuad::factory(seed, 4+i, Quad(c[NE+i], middle[E+i], center, middle[N+i])));
return true;
}

View File

@ -7,11 +7,7 @@ bool QuartierQuadRect::split() {
Vertex n = Segment(c[NW], c[NE]).randomPos(seed, 0, 1/3.f, 2/3.f);
Vertex s = Segment(c[SE], c[SW]).randomPos(seed, 1, 1/3.f, 2/3.f);
Quad qe = Quad(c[NE], c[SE], s, n).inset(W,hrw);
Quad qw = Quad(c[SW], c[NW], n, s).inset(W,hrw);
addChild(new RouteQuadChaussee(Quad(qe[NW], qe[SW], qw[NW], qw[SW])));
addChild(QuartierQuad::factory(seed, 2, qe));
addChild(QuartierQuad::factory(seed, 3, qw));
addChild(QuartierQuad::factory(seed, 2, Quad(c[NE], c[SE], s, n)));
addChild(QuartierQuad::factory(seed, 3, Quad(c[SW], c[NW], n, s)));
return true;
}

View File

@ -10,16 +10,9 @@ bool QuartierTriCentre::split() {
for (int i = 0; i < 3; i++)
edgePoint[LEFTSIDE+i] = Segment(c[LEFT+i], c[TOP+i]).randomPos(seed, i+1, 1/3.f, 2/3.f);
Quad q[3];
for (int i = 0; i < 3; i++) {
q[i] = Quad(c[TOP+i], edgePoint[RIGHTSIDE+i], center, edgePoint[LEFTSIDE+i]);
q[i] = q[i].inset(S, hrw).inset(W, hrw);
Quad q = Quad(c[TOP+i], edgePoint[RIGHTSIDE+i], center, edgePoint[LEFTSIDE+i]);
addChild(QuartierQuad::factory(seed, i+4, q));
}
for (int i = 0; i < 3; i++) {
addChild(QuartierQuad::factory(seed, i+4, q[i]));
addChild(new RouteQuadChaussee(Quad(q[(i+1)%3][NW], q[(i+1)%3][SW], q[i][SW], q[i][SE])));
}
addChild(new RouteTriChaussee(Triangle(q[0][SW], q[1][SW], q[2][SW])));
return true;
}

View File

@ -4,22 +4,10 @@ QuartierTriHauteur::QuartierTriHauteur(Triangle _c) : QuartierTri(_c) {
}
bool QuartierTriHauteur::split() {
// TODO : sélectionner le sommet avec l'angle le plus grand.
// Triangle::cutCornerSideResult r = c.cutCornerSide(TOP, random(seed,0,0.33, 0.67);
// addChild(new RouteQuadChaussee(r.cut));
// addChild(new RouteTriChaussee(r.cutFrom));
// addChild(QuartierTri::factory(seed, 1, r.left);
// addChild(QuartierTri::factory(seed, 1, r.right);
// TODO : sélectionner le sommet TOP avec l'angle le plus grand.
Vertex baseCenter = Segment(c[LEFT], c[RIGHT]).randomPos(seed, 0, 1/3.f, 2/3.f);
Triangle tl(c[TOP], baseCenter, c[LEFT]);
Triangle tr(c[RIGHT], baseCenter, c[TOP]);
tl = tl.inset(LEFTSIDE, hrw);
tr = tr.inset(RIGHTSIDE, hrw);
addChild(new RouteQuadChaussee(Quad(tr[RIGHT], tr[TOP], tl[TOP], tl[LEFT])));
addChild(new RouteTriChaussee(Triangle(tl[LEFT], c[TOP], tr[RIGHT])));
addChild(QuartierTri::factory(seed, 1, tl));
addChild(QuartierTri::factory(seed, 2, tr));
addChild(QuartierTri::factory(seed, 1, Triangle(c[TOP], baseCenter, c[LEFT])));
addChild(QuartierTri::factory(seed, 2, Triangle(c[RIGHT], baseCenter, c[TOP])));
return true;
}

View File

@ -4,17 +4,11 @@ QuartierTriTrapeze::QuartierTriTrapeze(Triangle _c) : QuartierTri(_c) {
}
bool QuartierTriTrapeze::split() {
// TODO : sélectionner le sommet avec l'angle le plus petit.
// TODO : sélectionner le sommet TOP avec l'angle le plus petit.
Vertex left = Segment(c[LEFT], c[TOP]).randomPos(seed, 0, 1/3.f, 2/3.f);
Vertex right = Segment(c[RIGHT], c[TOP]).randomPos(seed, 0, 1/3.f, 2/3.f);
Triangle ttop(left, c[TOP], right);
Quad trapeze(right, c[RIGHT], c[LEFT], left);
ttop = ttop.inset(BASE, hrw);
trapeze = trapeze.inset(N, hrw);
addChild(new RouteQuadChaussee(Quad(ttop[RIGHT], trapeze[NE], trapeze[NW], ttop[LEFT])));
addChild(QuartierTri::factory(seed, 1, ttop));
addChild(QuartierQuad::factory(seed, 2, trapeze));
addChild(QuartierTri::factory(seed, 1, Triangle(left, c[TOP], right)));
addChild(QuartierQuad::factory(seed, 2, Quad(right, c[RIGHT], c[LEFT], left)));
return true;
}

View File

@ -1,14 +0,0 @@
#include "all_includes.hh"
RouteQuadCarrefour::RouteQuadCarrefour(Quad _c) : Chose(), c(_c) {
addEntropy(c);
}
void RouteQuadCarrefour::getBoundingBoxPoints() {
addBBPoints(c);
addBBPoints(c + Vertex(0,0,1000)); // TODO
}
void RouteQuadCarrefour::triangulation() {
addGPUQuad(c, 0x36, 0x36, 0x36);
}

View File

@ -1,16 +0,0 @@
#ifndef _RULES_ROUTE_ROUTEQUADCARREFOUR_HH_
#define _RULES_ROUTE_ROUTEQUADCARREFOUR_HH_
#include "all_includes.hh"
class RouteQuadCarrefour : public Chose {
private :
Quad c;
public :
RouteQuadCarrefour(Quad c);
virtual void triangulation();
virtual void getBoundingBoxPoints();
};
#endif

View File

@ -1,14 +0,0 @@
#include "all_includes.hh"
RouteTriChaussee::RouteTriChaussee(Triangle _c) : Chose(), c(_c) {
addEntropy(c);
}
void RouteTriChaussee::getBoundingBoxPoints() {
addBBPoints(c);
addBBPoints(c + Vertex(0,0,1000)); // TODO
}
void RouteTriChaussee::triangulation() {
addGPUTriangle(c, 0x36, 0x36, 0x36);
}

View File

@ -1,16 +0,0 @@
#ifndef _RULES_ROUTE_ROUTETRICHAUSSEE_HH_
#define _RULES_ROUTE_ROUTETRICHAUSSEE_HH_
#include "all_includes.hh"
class RouteTriChaussee : public Chose {
private :
Triangle c;
public :
RouteTriChaussee(Triangle c);
virtual void triangulation();
virtual void getBoundingBoxPoints();
};
#endif