www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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 }