Ajout de tous les modèles de toit.

This commit is contained in:
Georges Dupéron 2012-01-11 11:10:55 +01:00
parent 3f4674803e
commit 0e1b39f5ad
6 changed files with 169 additions and 6 deletions

View File

@ -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"

View File

@ -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));
}

View File

@ -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

116
rules/architecture/toit.cpp Normal file
View File

@ -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);
}

View File

@ -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

View File

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