Préparation pour le stockage des enfants et triangles de chaque noeud.

This commit is contained in:
Georges Dupéron 2011-11-24 14:46:11 +01:00
parent 699e0fa520
commit dfbdee7b7d
5 changed files with 34 additions and 22 deletions

View File

@ -3,6 +3,7 @@
#include <iostream>
#include <math.h>
#include <vector>
#include "vertex.hh"
#include "segment.hh"

View File

@ -27,16 +27,16 @@ void Batiment::triangulation() {
Vertex toit = (ah + bh + ch + dh) / 4 + Vertex(0,0,h/5);
// 4 Murs
new Triangle(a,bh,ah); new Triangle(a,b,bh); // a-b-bh-ah
new Triangle(b,dh,bh); new Triangle(b,d,dh); // b-d-dh-bh
new Triangle(d,ch,dh); new Triangle(d,c,ch); // d-c-ch-dh
new Triangle(c,ah,ch); new Triangle(c,a,ah); // c-a-ah-ch
addTriangle(new Triangle(a,bh,ah)); addTriangle(new Triangle(a,b,bh)); // a-b-bh-ah
addTriangle(new Triangle(b,dh,bh)); addTriangle(new Triangle(b,d,dh)); // b-d-dh-bh
addTriangle(new Triangle(d,ch,dh)); addTriangle(new Triangle(d,c,ch)); // d-c-ch-dh
addTriangle(new Triangle(c,ah,ch)); addTriangle(new Triangle(c,a,ah)); // c-a-ah-ch
// 1 Toit
new Triangle(ah,toit,bh);
new Triangle(bh,toit,dh);
new Triangle(dh,toit,ch);
new Triangle(ch,toit,ah);
addTriangle(new Triangle(ah,toit,bh));
addTriangle(new Triangle(bh,toit,dh));
addTriangle(new Triangle(dh,toit,ch));
addTriangle(new Triangle(ch,toit,ah));
}
std::ostream& operator<<(std::ostream& os, const Batiment* r) {

View File

@ -10,3 +10,13 @@ std::ostream& operator<<(std::ostream& os, const Chose& r) {
(void)r; // unused
return os << "Chose";
}
void Chose::addChild(Chose* c) {
children.insert(children.end(), c);
// TODO : Ajouter c dans une file d'attente des éléments pouvant être split.
}
void Chose::addTriangle(Triangle* t) {
triangles.insert(triangles.end(), t);
// TODO : Ajouter t dans la liste des triangles à envoyer au GPU.
}

View File

@ -8,6 +8,8 @@ class Chose {
public:
static const unsigned int initialSeed = 42;
unsigned int seed;
std::vector<Chose*> children;
std::vector<Triangle*> triangles;
public:
Chose();
inline void addEntropy(unsigned int x1) { seed = hash2(seed, x1); }
@ -18,6 +20,8 @@ public:
inline void addEntropy(Vertex v1, Vertex v2) { addEntropy(v1); addEntropy(v2); }
inline void addEntropy(Vertex v1, Vertex v2, Vertex v3) { addEntropy(v1, v2); addEntropy(v3); }
inline void addEntropy(Vertex v1, Vertex v2, Vertex v3, Vertex v4) { addEntropy(v1, v2); addEntropy(v3, v4); }
void addChild(Chose* c);
void addTriangle(Triangle* t);
virtual void subdivide() = 0;
virtual void triangulation() = 0;
};

View File

@ -16,27 +16,24 @@ void RectangleRoutes::subdivide() {
hashInRange(this->seed, 1, this->sw.y + this->height()*1/4, this->sw.y + this->height()*3/4),
0 // TODO
);
Carrefour c(split + Vertex(1,1,0), split + Vertex(1,-1,0), split + Vertex(-1,-1,0), split + Vertex(-1,1,0));
// TODO : addChild(…);
new Carrefour(split + Vertex(1,1,0), split + Vertex(1,-1,0), split + Vertex(-1,-1,0), split + Vertex(-1,1,0));
// routes au NESW du carrefour
// TODO : la plupart des zéros en z sont faux…
Vertex roadEndN(this->ne.y, split.x, 0);
Vertex roadEndE(this->ne.x, split.y, 0);
Vertex roadEndS(this->sw.y, split.x, 0);
Vertex roadEndW(this->sw.x, split.y, 0);
Route rn(roadEndN + Vertex(-1,0,0), roadEndN + Vertex(+1,0,0), split + Vertex(+1,+1,0), split + Vertex(-1,+1,0));
Route re(roadEndE + Vertex(0,+1,0), roadEndE + Vertex(0,-1,0), split + Vertex(+1,-1,0), split + Vertex(+1,+1,0));
Route rs(roadEndS + Vertex(+1,0,0), roadEndS + Vertex(-1,0,0), split + Vertex(-1,-1,0), split + Vertex(+1,-1,0));
Route rw(roadEndW + Vertex(0,-1,0), roadEndW + Vertex(0,+1,0), split + Vertex(-1,+1,0), split + Vertex(-1,-1,0));
// TODO : addChild(…);
Route* rn = new Route(roadEndN + Vertex(-1,0,0), roadEndN + Vertex(+1,0,0), split + Vertex(+1,+1,0), split + Vertex(-1,+1,0)); // N
Route* re = new Route(roadEndE + Vertex(0,+1,0), roadEndE + Vertex(0,-1,0), split + Vertex(+1,-1,0), split + Vertex(+1,+1,0)); // E
Route* rs = new Route(roadEndS + Vertex(+1,0,0), roadEndS + Vertex(-1,0,0), split + Vertex(-1,-1,0), split + Vertex(+1,-1,0)); // S
Route* rw = new Route(roadEndW + Vertex(0,-1,0), roadEndW + Vertex(0,+1,0), split + Vertex(-1,+1,0), split + Vertex(-1,-1,0)); // W
// Sous-quartiers
Chose* rrne = sub(this->ne, re.corners[NW]);
Chose* rrse = sub(re.corners[SE], rs.corners[SE]);
Chose* rrsw = sub(rs.corners[NW], this->sw);
Chose* rrnw = sub(Vertex(this->sw.x, this->ne.y, 0), rn.corners[SW]);
// TODO : stocker ces objets quelque part.
(void)rrne;
(void)rrse;
(void)rrsw;
(void)rrnw;
addChild(sub(rn->corners[NE], re->corners[NE])); // sous-quartier NE
addChild(sub(re->corners[SE], rs->corners[SE])); // sous-quartier SE
addChild(sub(rs->corners[SW], rw->corners[SW])); // sous-quartier SW
addChild(sub(rw->corners[NW], rn->corners[NW])); // sous-quartier NW
}
void RectangleRoutes::triangulation() {