2011-m2s3-city-builder/lod.cpp

112 lines
2.4 KiB
C++

#include "all_includes.hh"
Abr::Abr() {
}
void Abr::insert(int key, Chose* value) {
key = key;
value = value;
//map.insert(key,value);
}
void Abr::remove(int key, Chose* value) {
std::multimap<int, Chose*>::iterator it;
std::pair<std::multimap<int, Chose*>::iterator, std::multimap<int, Chose*>::iterator> ret;
ret = map.equal_range(key);
for (it=ret.first; it!=ret.second; ++it) {
if ((*it).second == value) {
map.erase(it);
break;
}
}
}
Chose* Abr::popIfLessThan(int key) {
std::multimap<int,Chose*>::iterator it = map.begin();
if((*it).first < key) {
map.erase(it);
return (*it).second;
} else {
return NULL;
}
}
#define NegateEven(v, i) ((v)*(((i)&1) ? 1 : -1))
Lod::Lod(){};
Lod::Lod(float camera[3]) {
this->camera[0] = camera[0];
this->camera[1] = camera[1];
this->camera[2] = camera[2];
}
void Lod::setCamera(float camera[3]) {
this->camera[0] = camera[0];
this->camera[1] = camera[1];
this->camera[2] = camera[2];
// Merge.
for(int i = 0; i < 6; i++) {
Chose* c;
int pos = NegateEven(camera[i>>1], i);
while((c = merge[i].popIfLessThan(pos))) {
for(int j = 0; j < 6; j++) {
if(i == j) break;
// TODO : sera merge[j].remove(c->mergeCube[j]);
merge[j].remove(NegateEven(c->mergeCube[j], j), c);
}
}
}
// Split out vers split in.
for(int i = 0; i < 6; i++) {
Chose* c;
int pos = NegateEven(camera[i>>1], i+1);
while((c = split[2*i+1].popIfLessThan(pos))) {
if(c->inCounter == 5) {
for(int j = 0; j < 6; j++) {
if(i == j) break;
// TODO : sera split[2*j].remove(c->splitCube[j]);
split[2*j].remove(NegateEven(c->splitCube[j], j), c);
}
}
else {
c->inCounter++;
split[2*i].insert(c->splitCube[i], c);
}
}
}
// Split in vers split out.
for(int i = 0; i < 6; i++) {
Chose* c;
int pos = NegateEven(camera[i>>1], i);
while((c = split[2*i].popIfLessThan(pos))) {
c->inCounter--;
split[2*i+1].insert(c->splitCube[i], c);
}
}
}
void Lod::addMergeCube(Chose* chose, int limits[6]) {
for(int i = 0; i < 5; i++)
merge[i].insert(NegateEven(limits[i], i), chose);
}
void Lod::addSplitCube(Chose* chose, int limits[6]) {
chose->inCounter = 0;
for(int i = 0; i < 5; i++)
if(NegateEven(limits[i],i) > camera[i>>1]) {
chose->inCounter++;
split[2*i].insert(NegateEven(limits[i],i), chose);
}
else {
split[2*i+1].insert(NegateEven(limits[i],i+1), chose);
}
}