commit b333f10d0b05147002fac7eb05da7de0bdee8b1c
parent 3701b8e1d551a662554bab2cf28384974f708a64
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Thu, 22 Dec 2011 18:13:12 +0100
Le LOD marche 100% pour les split !
Diffstat:
3 files changed, 14 insertions(+), 42 deletions(-)
diff --git a/heap.cpp b/heap.cpp
@@ -6,14 +6,6 @@ Heap::Heap()
void Heap::init(int id, int factor) { this->id = id; this->factor = factor; }
void Heap::insert(float key, Chose* value) {
- // { // DEBUG
- // int _d_node = value->lod.heaps[id];
- // if (_d_node <= lastNode && _d_node >= 0 &&
- // buckets[getBucket(_d_node)][getIndex(_d_node)].value == value) {
- // std::cout << "ERROR ! Trying to insert " << value;
- // std::cout << " but it is already here." << std::endl;
- // }
- // }
++lastNode;
if (getBucket(lastNode) > lastAllocatedBucket) {
allocateBucket();
@@ -21,26 +13,11 @@ void Heap::insert(float key, Chose* value) {
buckets[getBucket(lastNode)][getIndex(lastNode)].key = key;
buckets[getBucket(lastNode)][getIndex(lastNode)].value = value;
siftUp(lastNode);
- for (int i = 0; i <= lastNode; i++) {
- std::cout << id << " ";
- std::cout << buckets[getBucket(lastNode)][getIndex(lastNode)].key << " ";
- std::cout << buckets[getBucket(lastNode)][getIndex(lastNode)].value;
- std::cout << typeid(*(buckets[getBucket(lastNode)][getIndex(lastNode)].value)).name();
- std::cout << std::endl;
- }
}
void Heap::remove(Chose* value) {
int node = value->lod.heaps[id];
- // { // DEBUG
- // if (buckets[getBucket(node)][getIndex(node)].value != value) {
- // std::cout << "ERROR ! Trying to remove " << value;
- // std::cout << " but found " << buckets[getBucket(node)][getIndex(node)].value;
- // std::cout << std::endl;
- // }
- // }
-
if (node == lastNode) { // On a supprimé le dernier noeud.
--lastNode;
// + 1 pour garder au moins un bucket "en cache".
@@ -84,7 +61,7 @@ void Heap::siftUp(int node) {
break;
int p = parent(node);
np = &(buckets[getBucket(p)][getIndex(p)]);
- if (n->key * factor <= np->key * factor)
+ if (n->key * factor >= np->key * factor) //!!!!!
break;
HeapNode temp = *n;
*n = *np;
@@ -111,9 +88,9 @@ void Heap::siftDown(int node) {
nrc = &(buckets[getBucket(rc)][getIndex(rc)]);
// exchLeft et exchRight peuvent être tout deux true. Dans ce
// cas, c'est exchRight qui gagne.
- bool exchLeft = (lc <= lastNode) && (n->key * factor < nlc->key * factor);
- bool exchRight = (rc <= lastNode) && (n->key * factor < nrc->key * factor);
- exchRight = exchRight && (nlc->key * factor < nrc->key * factor);
+ bool exchLeft = (lc <= lastNode) && (n->key * factor > nlc->key * factor);
+ bool exchRight = (rc <= lastNode) && (n->key * factor > nrc->key * factor);
+ exchRight = exchRight && (nlc->key * factor > nrc->key * factor);
if ((!exchLeft) && (!exchRight))
break;
HeapNode temp = *n;
diff --git a/lod.cpp b/lod.cpp
@@ -33,7 +33,6 @@ void Lod::setCamera(Vertex newCamera) {
for(int i = 0; i < 6; i++) {
Chose* c;
while((c = splitOut[i].popIfLessThan(camera[i>>1]))) {
- std::cout<<"soi "<<c->lod.inCounter+1<<" "<<typeid(*c).name()<<" "<<c<<std::endl;
if(c->lod.inCounter == 5) {
for(int j = 0; j < 6; j++) {
if(i == j) continue;
@@ -52,7 +51,6 @@ void Lod::setCamera(Vertex newCamera) {
for(int i = 0; i < 6; i++) {
Chose* c;
while((c = splitIn[i].popIfLessThan(camera[i>>1]))) {
- std::cout<<"SIO "<<c->lod.inCounter-1<<" "<<typeid(*c).name()<<" "<<c<<std::endl;
c->lod.inCounter--;
splitOut[i].insert(c->lod.splitBox[i], c);
}
@@ -61,20 +59,21 @@ void Lod::setCamera(Vertex newCamera) {
void Lod::doSplit(Chose* c) {
// TODO
- if (c->split() && c->children.size() > 0) {
+ if (c->split()) {
std::vector<Chose*>::iterator it;
for (it = c->children.begin(); it != c->children.end(); ++it) {
(*it)->triangulation();
(*it)->updateAABB();
- (*it)->drawAABB();
+ // (*it)->drawAABB();
addSplitCube((*it));
}
- } else {
- // Pour debug : quand on tente de split un objet qui ne peut
- // pas l'être, on vire le dessin de sa splitBox.
- c->triangles.clear();
- c->triangulation();
}
+ // else {
+ // // Pour debug : quand on tente de split un objet qui ne peut
+ // // pas l'être, on vire le dessin de sa splitBox.
+ // c->triangles.clear();
+ // c->triangulation();
+ // }
}
void Lod::addMergeCube(Chose* chose) {
@@ -85,9 +84,6 @@ void Lod::addMergeCube(Chose* chose) {
void Lod::addSplitCube(Chose* chose) {
chose->lod.inCounter = 0;
for(int i = 0; i < 6; i++) {
- // std::cout << chose->lod.splitBox[i] << " " << camera[i>>1] << " " << splitOut[i].factor;
- // std::cout << " " << (splitOut[i].lessThan(chose->lod.splitBox[i], camera[i>>1]) ? "t" : "f");
- // std::cout << std::endl;
if(splitOut[i].lessThan(chose->lod.splitBox[i], camera[i>>1])) {
chose->lod.inCounter++;
splitIn[i].insert(chose->lod.splitBox[i], chose);
@@ -101,5 +97,4 @@ void Lod::addSplitCube(Chose* chose) {
splitIn[i].remove(chose);
doSplit(chose);
}
- std::cout<<"insert "<<chose->lod.inCounter<<" "<<typeid(*chose).name()<<" "<<chose<<std::endl;
}
diff --git a/view.cpp b/view.cpp
@@ -3,7 +3,7 @@
// camera(Camera(Vertex(9600,10000,15300),0,179,1000,0.6)
View::View(Chose* root)
: root(root),
- camera(Camera(Vertex(-15000,-15000,3000),45,90,1000,0.6)),
+ camera(Camera(Vertex(-9000,-15000,3000),45,90,1000,0.6)),
lod(camera.cameraCenter, root) {
initWindow();
mainLoop();
@@ -105,7 +105,7 @@ void View::mainLoop() {
short continuer = 1;
SDL_Event event;
SDL_EnableKeyRepeat(40,40);
- // SDL_WM_GrabInput(SDL_GRAB_ON);
+ SDL_WM_GrabInput(SDL_GRAB_ON);
SDL_ShowCursor(SDL_DISABLE);
while ( SDL_PollEvent(&event) ); // empty queue.