Ajout de tous les modèles de toit.
This commit is contained in:
parent
3f4674803e
commit
0e1b39f5ad
|
@ -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"
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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
116
rules/architecture/toit.cpp
Normal 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);
|
||||
}
|
||||
|
43
rules/architecture/toit.hh
Normal file
43
rules/architecture/toit.hh
Normal 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
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user