commit 62b70d8614889f1e2494203e40cbaa963629cb55
parent 1a819fd8c374537f079f457315e29f47efdc9651
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Tue, 17 Jan 2012 10:34:01 +0100
Utilisation de la nouvelle classe Batiment.cpp, nettoyage, correction d'une fuite mémoire (les triangles de chaque objet).
Diffstat:
11 files changed, 104 insertions(+), 45 deletions(-)
diff --git a/lod.cpp b/lod.cpp
@@ -71,7 +71,7 @@ void Lod::doSplit(Chose* c) {
// else {
// // Pour debug : quand on tente de split un objet qui ne peut
// // pas l'être, on vire le dessin de sa splitBox.
- // c->triangles.clear();
+ // c->clearTriangles();
// c->triangulation();
// }
}
diff --git a/rules/architecture/arche.cpp b/rules/architecture/arche.cpp
@@ -17,7 +17,15 @@ bool ArcheQuad::split() {
void ArcheQuad::triangulation() {
Quad che = c.offsetNormal(f(end) * height);
Quad chw = c.offsetNormal(f(start) * height);
- addGPUOcto(c, Quad(che[NE], che[SE], chw[SW], chw[NW]), Couleurs::mur);
+ addGPUQuad(Quad(c[NW], c[NE], che[NE], chw[NW]), Couleurs::mur);
+ addGPUQuad(Quad(c[SE], c[SW], chw[SW], che[SE]), Couleurs::mur);
+ /*
+ // Doivent être dessiné par le bâtiment englobant.
+ if (start == 0)
+ addGPUQuad(Quad(c[SW], c[NW], chw[NW], chw[SW]), Couleurs::mur);
+ if (end == 1)
+ addGPUQuad(Quad(c[NE], c[SE], che[SE], che[NE]), Couleurs::mur);
+ */
}
void ArcheQuad::getBoundingBoxPoints() {
diff --git a/rules/architecture/batiment.cpp b/rules/architecture/batiment.cpp
@@ -1,2 +1,40 @@
#include "all_includes.hh"
+BatimentQuad_::BatimentQuad_(Quad _c) : Chose(), c(_c) {
+ addEntropy(c);
+}
+
+bool BatimentQuad_::split() {
+ //addChild()
+ return true;
+}
+
+void BatimentQuad_::triangulation() {
+ Quad ch = c.offsetNormal(Dimensions::hauteurEtage + Dimensions::hauteurToit);
+ addGPUQuad(ch, Couleurs::toit);
+ for (int i = 0; i < 4; i++)
+ addGPUQuad(Quad(c[NE+i], c[SE+i], ch[SE+i], ch[NE+i]), Couleurs::mur);
+}
+
+void BatimentQuad_::getBoundingBoxPoints() {
+ addBBPoints(c, Dimensions::hauteurEtage + Dimensions::hauteurToit);
+}
+
+BatimentTri_::BatimentTri_(Triangle _c) : Chose(), c(_c) {
+ addEntropy(c);
+}
+
+bool BatimentTri_::split() {
+ return false;
+}
+
+void BatimentTri_::triangulation() {
+ Triangle th = c.offsetNormal(Dimensions::hauteurEtage + Dimensions::hauteurToit);
+ addGPUTriangle(th, Couleurs::toit);
+ for (int i = 0; i < 3; i++)
+ addGPUQuad(Quad(c[LEFT+i], c[TOP+i], th[TOP+i], th[LEFT+i]), Couleurs::mur);
+}
+
+void BatimentTri_::getBoundingBoxPoints() {
+ addBBPoints(c, Dimensions::hauteurEtage + Dimensions::hauteurToit);
+}
diff --git a/rules/architecture/batiment.hh b/rules/architecture/batiment.hh
@@ -1,4 +1,24 @@
+#ifndef _RULES_ARCHITECTURE_BATIMENT_HH_
+#define _RULES_ARCHITECTURE_BATIMENT_HH_
+
#include "all_includes.hh"
-//class Batiment_ : public Chose {
-//};
+class BatimentQuad_ : public Chose {
+ Quad c;
+public:
+ BatimentQuad_(Quad _c);
+ virtual bool split();
+ virtual void triangulation();
+ virtual void getBoundingBoxPoints();
+};
+
+class BatimentTri_ : public Chose {
+ Triangle c;
+public:
+ BatimentTri_(Triangle _c);
+ virtual bool split();
+ virtual void triangulation();
+ virtual void getBoundingBoxPoints();
+};
+
+#endif
diff --git a/rules/architecture/couleursDimensions.hh b/rules/architecture/couleursDimensions.hh
@@ -34,6 +34,10 @@ class Dimensions {
public:
static const unsigned int largeurRoute = 200;
static const unsigned int largeurTrottoir = 140;
+ static const unsigned int hauteurEtage = 300;
+ static const unsigned int hauteurToit = 100;
+ static const unsigned int hauteurTrottoir = 20;
+ static const unsigned int hauteurMaxBatiment = hauteurTrottoir + hauteurEtage + hauteurToit;
};
#endif
diff --git a/rules/architecture/quartier.cpp b/rules/architecture/quartier.cpp
@@ -5,7 +5,7 @@ QuartierQuad::QuartierQuad(Quad _c) : Chose(), c(_c) {
}
void QuartierQuad::getBoundingBoxPoints() {
- addBBPoints(c, 600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
+ addBBPoints(c, Dimensions::hauteurMaxBatiment);
}
bool QuartierQuad::split() {
@@ -39,7 +39,7 @@ void QuartierQuad::triangulation() {
triangulationConcave(Triangle(q[SW], q[NW], q[NE]));
} else {
Quad ci = c.insetNESW(Dimensions::largeurRoute + Dimensions::largeurTrottoir);
- Quad cih = ci.offsetNormal(600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
+ Quad cih = ci.offsetNormal(Dimensions::hauteurMaxBatiment);
addGPUQuad(c, Couleurs::route);
addGPUQuad(cih, Couleurs::toit);
for (int i = 0; i < 4; i++)
@@ -50,7 +50,7 @@ void QuartierQuad::triangulation() {
void QuartierQuad::triangulationConcave(Triangle t) {
// Même code que QuartierTri::triangulation.
Triangle ci = t.insetLTR(Dimensions::largeurRoute + Dimensions::largeurTrottoir);
- Triangle cih = ci.offsetNormal(600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
+ Triangle cih = ci.offsetNormal(Dimensions::hauteurMaxBatiment);
addGPUTriangle(t, Couleurs::route);
addGPUTriangle(cih, Couleurs::toit);
for (int i = 0; i < 3; i++)
@@ -105,22 +105,19 @@ void QuartierQuad::carre() {
}
void QuartierQuad::batiments() {
- float hauteurTrottoir = 20; // TODO : factoriser + ajouter ça à la hauteur max d'un bâtiment dans les autres calculs.
Quad qtrottoir = c.insetNESW(Dimensions::largeurRoute);
Quad qinterieur = qtrottoir.insetNESW(Dimensions::largeurTrottoir);
- Quad qbatiments = qinterieur.offsetNormal(hauteurTrottoir);
+ Quad qbatiments = qinterieur.offsetNormal(Dimensions::hauteurTrottoir);
for (int i = 0; i < 4; i++) {
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));
+ addChild(new TrottoirQuad(Quad(qtrottoir[NE+i],qtrottoir[SE+i],qinterieur[SE+i],qinterieur[NE+i])));
}
- // TODO :
-
bool anglesAcceptable = c.minAngle() > Angle::d2r(90-60) && c.maxAngle() < Angle::d2r(90+60);
if (anglesAcceptable && proba(seed, 0, 19, 20)) {
- addChild(new BatimentQuad(qbatiments));
+ addChild(new BatimentQuad_(qbatiments));
} else {
addChild(new TerrainQuad(qbatiments));
}
@@ -131,7 +128,7 @@ QuartierTri::QuartierTri(Triangle _c) : Chose(), c(_c) {
}
void QuartierTri::getBoundingBoxPoints() {
- addBBPoints(c, 600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
+ addBBPoints(c, Dimensions::hauteurMaxBatiment);
}
bool QuartierTri::split() {
@@ -166,7 +163,7 @@ bool QuartierTri::split() {
void QuartierTri::triangulation() {
Triangle ci = c.insetLTR(Dimensions::largeurRoute + Dimensions::largeurTrottoir);
- Triangle cih = ci.offsetNormal(600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
+ Triangle cih = ci.offsetNormal(Dimensions::hauteurMaxBatiment);
addGPUTriangle(c, Couleurs::route);
addGPUTriangle(cih, Couleurs::toit);
for (int i = 0; i < 3; i++)
@@ -203,19 +200,15 @@ void QuartierTri::trapeze() {
}
void QuartierTri::batiments() {
- return;
- float hauteurTrottoir = 14; // TODO : factoriser + ajouter ça à la hauteur max d'un bâtiment dans les autres calculs.
Triangle ttrottoir = c.insetLTR(Dimensions::largeurRoute);
Triangle tinterieur = ttrottoir.insetLTR(Dimensions::largeurTrottoir);
- Triangle tbatiments = tinterieur.offsetNormal(hauteurTrottoir);
+ Triangle tbatiments = tinterieur.offsetNormal(Dimensions::hauteurTrottoir);
for (int i = 0; i < 3; i++) {
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));
+ addChild(new TrottoirQuad(Quad(ttrottoir[LEFT+i],ttrottoir[TOP+i],tinterieur[TOP+i],tinterieur[LEFT+i])));
}
- // TODO :
-
bool small = tbatiments.minLength() < 3000;
bool big = tbatiments.maxLength() >= 5000;
bool anglesAcceptable = tbatiments.minAngle() > Angle::d2r(30) && tbatiments.maxAngle() < Angle::d2r(120);
@@ -223,7 +216,7 @@ void QuartierTri::batiments() {
if (!big && proba(seed, 0, 1, 20)) {
addChild(new TerrainTri(tbatiments));
} else if (small && anglesAcceptable) {
- addChild(new BatimentTri(tbatiments));
+ addChild(new BatimentTri_(tbatiments));
} else {
addChild(new TerrainTri(tbatiments));
}
diff --git a/rules/architecture/routetrottoir.cpp b/rules/architecture/routetrottoir.cpp
@@ -1,16 +1,15 @@
#include "all_includes.hh"
-TrottoirQuad::TrottoirQuad(Quad _c, float _height) : Chose(), c(_c), height(_height) {
+TrottoirQuad::TrottoirQuad(Quad _c) : Chose(), c(_c) {
addEntropy(c);
- addEntropy(height);
}
void TrottoirQuad::getBoundingBoxPoints() {
- addBBPoints(c, height);
+ addBBPoints(c, Dimensions::hauteurTrottoir);
}
void TrottoirQuad::triangulation() {
- Quad ch = c.offsetNormal(height);
+ Quad ch = c.offsetNormal(Dimensions::hauteurTrottoir);
Quad bordureh = ch.inset(E,15);
addGPUQuad(c[NE], c[SE], ch[SE], ch[NE], Couleurs::bordureTrottoir);
@@ -23,10 +22,7 @@ RouteQuad::RouteQuad(Quad _c) : Chose(), c(_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);
+ addBBPoints(c);
}
void RouteQuad::triangulation() {
diff --git a/rules/architecture/routetrottoir.hh b/rules/architecture/routetrottoir.hh
@@ -6,10 +6,9 @@
class TrottoirQuad : public Chose {
private :
Quad c;
- float height;
public :
- TrottoirQuad(Quad _c, float _height);
+ TrottoirQuad(Quad _c);
virtual void triangulation();
virtual void getBoundingBoxPoints();
};
diff --git a/rules/architecture/terrain.cpp b/rules/architecture/terrain.cpp
@@ -5,10 +5,7 @@ TerrainQuad::TerrainQuad(Quad _c) : Chose(), c(_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);
+ addBBPoints(c);
}
void TerrainQuad::triangulation() {
@@ -20,10 +17,7 @@ TerrainTri::TerrainTri(Triangle _c) : Chose(), c(_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);
+ addBBPoints(c);
}
void TerrainTri::triangulation() {
diff --git a/rules/chose.cpp b/rules/chose.cpp
@@ -3,7 +3,6 @@
Chose::Chose() : seed(initialSeed), children() {
}
-
void Chose::clearChildren() {
std::vector<Chose*>::iterator it;
for (it = children.begin(); it != children.end(); it++)
@@ -11,9 +10,16 @@ void Chose::clearChildren() {
children.clear();
}
+void Chose::clearTriangles() {
+ std::vector<GPUTriangle*>::iterator it;
+ for (it = triangles.begin(); it != triangles.end(); it++)
+ delete *it;
+ triangles.clear();
+}
+
Chose::~Chose() {
clearChildren();
- triangles.clear();
+ clearTriangles();
}
void Chose::addChild(Chose* c) {
@@ -22,7 +28,6 @@ void Chose::addChild(Chose* c) {
bool Chose::merge() {
clearChildren();
- // triangles.clear();
return true;
}
@@ -128,6 +133,7 @@ void Chose::addBBPoints(const Quad q, float height) {
void Chose::updateAABB() {
float splitFactor = 5.f;
float mergeFactor = 6.f;
+ float nonFacingFactor = 2.f/3.f;
lod.firstBBPoint = true;
getBoundingBoxPoints();
float size[3];
@@ -137,7 +143,7 @@ void Chose::updateAABB() {
for (int i = 0; i < 3; i++)
areaFacing[i] = size[(i+1)%3]*size[(i+1)%3];
for (int i = 0; i < 3; i++) {
- float pseudoLength = std::max(1.f, std::sqrt(areaFacing[i] + areaFacing[(i+1)%3] / 2.f + areaFacing[(i+1)%3] / 2.f));
+ float pseudoLength = std::max(1.f, std::sqrt(areaFacing[i] + areaFacing[(i+1)%3] * nonFacingFactor + areaFacing[(i+1)%3] * nonFacingFactor));
float splitIncrement = std::min((float)View::backFrustum, splitFactor * pseudoLength);
float mergeIncrement = std::min(View::backFrustum * mergeFactor/splitFactor, mergeFactor * pseudoLength);
lod.splitBox[2*i] = lod.aabb[2*i] - splitIncrement;
diff --git a/rules/chose.hh b/rules/chose.hh
@@ -18,7 +18,7 @@ public :
void drawAABB(); // DEBUG
virtual bool split() { return false; };
virtual bool merge();
- virtual void triangulation() { triangles.clear(); };
+ virtual void triangulation() { clearTriangles(); };
virtual void updateAABB();
protected :
@@ -72,6 +72,7 @@ protected :
void addGPUOcto(Quad q, Quad qh, unsigned int rgb);
private:
void clearChildren();
+ void clearTriangles();
};
#endif