Ajout de routetrottoir et terrain

This commit is contained in:
Georges Dupéron 2012-01-12 18:12:36 +01:00
parent c543641a52
commit 2b632b3f04
18 changed files with 132 additions and 294 deletions

View File

@ -37,6 +37,8 @@ class Chose;
#include "rules/architecture/arche.hh"
#include "rules/architecture/toit.hh"
#include "rules/architecture/quartier.hh"
#include "rules/architecture/terrain.hh"
#include "rules/architecture/routetrottoir.hh"
#include "rules/batiment/batimentquad.hh"
#include "rules/batiment/batimentquadmaison.hh"
@ -49,12 +51,4 @@ class Chose;
#include "rules/batiment/batimentquadmur.hh"
#include "rules/batiment/batimentquadfenetre.hh"
#include "rules/route/routetrottoirquad.hh"
#include "rules/route/routetrottoirtri.hh"
#include "rules/route/routequadchaussee.hh"
#include "rules/route/trottoirquadnormal.hh"
#include "rules/terrain/terrainquadherbe.hh"
#include "rules/terrain/terraintriherbe.hh"
#endif

View File

@ -5,7 +5,7 @@ QuartierQuad_::QuartierQuad_(Quad _c) : Chose(), c(_c) {
}
void QuartierQuad_::getBoundingBoxPoints() {
addBBPoints(c, 6000); // TODO : factoriser cette longueur (hauteur max des bâtiments).
addBBPoints(c, 600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
}
bool QuartierQuad_::split() {
@ -32,7 +32,7 @@ bool QuartierQuad_::split() {
void QuartierQuad_::triangulation() {
Quad ci = c.insetNESW(250 + 140); // TODO : factoriser cette longueur (largeur route + largeur trottoir).
Quad cih = c.offsetNormal(6000); // TODO : factoriser cette longueur (hauteur max des bâtiments).
Quad cih = c.offsetNormal(600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
addGPUQuad(c, 0x36, 0x36, 0x36); // TODO : factoriser cette couleur (couleur de la route).
addGPUQuad(cih, 0xF1, 0xE0, 0xE0); // TODO : factoriser cette couleur (couleur des toits).
for (int i = 0; i < 4; i++)
@ -91,8 +91,8 @@ void QuartierQuad_::batiments() {
Quad qbatiments = qinterieur.offsetNormal(hauteurTrottoir);
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],qinterieur[SE+i],qinterieur[NE+i]),hauteurTrottoir));
addChild(new RouteQuad(Quad(c[NE+i],c[SE+i],qtrottoir[SE+i],qtrottoir[NE+i])));
addChild(new TrottoirQuad(Quad(qtrottoir[NE+i],qtrottoir[SE+i],qinterieur[SE+i],qinterieur[NE+i]),hauteurTrottoir));
}
// TODO :
@ -102,11 +102,11 @@ void QuartierQuad_::batiments() {
bool anglesAcceptable = c.minAngle() > Angle::d2r(90-60) && c.maxAngle() < Angle::d2r(90+60);
if (!big && proba(seed, 0, 1, 20)) {
addChild(new TerrainQuadHerbe(qbatiments));
addChild(new TerrainQuad(qbatiments));
} else if (small && anglesAcceptable) {
addChild(new BatimentQuad(qbatiments));
} else {
addChild(new TerrainQuadHerbe(qbatiments));
addChild(new TerrainQuad(qbatiments));
}
}
@ -115,7 +115,7 @@ QuartierTri_::QuartierTri_(Triangle _c) : Chose(), c(_c) {
}
void QuartierTri_::getBoundingBoxPoints() {
addBBPoints(c, 6000); // TODO : factoriser cette longueur (hauteur max des bâtiments).
addBBPoints(c, 600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
}
bool QuartierTri_::split() {
@ -150,7 +150,7 @@ bool QuartierTri_::split() {
void QuartierTri_::triangulation() {
Triangle ci = c.insetLTR(250 + 140); // TODO : factoriser cette longueur (largeur route + largeur trottoir).
Triangle cih = c.offsetNormal(6000); // TODO : factoriser cette longueur (hauteur max des bâtiments).
Triangle cih = c.offsetNormal(600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
addGPUTriangle(c, 0x36, 0x36, 0x36); // TODO : factoriser cette couleur (couleur de la route).
addGPUTriangle(cih, 0xF1, 0xE0, 0xE0); // TODO : factoriser cette couleur (couleur des toits).
for (int i = 0; i < 3; i++)
@ -193,8 +193,8 @@ void QuartierTri_::batiments() {
Triangle tbatiments = tinterieur.offsetNormal(hauteurTrottoir);
for (int i = 0; i < 3; i++) {
addChild(new RouteQuadChaussee(Quad(c[LEFT+i],c[TOP+i],ttrottoir[TOP+i],ttrottoir[LEFT+i])));
addChild(new TrottoirQuadNormal(Quad(ttrottoir[LEFT+i],ttrottoir[TOP+i],tinterieur[TOP+i],tinterieur[LEFT+i]),hauteurTrottoir));
addChild(new RouteQuad(Quad(c[LEFT+i],c[TOP+i],ttrottoir[TOP+i],ttrottoir[LEFT+i])));
addChild(new TrottoirQuad(Quad(ttrottoir[LEFT+i],ttrottoir[TOP+i],tinterieur[TOP+i],tinterieur[LEFT+i]),hauteurTrottoir));
}
// TODO :
@ -204,10 +204,10 @@ void QuartierTri_::batiments() {
bool anglesAcceptable = tbatiments.minAngle() > Angle::d2r(30) && tbatiments.maxAngle() < Angle::d2r(120);
if (!big && proba(seed, 0, 1, 20)) {
addChild(new TerrainTriHerbe(tbatiments));
addChild(new TerrainTri(tbatiments));
} else if (small && anglesAcceptable) {
addChild(new BatimentTri(tbatiments));
} else {
addChild(new TerrainTriHerbe(tbatiments));
addChild(new TerrainTri(tbatiments));
}
}

View File

@ -0,0 +1,34 @@
#include "all_includes.hh"
TrottoirQuad::TrottoirQuad(Quad _c, float _height) : Chose(), c(_c), height(_height) {
addEntropy(c);
addEntropy(height);
}
void TrottoirQuad::getBoundingBoxPoints() {
addBBPoints(c, height);
}
void TrottoirQuad::triangulation() {
Quad ch = c.offsetNormal(height);
Quad bordureh = ch.inset(E,15);
addGPUQuad(c[NE], c[SE], ch[SE], ch[NE], 0xAA, 0xAA, 0xAA);
addGPUQuad(ch[NE], ch[SE], bordureh[SE], bordureh[NE], 0xAA, 0xAA, 0xAA);
addGPUQuad(bordureh, 0x66, 0x66, 0x66);
}
RouteQuad::RouteQuad(Quad _c) : Chose(), c(_c) {
addEntropy(c);
}
void RouteQuad::getBoundingBoxPoints() {
// TODO : quelle hauteur mettre pour la route ? Il faut mettre 0 et ajuster le
// calcul des splitBox et mergeBox pour prendre en compre la somme des surfaces
// potentiellement visibles de l'objet.
addBBPoints(c, 1000);
}
void RouteQuad::triangulation() {
addGPUQuad(c, 0x36, 0x36, 0x36);
}

View File

@ -0,0 +1,27 @@
#ifndef _RULES_ARCHITECTURE_ROUTE_HH_
#define _RULES_ARCHITECTURE_ROUTE_HH_
#include "all_includes.hh"
class TrottoirQuad : public Chose {
private :
Quad c;
float height;
public :
TrottoirQuad(Quad _c, float _height);
virtual void triangulation();
virtual void getBoundingBoxPoints();
};
class RouteQuad : public Chose {
private :
Quad c;
public :
RouteQuad(Quad _c);
virtual void triangulation();
virtual void getBoundingBoxPoints();
};
#endif

View File

@ -0,0 +1,31 @@
#include "all_includes.hh"
TerrainQuad::TerrainQuad(Quad _c) : Chose(), c(_c) {
addEntropy(c);
}
void TerrainQuad::getBoundingBoxPoints() {
// TODO : quelle hauteur mettre pour le terrain plat ? Il faut mettre 0 et ajuster le
// calcul des splitBox et mergeBox pour prendre en compre la somme des surfaces
// potentiellement visibles de l'objet.
addBBPoints(c, 1000);
}
void TerrainQuad::triangulation() {
addGPUQuad(c, 0x11, 0xaa, 0x22);
}
TerrainTri::TerrainTri(Triangle _c) : Chose(), c(_c) {
addEntropy(c);
}
void TerrainTri::getBoundingBoxPoints() {
// TODO : quelle hauteur mettre pour le terrain plat ? Il faut mettre 0 et ajuster le
// calcul des splitBox et mergeBox pour prendre en compre la somme des surfaces
// potentiellement visibles de l'objet.
addBBPoints(c, 1000);
}
void TerrainTri::triangulation() {
addGPUTriangle(c, 0x11, 0xaa, 0x22);
}

View File

@ -0,0 +1,26 @@
#ifndef _RULES_ARCHITECTURE_TERRAIN_HH_
#define _RULES_ARCHITECTURE_TERRAIN_HH_
#include "all_includes.hh"
class TerrainTri : public Chose {
private :
Triangle c;
public :
TerrainTri(Triangle _c);
virtual void triangulation();
virtual void getBoundingBoxPoints();
};
class TerrainQuad : public Chose {
private :
Quad c;
public :
TerrainQuad(Quad _c);
virtual void triangulation();
virtual void getBoundingBoxPoints();
};
#endif

View File

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

View File

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

View File

@ -1,49 +0,0 @@
#include "all_includes.hh"
RouteTrottoirQuad::RouteTrottoirQuad(Quad _c) : Chose(), c(_c) {
addEntropy(c);
}
bool RouteTrottoirQuad::split() {
float th = 20; // Terrain height.
Quad qtrottoir = c.insetNESW(250);
Quad qinterieur = qtrottoir.insetNESW(140);
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],qinterieur[SE+i],qinterieur[NE+i]),th));
}
addChild(factory(seed, 0, qinterieur + Vertex(0,0,th)));
return true;
}
Chose* RouteTrottoirQuad::factory(int seed, int n, Quad c) {
bool small = c.minLength() < 2500;
bool big = c.maxLength() >= 5000;
bool anglesAcceptable = c.minAngle() > Angle::d2r(90-60) && c.maxAngle() < Angle::d2r(90+60);
//bool anglesOk = c.minAngle() > Angle::d2r(90-40) && c.maxAngle() < Angle::d2r(90+40);
//bool tooWideX = c.minLengthEW() * 2 < c.maxLengthNS(); // trop allongé (côté E ou W deux fois plus petit que le côté N ou S).
//bool tooWideY = c.minLengthNS() * 2 < c.maxLengthEW(); // trop allongé (côté N ou S deux fois plus petit que le côté E ou W).
if (!big && proba(seed, n, 1, 20)) {
return new TerrainQuadHerbe(c);
} else if (small && anglesAcceptable) {
return new BatimentQuad(c);
} else {
return new TerrainQuadHerbe(c);
}
}
void RouteTrottoirQuad::triangulation() {
float h = floatInRange(seed,1,minHeight,maxHeight);
float htoit = floatInRange(seed,2,minHeight/2,maxHeight/2);
addGPUOcto(c, c + Vertex(0,0,h + htoit), 0xFF, 0xFF, 0xFF);
}
void RouteTrottoirQuad::getBoundingBoxPoints() {
addBBPoints(c);
addBBPoints(c + Vertex(0,0,maxHeight + maxHeight/2)); // TODO
}

View File

@ -1,21 +0,0 @@
#ifndef _RULES_ROUTE_ROUTETROTTOIRQUAD_HH_
#define _RULES_ROUTE_ROUTETROTTOIRQUAD_HH_
#include "all_includes.hh"
class RouteTrottoirQuad : public Chose {
private :
Quad c;
public :
static const int minHeight = 400;
static const int maxHeight = 800;
public :
RouteTrottoirQuad(Quad _c);
virtual bool split();
virtual void triangulation();
virtual void getBoundingBoxPoints();
static Chose* factory(int seed, int n, Quad c); // TODO : est-ce une factory ou non, où la met-on…
};
#endif

View File

@ -1,53 +0,0 @@
#include "all_includes.hh"
RouteTrottoirTri::RouteTrottoirTri(Triangle _c) : Chose(), c(_c) {
addEntropy(c);
}
bool RouteTrottoirTri::split() {
float th = 20; // Terrain height.
Triangle ttrottoir = c.insetLTR(250);
Triangle tinterieur = ttrottoir.insetLTR(140);
for (int i = 0; i < 3; i++) {
addChild(new RouteQuadChaussee(Quad(c[LEFT+i],c[TOP+i],ttrottoir[TOP+i],ttrottoir[LEFT+i])));
addChild(new TrottoirQuadNormal(Quad(ttrottoir[LEFT+i],ttrottoir[TOP+i],tinterieur[TOP+i],tinterieur[LEFT+i]),th));
}
addChild(factory(seed, 0, tinterieur + Vertex(0,0,th)));
return true;
}
Chose* RouteTrottoirTri::factory(int seed, int n, Triangle c) {
bool small = c.minLength() < 2500;
bool big = c.maxLength() >= 5000;
//bool anglesAcceptable = c.minAngle() > Angle::d2r(90-60) && c.maxAngle() < Angle::d2r(90+60);
//bool anglesOk = c.minAngle() > Angle::d2r(90-40) && c.maxAngle() < Angle::d2r(90+40);
//bool tooWideX = c.minLengthEW() * 2 < c.maxLengthNS(); // trop allongé (côté E ou W deux fois plus petit que le côté N ou S).
//bool tooWideY = c.minLengthNS() * 2 < c.maxLengthEW(); // trop allongé (côté N ou S deux fois plus petit que le côté E ou W).
if (!big && proba(seed, n, 1, 20)) {
return new TerrainTriHerbe(c);
} else if (small && !big) {
return new BatimentTri(c);
} else {
return new TerrainTriHerbe(c);
}
}
void RouteTrottoirTri::triangulation() {
float h = floatInRange(seed,1,minHeight,maxHeight);
float htoit = floatInRange(seed,2,minHeight/2,maxHeight/2);
Triangle ch = c + Vertex(0,0,h + htoit);
addGPUTriangle(c, 0xFF, 0xFF, 0x00);
addGPUTriangle(ch, 0xFF, 0xFF, 0x00);
for (int i = 0; i < 3; i++)
addGPUQuad(c[LEFT+i], c[TOP+i], ch[TOP+i], ch[LEFT+i], 0xFF, 0xFF, 0x00);
}
void RouteTrottoirTri::getBoundingBoxPoints() {
addBBPoints(c);
addBBPoints(c + Vertex(0,0,maxHeight + maxHeight/2)); // TODO
}

View File

@ -1,21 +0,0 @@
#ifndef _RULES_ROUTE_ROUTETROTTOIRTRI_HH_
#define _RULES_ROUTE_ROUTETROTTOIRTRI_HH_
#include "all_includes.hh"
class RouteTrottoirTri : public Chose {
private :
Triangle c;
public :
static const int minHeight = 400;
static const int maxHeight = 800;
public :
RouteTrottoirTri(Triangle _c);
virtual bool split();
virtual void triangulation();
virtual void getBoundingBoxPoints();
static Chose* factory(int seed, int n, Triangle c); // TODO : est-ce une factory ou non, où la met-on…
};
#endif

View File

@ -1,18 +0,0 @@
#include "all_includes.hh"
TrottoirQuadNormal::TrottoirQuadNormal(Quad _c, float _height) : Chose(), c(_c), height(_height) {
}
void TrottoirQuadNormal::getBoundingBoxPoints() {
addBBPoints(c);
addBBPoints(c + Vertex(0,0,height));
}
void TrottoirQuadNormal::triangulation() {
Quad ch = c + Vertex(0,0,height);
Quad bordureh = ch.inset(E,15);
addGPUQuad(c[NE], c[SE], ch[SE], ch[NE], 0xAA, 0xAA, 0xAA);
addGPUQuad(ch[NE], ch[SE], bordureh[SE], bordureh[NE], 0xAA, 0xAA, 0xAA);
addGPUQuad(bordureh, 0x66, 0x66, 0x66);
}

View File

@ -1,17 +0,0 @@
#ifndef _RULES_ROUTE_TROTTOIRQUADNORMAL_HH_
#define _RULES_ROUTE_TROTTOIRQUADNORMAL_HH_
#include "all_includes.hh"
class TrottoirQuadNormal : public Chose {
private :
Quad c;
float height;
public :
TrottoirQuadNormal(Quad _c, float _height);
virtual void triangulation();
virtual void getBoundingBoxPoints();
};
#endif

View File

@ -1,15 +0,0 @@
#include "all_includes.hh"
TerrainQuadHerbe::TerrainQuadHerbe(Quad _c) : Chose(), c(_c) {
addEntropy(c);
}
void TerrainQuadHerbe::getBoundingBoxPoints() {
addBBPoints(c);
addBBPoints(c + Vertex(0,0,1000)); // TODO
}
void TerrainQuadHerbe::triangulation() {
triangles.reserve(2);
addGPUQuad(c, 0x11, 0xaa, 0x22);
}

View File

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

View File

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

View File

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