2011-m2s3-city-builder/rules/chose.cpp

166 lines
4.5 KiB
C++

#include "all_includes.hh"
Chose::Chose() : seed(initialSeed), children() {
}
void Chose::clearChildren() {
std::vector<Chose*>::iterator it;
for (it = children.begin(); it != children.end(); it++)
delete *it;
children.clear();
}
Chose::~Chose() {
clearChildren();
triangles.clear();
}
void Chose::addChild(Chose* c) {
children.push_back(c);
}
bool Chose::merge() {
clearChildren();
// triangles.clear();
return true;
}
void Chose::addGPUTriangle(Vertex left, Vertex top, Vertex right, unsigned int rgb) {
triangles.push_back(new GPUTriangle(left, top, right, Couleurs::r(rgb), Couleurs::g(rgb), Couleurs::b(rgb)));
}
void Chose::addGPUTriangle(Triangle t, unsigned int rgb) {
addGPUTriangle(t[LEFT], t[TOP], t[RIGHT], rgb);
}
void Chose::addGPUQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw, unsigned int rgb) {
this->addGPUTriangle(nw, ne, se, rgb);
this->addGPUTriangle(se, sw, nw, rgb);
}
void Chose::addGPUQuad(Quad q, unsigned int rgb) {
addGPUQuad(q[NE], q[SE], q[SW], q[NW], rgb);
}
void Chose::addGPUOcto(Vertex ne, Vertex se, Vertex sw, Vertex nw,
Vertex neh, Vertex seh, Vertex swh, Vertex nwh, unsigned int rgb) {
addGPUOcto(Quad(ne,se,sw,nw), Quad(neh,seh,swh,nwh), rgb);
}
void Chose::addGPUOcto(Quad q, Quad qh, unsigned int rgb) {
this->addGPUQuad(q[SE], q[NE], q[NW], q[SW], rgb);
this->addGPUQuad(qh[NE], qh[SE], qh[SW], qh[NW], rgb);
for (int i = 0; i < 4; i++)
this->addGPUQuad(q[NE+i], q[SE+i], qh[SE+i], qh[NE+i], rgb);
}
void Chose::display() {
if (children.size() > 0) {
std::vector<Chose*>::iterator it;
for (it = children.begin(); it != children.end(); ++it) {
(*it)->display();
}
} else {
std::vector<GPUTriangle*>::iterator it;
for (it = triangles.begin(); it != triangles.end(); ++it) {
(*it)->display();
}
}
}
void Chose::displayNormals() {
if (children.size() > 0) {
std::vector<Chose*>::iterator it;
for (it = children.begin(); it != children.end(); ++it) {
(*it)->displayNormals();
}
} else {
std::vector<GPUTriangle*>::iterator it;
for (it = triangles.begin(); it != triangles.end(); ++it) {
(*it)->displayNormal();
}
}
}
void Chose::addBBPoint(const Vertex v) {
if (lod.firstBBPoint) {
lod.firstBBPoint = false;
lod.aabb[0] = v.x;
lod.aabb[1] = v.x;
lod.aabb[2] = v.y;
lod.aabb[3] = v.y;
lod.aabb[4] = v.z;
lod.aabb[5] = v.z;
} else {
lod.aabb[0] = std::min(lod.aabb[0], v.x);
lod.aabb[1] = std::max(lod.aabb[1], v.x);
lod.aabb[2] = std::min(lod.aabb[2], v.y);
lod.aabb[3] = std::max(lod.aabb[3], v.y);
lod.aabb[4] = std::min(lod.aabb[4], v.z);
lod.aabb[5] = std::max(lod.aabb[5], v.z);
}
}
void Chose::addBBPoints(const Triangle t) {
addBBPoint(t[LEFT]);
addBBPoint(t[TOP]);
addBBPoint(t[RIGHT]);
}
void Chose::addBBPoints(const Triangle t, float height) {
addBBPoints(t);
addBBPoints(t.offsetNormal(height));
}
void Chose::addBBPoints(const Quad q) {
addBBPoint(q[NE]);
addBBPoint(q[SE]);
addBBPoint(q[SW]);
addBBPoint(q[NW]);
}
void Chose::addBBPoints(const Quad q, float height) {
addBBPoints(q);
addBBPoints(q.offsetNormal(height));
}
void Chose::updateAABB() {
float splitFactor = 5.f;
float mergeFactor = 6.f;
lod.firstBBPoint = true;
getBoundingBoxPoints();
float size[3];
for (int i = 0; i < 3; i++)
size[i] = lod.aabb[2*i+1] - lod.aabb[2*i];
float areaFacing[3];
for (int i = 0; i < 3; i++)
areaFacing[i] = size[(i+1)%3]*size[(i+1)%3];
for (int i = 0; i < 3; i++) {
float pseudoLength = std::max(1.f, std::sqrt(areaFacing[i] + areaFacing[(i+1)%3] / 2.f + areaFacing[(i+1)%3] / 2.f));
float splitIncrement = std::min((float)View::backFrustum, splitFactor * pseudoLength);
float mergeIncrement = std::min(View::backFrustum * mergeFactor/splitFactor, mergeFactor * pseudoLength);
lod.splitBox[2*i] = lod.aabb[2*i] - splitIncrement;
lod.splitBox[2*i+1] = lod.aabb[2*i+1] + splitIncrement;
lod.mergeBox[2*i] = lod.aabb[2*i] - mergeIncrement;
lod.mergeBox[2*i+1] = lod.aabb[2*i+1] + splitIncrement;
}
}
// DEBUG
void Chose::drawAABB() {
addGPUOcto(
Vertex(lod.splitBox[0], lod.splitBox[2], lod.splitBox[4]),
Vertex(lod.splitBox[1], lod.splitBox[2], lod.splitBox[4]),
Vertex(lod.splitBox[1], lod.splitBox[3], lod.splitBox[4]),
Vertex(lod.splitBox[0], lod.splitBox[3], lod.splitBox[4]),
Vertex(lod.splitBox[0], lod.splitBox[2], lod.splitBox[5]),
Vertex(lod.splitBox[1], lod.splitBox[2], lod.splitBox[5]),
Vertex(lod.splitBox[1], lod.splitBox[3], lod.splitBox[5]),
Vertex(lod.splitBox[0], lod.splitBox[3], lod.splitBox[5]),
hash2(seed, 42) & 0xffffff
);
}
unsigned int Chose::initialSeed = random_seed();