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