www

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

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:
Mlod.cpp | 2+-
Mrules/architecture/arche.cpp | 10+++++++++-
Mrules/architecture/batiment.cpp | 38++++++++++++++++++++++++++++++++++++++
Mrules/architecture/batiment.hh | 24++++++++++++++++++++++--
Mrules/architecture/couleursDimensions.hh | 4++++
Mrules/architecture/quartier.cpp | 29+++++++++++------------------
Mrules/architecture/routetrottoir.cpp | 12++++--------
Mrules/architecture/routetrottoir.hh | 3+--
Mrules/architecture/terrain.cpp | 10++--------
Mrules/chose.cpp | 14++++++++++----
Mrules/chose.hh | 3++-
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