www

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

commit 0e1b39f5ad4bb16f1a6b1b5019d935b539216c76
parent 3f4674803e5c0c83d5b62da419f0a4db88d1b41a
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Wed, 11 Jan 2012 11:10:55 +0100

Ajout de tous les modèles de toit.

Diffstat:
Mall_includes.hh | 2++
Mgeometry/triangle.cpp | 4++++
Mgeometry/triangle.hh | 5+++--
Arules/architecture/toit.cpp | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Arules/architecture/toit.hh | 43+++++++++++++++++++++++++++++++++++++++++++
Mrules/quartier/quartierquadcarre.cpp | 5+----
6 files changed, 169 insertions(+), 6 deletions(-)

diff --git a/all_includes.hh b/all_includes.hh @@ -34,6 +34,8 @@ class Chose; #include "rules/chose.hh" +#include "rules/architecture/toit.hh" + #include "rules/batiment/batimentquad.hh" #include "rules/batiment/batimentquadmaison.hh" #include "rules/batiment/batimentquadjardin.hh" diff --git a/geometry/triangle.cpp b/geometry/triangle.cpp @@ -76,3 +76,7 @@ Vertex Triangle::normalizedNormal() const { Vertex v = normal(); return v / v.norm(); } + +Triangle Triangle::offsetNormal(float offset) const { + return ((*this) + this->normal().setNorm(offset)); +} diff --git a/geometry/triangle.hh b/geometry/triangle.hh @@ -4,10 +4,10 @@ #include "all_includes.hh" class Triangle { - private : +private : Vertex c[3]; - public : +public : Triangle(); Triangle(Vertex left, Vertex top, Vertex right); inline Vertex& operator[] (SommetTriangle x) { @@ -35,6 +35,7 @@ class Triangle { Vertex randomPoint(int seed, int n) const; Vertex normal() const; Vertex normalizedNormal() const; + Triangle offsetNormal(float offset) const; }; #endif diff --git a/rules/architecture/toit.cpp b/rules/architecture/toit.cpp @@ -0,0 +1,116 @@ +#include "all_includes.hh" + +// TODO : les x.insetNESW_LTR(x.minLength() / 3.f) sont faux (on risque d'avoir un triangle plus petit qu'1/3), il faudrait une fonction inset qui prend un float entre 0 et 1. + +ToitQuad::ToitQuad(Quad _c, float _height) : Chose(), c(_c), height(_height) { + addEntropy(c); +} + +void ToitQuad::getBoundingBoxPoints() { + addBBPoints(c); + addBBPoints(c.offsetNormal(height)); +} + +void ToitQuad::triangulation() { + switch (hash2(seed, -1) % 4) { + case 0: pointCentral(); break; + case 1: deuxPoints(); break; + case 2: deuxPointsVerticaux(); + case 3: + default: plat(); break; + } +} + +void ToitQuad::pointCentral() { + Quad qh = c.offsetNormal(height); + Vertex center = qh.insetNESW(qh.minLength() / 3.f).randomPoint(seed, 0); + for (int i = 0; i < 4; i++) + addGPUTriangle(c[NE+i], center, c[SE+i], r, g, b); +} + +void ToitQuad::deuxPoints() { + // Orienter c dans le sens de la longueur d'est en ouest. + Quad q = c >> ((c.maxLengthNS() > c.maxLengthEW()) ? 1 : 0); + Quad qh = q.offsetNormal(height); + Vertex w = Segment(qh[NW], qh[SW]).randomPos(seed, 0, 1.f/3.f, 2.f/3.f); + Vertex e = Segment(qh[NE], qh[SE]).randomPos(seed, 1, 1.f/3.f, 2.f/3.f); + Vertex centerE = Segment(e,w).randomPos(seed, 2, 0.6f, 0.8f); + Vertex centerW = Segment(e,w).randomPos(seed, 2, 0.2f, 0.4f); + addGPUTriangle(q[NE], centerE, q[SE], r, g, b); + addGPUTriangle(q[SW], centerW, q[NW], r, g, b); + addGPUQuad(q[SE], q[SW], centerW, centerE, r, g, b); + addGPUQuad(q[NW], q[NE], centerE, centerW, r, g, b); +} + +void ToitQuad::deuxPointsVerticaux() { + // Orienter c dans le sens de la longueur d'est en ouest. + Quad q = c >> ((c.maxLengthNS() > c.maxLengthEW()) ? 1 : 0); + Quad qh = q.offsetNormal(height); + Vertex w = Segment(qh[NW], qh[SW]).randomPos(seed, 0, 1.f/3.f, 2.f/3.f); + Vertex e = Segment(qh[NE], qh[SE]).randomPos(seed, 1, 1.f/3.f, 2.f/3.f); + addGPUTriangle(q[NE], e, q[SE], r, g, b); // TODO : devrait être couleur mur. + addGPUTriangle(q[SW], w, q[NW], r, g, b); // TODO : devrait être couleur mur. + addGPUQuad(q[SE], q[SW], w, e, r, g, b); + addGPUQuad(q[NW], q[NE], e, w, r, g, b); +} + +void ToitQuad::plat() { + addGPUQuad(c, r, g, b); +} + +ToitTri::ToitTri(Triangle _c, float _height) : Chose(), c(_c), height(_height) { + addEntropy(c); +} + +void ToitTri::getBoundingBoxPoints() { + addBBPoints(c); + addBBPoints(c.offsetNormal(height)); +} + +void ToitTri::triangulation() { + switch (hash2(seed, -1) % 5) { + case 0: pointCentral(); break; + case 1: troisPoints(); break; + case 2: unPointVertical(); break; + case 3: deuxPointsVerticaux(); break; + case 4: + default: plat(); break; + } +} + +void ToitTri::pointCentral() { + Triangle th = c.offsetNormal(height); + Vertex center = th.insetLTR(th.minLength() / 3.f).randomPoint(seed, 0); + for (int i = 0; i < 3; i++) + addGPUTriangle(c[LEFT+i], center, c[TOP+i], r, g, b); +} + +void ToitTri::troisPoints() { + Triangle th = c.offsetNormal(height).insetLTR(c.minLength() / 3.f); + addGPUTriangle(th, r, g, b); + for (int i = 0; i < 3; i++) + addGPUQuad(c[LEFT], c[TOP], th[TOP], th[LEFT], r, g, b); +} + +void ToitTri::unPointVertical() { + // Rotation aléatoire du triangle + Triangle t = c >> (hash2(seed, 0) % 3); + Triangle th = t.offsetNormal(height); + addGPUTriangle(t[LEFT], th[TOP], t[RIGHT], r, g, b); + addGPUTriangle(t[TOP], th[TOP], t[LEFT], r, g, b); + addGPUTriangle(t[RIGHT], th[TOP], t[TOP], r, g, b); +} + +void ToitTri::deuxPointsVerticaux() { + // Rotation aléatoire du triangle + Triangle t = c >> (hash2(seed, 0) % 3); + Triangle th = t.offsetNormal(height); + addGPUTriangle(th[LEFT], t[TOP], th[RIGHT], r, g, b); + addGPUTriangle(t[TOP], th[LEFT], t[LEFT], r, g, b); + addGPUTriangle(t[RIGHT], th[RIGHT], t[TOP], r, g, b); +} + +void ToitTri::plat() { + addGPUTriangle(c, r, g, b); +} + diff --git a/rules/architecture/toit.hh b/rules/architecture/toit.hh @@ -0,0 +1,43 @@ +#ifndef _RULES_ARCHITECTURE_TOIT_HH_ +#define _RULES_ARCHITECTURE_TOIT_HH_ + +#include "all_includes.hh" + +class ToitQuad : public Chose { +private: + Quad c; + float height; +public: + ToitQuad(Quad _c, float _height); + virtual void triangulation(); + virtual void getBoundingBoxPoints(); +private: + void pointCentral(); + void deuxPoints(); + void deuxPointsVerticaux(); + void plat(); + static const char r = 0xF1; + static const char g = 0xE0; + static const char b = 0xE0; +}; + +class ToitTri : public Chose { +private: + Triangle c; + float height; +public: + ToitTri(Triangle _c, float _height); + virtual void triangulation(); + virtual void getBoundingBoxPoints(); +private: + void pointCentral(); + void troisPoints(); + void unPointVertical(); + void deuxPointsVerticaux(); + void plat(); + static const char r = 0xF1; + static const char g = 0xE0; + static const char b = 0xE0; +}; + +#endif diff --git a/rules/quartier/quartierquadcarre.cpp b/rules/quartier/quartierquadcarre.cpp @@ -5,10 +5,7 @@ QuartierQuadCarre::QuartierQuadCarre(Quad _c) : QuartierQuad(_c) { bool QuartierQuadCarre::split() { Vertex middle[4]; - - Vertex centerN = Segment(c[NW], c[NE]).randomPos(seed, -1, 0.25, 0.75); - Vertex centerS = Segment(c[SE], c[SW]).randomPos(seed, -2, 0.25, 0.75); - Vertex center = Segment(centerN, centerS).randomPos(seed, -3, 0.25, 0.75); + Vertex center = c.insetNESW(c.minLength() / 4.f).randomPoint(seed, -1); for (int i = 0; i < 4; i++) middle[N+i] = Segment(c[NW+i], c[NE+i]).randomPos(seed, i, 0.25, 0.75);