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:
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);