2011-m2s3-city-builder/rules/arche.cpp
Georges Dupéron 46f1cf4e43 Refactor.
2012-01-19 21:25:29 +01:00

50 lines
1.2 KiB
C++

#include "all_includes.hh"
ArcheQuad::ArcheQuad(Quad _c, float _height, float _start, float _end) : Chose(), c(_c), height(_height), start(_start), end(_end) {
addEntropy(c);
addEntropy(height);
}
bool ArcheQuad::split() {
if (std::abs(end - start) < 0.01)
return false;
float mid = (start + end) / 2;
addChild(new ArcheQuad(c, height, start, mid));
addChild(new ArcheQuad(c, height, mid, end));
return true;
}
void ArcheQuad::triangulation() {
Quad che = c.offsetNormal(f(end) * height);
Quad chw = c.offsetNormal(f(start) * height);
addGPUQuad(Quad(c[NW], c[NE], che[NE], chw[NW]), Couleurs::mur);
addGPUQuad(Quad(c[SE], c[SW], chw[SW], che[SE]), Couleurs::mur);
/*
// Doivent être dessiné par le bâtiment englobant.
if (start == 0)
addGPUQuad(Quad(c[SW], c[NW], chw[NW], chw[SW]), Couleurs::mur);
if (end == 1)
addGPUQuad(Quad(c[NE], c[SE], che[SE], che[NE]), Couleurs::mur);
*/
}
void ArcheQuad::getBoundingBoxPoints() {
addBBPoints(c, height);
}
float ArcheQuad::f(float x) {
switch(hash2(seed, 0) % 2){
case 0: return ogive(x);
case 1:
default: return berceau(x);
}
}
float ArcheQuad::ogive(float x) {
return sin(acos(abs(x / 2.f) + 1.f/2.f));
}
float ArcheQuad::berceau(float x) {
return sin(acos(x));
}