lod.cpp (3060B)
1 #include "all_includes.hh" 2 3 Lod::Lod(Vertex _camera, Chose* root) { 4 for (int i = 0; i < 6; i++) { 5 merge[i].init((i & 1) ? 1 : -1); 6 splitIn[i].init((i & 1) ? 1 : -1); 7 splitOut[i].init((i & 1) ? -1 : 1); 8 } 9 this->camera[0] = _camera.x; 10 this->camera[1] = _camera.y; 11 this->camera[2] = _camera.z; 12 addSplitCube(root); 13 setCamera(_camera); 14 } 15 16 void Lod::setCamera(Vertex newCamera) { 17 this->camera[0] = newCamera.x; 18 this->camera[1] = newCamera.y; 19 this->camera[2] = newCamera.z; 20 21 // Merge. 22 for(int i = 0; i < 6; i++) { 23 Chose* c; 24 while((c = merge[i].popIfLessThan(camera[i>>1]))) { 25 for(int j = 0; j < 6; j++) { 26 if(i == j) continue; 27 merge[j].remove(c->lod.mergeBox[j], c); 28 } 29 doMerge(c); 30 } 31 } 32 // Split out vers split in. 33 for(int i = 0; i < 6; i++) { 34 Chose* c; 35 while((c = splitOut[i].popIfLessThan(camera[i>>1]))) { 36 if(c->lod.inCounter == 5) { 37 for(int j = 0; j < 6; j++) { 38 if(i == j) continue; 39 splitIn[j].remove(c->lod.splitBox[j], c); 40 } 41 doSplit(c); 42 } 43 else { 44 c->lod.inCounter++; 45 splitIn[i].insert(c->lod.splitBox[i], c); 46 } 47 } 48 } 49 50 // Split in vers split out. 51 for(int i = 0; i < 6; i++) { 52 Chose* c; 53 while((c = splitIn[i].popIfLessThan(camera[i>>1]))) { 54 c->lod.inCounter--; 55 splitOut[i].insert(c->lod.splitBox[i], c); 56 } 57 } 58 } 59 60 void Lod::doSplit(Chose* c) { 61 c->split(); 62 std::vector<Chose*>::iterator it; 63 ////bool mergeCube = false; // Started to work again on the project, a new warning detected this. 64 for (it = c->children.begin(); it != c->children.end(); ++it) { 65 ////mergeCube = true; // Started to work again on the project, a new warning detected this. 66 (*it)->triangulation(); 67 (*it)->updateAABB(); 68 // (*it)->drawAABB(); 69 addSplitCube((*it)); 70 } 71 addMergeCube(c); 72 // else { 73 // // Pour debug : quand on tente de split un objet qui ne peut 74 // // pas l'être, on vire le dessin de sa splitBox. 75 // c->clearTriangles(); 76 // c->triangulation(); 77 // } 78 } 79 80 void Lod::doMerge(Chose* c) { 81 doSubMerge(c); 82 addSplitCube(c); 83 } 84 85 void Lod::doSubMerge(Chose* c) { 86 std::vector<Chose*>::iterator it; 87 for (it = c->children.begin(); it != c->children.end(); ++it) { 88 for(int j = 0; j < 6; j++) { 89 merge[j].remove((*it)->lod.mergeBox[j], (*it)); 90 splitIn[j].remove((*it)->lod.splitBox[j], (*it)); 91 splitOut[j].remove((*it)->lod.splitBox[j], (*it)); 92 } 93 doSubMerge(*it); 94 } 95 c->merge(); 96 } 97 98 void Lod::addMergeCube(Chose* chose) { 99 // Innutile de détecter si l'on est déjà sortis de la mergeBox : 100 // comme elle est plus grosse que la splitBox, on est forcément 101 // dedans. 102 for(int i = 0; i < 6; i++) 103 merge[i].insert(chose->lod.mergeBox[i], chose); 104 } 105 106 void Lod::addSplitCube(Chose* c) { 107 c->lod.inCounter = 0; 108 for(int i = 0; i < 6; i++) { 109 if(splitOut[i].lessThan(c->lod.splitBox[i], camera[i>>1])) { 110 c->lod.inCounter++; 111 splitIn[i].insert(c->lod.splitBox[i], c); 112 } else { 113 splitOut[i].insert(c->lod.splitBox[i], c); 114 } 115 } 116 if (c->lod.inCounter == 6) { 117 for(int i = 0; i < 6; i++) 118 splitIn[i].remove(c->lod.splitBox[i], c); 119 doSplit(c); 120 } 121 }