www

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

commit a9c29c7fc77d9e538495bd49f252d7c1135af447
parent f6167e172da9c68e4d87c5fa665ed58f756cf297
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Wed, 18 Jan 2012 11:57:27 +0100

Nettoyage des subdivisions de bâtiments.

Diffstat:
Mrules/architecture/batiment.cpp | 100++-----------------------------------------------------------------------------
Mrules/architecture/batiment.hh | 136-------------------------------------------------------------------------------
2 files changed, 2 insertions(+), 234 deletions(-)

diff --git a/rules/architecture/batiment.cpp b/rules/architecture/batiment.cpp @@ -1,108 +1,12 @@ #include "all_includes.hh" -Mur::Mur(Segment _s) : s(_s) {} - -void Mur::addSplitPoint(float position) { - (void)position; -} - -bool Mur::addDoor(float start, float end) { - (void)start; (void)end; - return true; -} - -bool Mur::addWindow(float start, float end) { - (void)start; (void)end; - return true; -} - -Piece::Piece(Quad _c, Mur* n, Mur* e, Mur* s, Mur* w) : c(_c) { - murs[0] = n; - murs[1] = e; - murs[2] = s; - murs[3] = w; -} - BatimentQuad_::BatimentQuad_(Quad _c) : Chose(), c(_c) { addEntropy(c); } bool BatimentQuad_::split() { - unsigned int trynumber = 0; - unsigned int tryseed = hash2(seed, trynumber); - std::queue<Piece*> queue; - for (int i = 0; i < 4; i++) - murs.push_back(new Mur(Segment(c[NE+i], c[SE+i]))); - queue.push(new Piece(c, murs[0], murs[1], murs[2], murs[3])); - - // TODO : placer la porte d'entrée ? - - Piece* piece; - while (!queue.empty()) { - piece = queue.front(); queue.pop(); - pieces.push_back(piece); - if (piece->c.surface() < 14 * 100 * 100) - continue; - switch (hash2(tryseed, 0) % 2) { - case 0: { // rectangle - if (piece->c.surface() > 100 * 100 * 100 && piece->c.minLength() > 10) { - float size = piece->c.minLength() / 3.f; - Quad takeN = piece->c.inset(N, size); - Quad takeS = takeN.inset(S, size); - Quad takeE = takeS.inset(E, size); - Quad takeW = takeS.inset(W, size); - Quad q[4]; - q[N] = Quad(piece->c[NE], takeN[NE], takeN[NW], piece->c[NW]); - q[E] = Quad(takeS[SE], takeE[SE], takeE[NE], takeS[NE]); - q[S] = Quad(piece->c[SW], takeS[SW], takeS[SE], piece->c[SW]); - q[W] = Quad(takeS[NW], takeW[NW], takeW[SW], takeS[SW]); - Quad qC = takeW; - Mur* m[4]; - m[N] = new Mur(Segment(q[N][SW], q[N][SE])); - m[E] = new Mur(Segment(q[E][SW], q[E][SE])); - m[S] = new Mur(Segment(q[S][SW], q[S][SE])); - m[W] = new Mur(Segment(q[W][SW], q[W][SE])); - Piece* p[4]; - p[N] = new Piece(q[N], piece->murs[N], piece->murs[E], m[N], piece->murs[W]); - p[E] = new Piece(q[E], piece->murs[E], m[S], m[E], m[N]); - p[S] = new Piece(q[S], piece->murs[S], piece->murs[W], m[S], piece->murs[E]); - p[W] = new Piece(q[W], piece->murs[W], m[N], m[W], m[S]); - Piece* pC = new Piece(qC, m[N], m[E], m[S], m[W]); - for (int i = 0; i < 4; i++) { - murs.push_back(m[N+i]); - queue.push(p[N+i]); - } - queue.push(pC); - // TODO connecter les pièces avec des addDoor (sur les murs les séparant, et/ou à la pièce centrale) ??? - break; - } - } - case 1: // donut - default: { - Cardinal offset = piece->c.maxLengthSide(); - Vertex n = Segment(piece->c[NW + offset], piece->c[NE + offset]).randomPos(tryseed, 1, 1.f/3.f, 2.f/3.f); - Vertex s = Segment(piece->c[SE + offset], piece->c[SW + offset]).randomPos(tryseed, 1, 1.f/3.f, 2.f/3.f); - piece->murs[offset]->addSplitPoint(0); // TODO - piece->murs[offset+2]->addSplitPoint(0); // TODO - Mur* mur = new Mur(Segment(n, s)); - Piece* p1 = new Piece(Quad(n, piece->c[NE+offset], piece->c[SE+offset], s), piece->murs[offset], piece->murs[offset+1], piece->murs[offset+2], mur); - Piece* p2 = new Piece(Quad(s, piece->c[SW+offset], piece->c[NW+offset], n), piece->murs[offset+2], piece->murs[offset+3], piece->murs[offset], mur); - murs.push_back(mur); - queue.push(p1); - queue.push(p2); - // TODO : addDoor(start, end); sur le mur les séparant. ? - break; - } - } - } - - std::vector<Piece*>::iterator it; - for (it = pieces.begin(); it != pieces.end(); ++it) { - Quad c = (*it)->c.insetNESW(50); - addGPUQuad(c, Couleurs::cielHaut); - } - //Quad ch = c.offsetNormal(Dimensions::hauteurEtage); - //addChild(new ToitQuad(ch, Dimensions::hauteurToit)); + Quad ch = c.offsetNormal(Dimensions::hauteurEtage); + addChild(new ToitQuad(ch, Dimensions::hauteurToit)); return true; } diff --git a/rules/architecture/batiment.hh b/rules/architecture/batiment.hh @@ -3,28 +3,8 @@ #include "all_includes.hh" -class Mur { -private: - std::map<float,Segment> objets; - Segment s; -public: - Mur(Segment _s); - void addSplitPoint(float position); - bool addDoor(float start, float end); - bool addWindow(float start, float end); -}; - -class Piece { -public: - Quad c; - Mur* murs[4]; - Piece(Quad _c, Mur* n, Mur* e, Mur* s, Mur* w); -}; - class BatimentQuad_ : public Chose { Quad c; - std::vector<Piece*> pieces; - std::vector<Mur*> murs; public: BatimentQuad_(Quad _c); virtual bool split(); @@ -41,120 +21,4 @@ public: virtual void getBoundingBoxPoints(); }; -class Wall; -class MasterWall; -class WallVertex { -public: - Vertex vertex; - MasterWall* onMasterWall; - float posOnMasterWall; - std::map<WallVertex*, MasterWall*> endWall; -public: - operator Vertex() { return vertex; }; - WallVertex(Vertex _v) : vertex(_v), onMasterWall(NULL), posOnMasterWall(0) {}; - WallVertex(Vertex _v, MasterWall* _onWall, float _posOnWall) : vertex(_v), onMasterWall(_onWall), posOnMasterWall(_posOnWall) {}; - void addEndWall(WallVertex* v, MasterWall* w) { endWall.insert(std::pair<WallVertex*, MasterWall*>(v, w)); } -}; - -class MasterWall; -class MasterWallIterator : public std::iterator<std::input_iterator_tag, MasterWall> { -private: - std::map<float, WallVertex*>::iterator it; - bool reverse; -public: - MasterWallIterator() : it(), reverse(false) {}; - MasterWallIterator(std::map<float, WallVertex*>::iterator mwit) : it(mwit), reverse(false) {}; - MasterWallIterator(std::map<float, WallVertex*>::iterator mwit, bool _reverse) : it(mwit), reverse(_reverse) {}; - MasterWallIterator(std::map<float, WallVertex*>::reverse_iterator mwrit) : it(--(mwrit.base())), reverse(false) {}; - MasterWallIterator(const MasterWallIterator& copy) : it(copy.it), reverse(copy.reverse) {}; - bool operator==(const MasterWallIterator& mwit) const { return it == mwit.it; }; - bool operator!=(const MasterWallIterator& mwit) const { return it != mwit.it; }; - WallVertex* operator*() { return (*it).second; }; - WallVertex* operator->() { return (*it).second; }; - virtual MasterWallIterator& operator++() { if (reverse) it--; else it++; return (*this); } -}; - -class MasterWall { -private: - std::map<float, WallVertex*> vertices; -public: - typedef MasterWallIterator iterator; - MasterWall(WallVertex* u, WallVertex* v) { - insert(0, u); - insert(1, v); - }; - void insert(float position, WallVertex* u) { - vertices.insert(std::pair<float, WallVertex*>(position,u)); - }; - WallVertex* u() { return vertices.begin()->second; }; - WallVertex* v() { return vertices.rbegin()->second; }; - iterator begin() { return iterator(vertices.begin()); } - iterator end() { return iterator(vertices.end()); } - iterator rbegin() { return iterator(vertices.rbegin()); } - iterator rend() { return iterator(vertices.rend()); } - iterator find(float position) { return iterator(vertices.find(position)); } - iterator rfind(float position) { return iterator(vertices.find(position), true); } - iterator find(float position, bool reverse) { return iterator(vertices.find(position), reverse); } -}; - -class Wall { -public: - WallVertex* u; - WallVertex* v; - float uPosOnMasterWall; - float vPosOnMasterWall; - MasterWall* master; -public: - Wall(WallVertex* _u, WallVertex* _v) { - u = _u; - v = _v; - if (u->onMasterWall != NULL && u->onMasterWall == v->onMasterWall) { // u et v au milieu de master - master = u->onMasterWall; - uPosOnMasterWall = u->posOnMasterWall; - vPosOnMasterWall = v->posOnMasterWall; - } else if (u->onMasterWall != NULL && (u->onMasterWall->u() == v || u->onMasterWall->v() == v)) { // u au milieu de master, v au bord - master = u->onMasterWall; - uPosOnMasterWall = u->posOnMasterWall; - vPosOnMasterWall = (master->u() == v) ? 0 : 1; - } else if (v->onMasterWall != NULL && (v->onMasterWall->u() == u || v->onMasterWall->v() == u)) { // v au milieu de master, u au bord - master = v->onMasterWall; - uPosOnMasterWall = (master->u() == u) ? 0 : 1; - vPosOnMasterWall = v->posOnMasterWall; - } else { - std::map<WallVertex*, MasterWall*>::iterator it = u->endWall.find(v); - if (it != u->endWall.end()) { // u et v au bord d'un master existant. - master = it->second; - uPosOnMasterWall = (master->u() == u) ? 0 : 1; - vPosOnMasterWall = (master->u() == u) ? 1 : 0; - } else { // u et v au bord d'un nouveau master. - master = new MasterWall(u, v); - uPosOnMasterWall = 0; - vPosOnMasterWall = 1; - u->addEndWall(v, master); - v->addEndWall(u, master); - } - } - }; - operator Segment () { - return Segment(*u, *v); - } - WallVertex* randomPos(int seed, int n, float a, float b) { - float width = vPosOnMasterWall - uPosOnMasterWall; - float pos = floatInRange(seed, n, uPosOnMasterWall + a*width, uPosOnMasterWall + b*width); - MasterWallIterator mwi = master->find(pos); - if (mwi == master->end()) { // Il n'y a pas encore de WallVertex à cette position sur master. - Vertex mu = *(master->u()); - Vertex mv = *(master->v()); - WallVertex* wv = new WallVertex(mu * pos + mv * (1-pos), master, pos); - master->insert(pos, wv); - return wv; - } else { // Il y a déjà un WallVertex à cette position sur master. - return (*mwi); - } - }; - typedef MasterWall::iterator iterator; - iterator begin() { return master->find(uPosOnMasterWall, (uPosOnMasterWall > vPosOnMasterWall)); }; - iterator end() { return ++(master->find(vPosOnMasterWall, (uPosOnMasterWall > vPosOnMasterWall))); }; -}; - #endif