Affichage des splitBox.

This commit is contained in:
Georges Dupéron 2011-12-22 12:28:16 +01:00
parent 124d59f2b9
commit bbba636472
7 changed files with 50 additions and 83 deletions

View File

@ -6,7 +6,7 @@
int random_seed(); int random_seed();
unsigned int hash2(unsigned int a, unsigned int b); unsigned int hash2(unsigned int a, unsigned int b);
int hashInRange(int seed, int n, int a, int b); // Renvoie le n-ième nombre aléatoire dérivé de seed entre a et b. int hashInRange(int seed, int n, int a, int b); // Renvoie le n-ième nombre aléatoire dérivé de seed entre a et b (a inclus, b non inclus).
bool proba(int seed, int n, unsigned int a, unsigned int b); // Renvoie vrai avec `a` fois sur `b`. bool proba(int seed, int n, unsigned int a, unsigned int b); // Renvoie vrai avec `a` fois sur `b`.
#endif #endif

39
lod.cpp
View File

@ -32,7 +32,8 @@ void Lod::setCamera(Vertex newCamera) {
Chose* c; Chose* c;
int pos = NegateOdd(camera[i>>1], i); int pos = NegateOdd(camera[i>>1], i);
while((c = split[2*i+1].popIfLessThan(pos))) { while((c = split[2*i+1].popIfLessThan(pos))) {
if(c->inCounter == 5) { std::cout << "soi " << (int)(c) << std::endl;
if(c->lod.inCounter == 5) {
for(int j = 0; j < 6; j++) { for(int j = 0; j < 6; j++) {
if(i == j) continue; if(i == j) continue;
split[2*j].remove(c); split[2*j].remove(c);
@ -40,8 +41,8 @@ void Lod::setCamera(Vertex newCamera) {
doSplit(c); doSplit(c);
} }
else { else {
c->inCounter++; c->lod.inCounter++;
split[2*i].insert(c->splitCube[i], c); split[2*i].insert(c->lod.splitBox[i], c);
} }
} }
} }
@ -51,40 +52,42 @@ void Lod::setCamera(Vertex newCamera) {
Chose* c; Chose* c;
int pos = NegateEven(camera[i>>1], i); int pos = NegateEven(camera[i>>1], i);
while((c = split[2*i].popIfLessThan(pos))) { while((c = split[2*i].popIfLessThan(pos))) {
c->inCounter--; c->lod.inCounter--;
split[2*i+1].insert(c->splitCube[i], c); split[2*i+1].insert(c->lod.splitBox[i], c);
} }
} }
} }
void Lod::doSplit(Chose* c) { void Lod::doSplit(Chose* c) {
// TODO // TODO
c->split(); if (c->split()) {
std::vector<Chose*>::iterator it; std::vector<Chose*>::iterator it;
for (it = c->children.begin(); it != c->children.end(); ++it) { for (it = c->children.begin(); it != c->children.end(); ++it) {
(*it)->triangulation(); (*it)->triangulation();
(*it)->updateAABB(); (*it)->updateAABB();
addSplitCube((*it)); (*it)->drawAABB();
addSplitCube((*it));
}
} }
} }
void Lod::addMergeCube(Chose* chose) { void Lod::addMergeCube(Chose* chose) {
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
merge[i].insert(NegateEven(chose->lod.mergeCube[i], i), chose); merge[i].insert(NegateEven(chose->lod.mergeBox[i], i), chose);
} }
void Lod::addSplitCube(Chose* chose) { void Lod::addSplitCube(Chose* chose) {
chose->inCounter = 0; chose->lod.inCounter = 0;
for(int i = 0; i < 6; i++) { for(int i = 0; i < 6; i++) {
if(NegateEven(chose->lod.splitCube[i] - camera[i>>1], i) >= 0) { if(NegateEven(chose->lod.splitBox[i] - camera[i>>1], i) >= 0) {
chose->inCounter++; chose->lod.inCounter++;
split[2*i].insert(NegateEven(chose->lod.splitCube[i],i), chose); split[2*i].insert(NegateEven(chose->lod.splitBox[i],i), chose);
} else { } else {
split[2*i+1].insert(NegateOdd(chose->lod.splitCube[i],i), chose); split[2*i+1].insert(NegateOdd(chose->lod.splitBox[i],i), chose);
} }
} }
// TODO : si chose->inCounter == 6, il faut le split immédiatement. // TODO : si chose->inCounter == 6, il faut le split immédiatement.
if (chose->inCounter == 6) { if (chose->lod.inCounter == 6) {
for(int i = 0; i < 6; i++) { for(int i = 0; i < 6; i++) {
split[2*i].remove(chose); split[2*i].remove(chose);
} }

4
lod.hh
View File

@ -25,8 +25,8 @@ public :
struct LodNode { struct LodNode {
int heaps[18]; int heaps[18];
float aabb[6]; float aabb[6];
float splitCube[12]; float splitBox[12];
float mergeCube[6]; float mergeBox[6];
int inCounter; int inCounter;
bool firstBBPoint; bool firstBBPoint;
}; };

View File

@ -30,6 +30,7 @@ int main() {
Chose* c = QuartierQuad::factory(Chose::initialSeed, 0, ne, se, sw, nw); Chose* c = QuartierQuad::factory(Chose::initialSeed, 0, ne, se, sw, nw);
c->triangulation(); c->triangulation();
c->updateAABB(); c->updateAABB();
c->drawAABB();
// c->split(); // c->split();
// recursiveSubdivide(c); // recursiveSubdivide(c);

View File

@ -68,59 +68,32 @@ void Chose::addBBPoint(Vertex v) {
void Chose::updateAABB() { void Chose::updateAABB() {
lod.firstBBPoint = true; lod.firstBBPoint = true;
getBoundingBoxPoints(); getBoundingBoxPoints();
for (int i = 0; i < 6; i++) { for (int i = 0; i < 3; i++) {
// TODO float splitFactor = 2;
lod.splitCube[i] = lod.aabb[i]; float mergeFactor = 3;
lod.mergeCube[i] = lod.aabb[i]; float center = (lod.aabb[2*i] + lod.aabb[2*i+1]) / 2;
lod.splitBox[2*i] = (lod.aabb[2*i] - center) * splitFactor + center;
lod.splitBox[2*i+1] = (lod.aabb[2*i+1] - center) * splitFactor + center;
lod.mergeBox[2*i] = (lod.aabb[2*i] - center) * mergeFactor + center;
lod.mergeBox[2*i+1] = (lod.aabb[2*i+1] - center) * mergeFactor + center;
} }
} }
void Chose::displayAABB() { // DEBUG
updateAABB(); void Chose::drawAABB() {
if (children.size() > 0) { addOcto(
std::vector<Chose*>::iterator it; Vertex(lod.splitBox[0], lod.splitBox[2], lod.splitBox[4]),
for (it = children.begin(); it != children.end(); ++it) { Vertex(lod.splitBox[1], lod.splitBox[2], lod.splitBox[4]),
(*it)->displayAABB(); Vertex(lod.splitBox[1], lod.splitBox[3], lod.splitBox[4]),
} Vertex(lod.splitBox[0], lod.splitBox[3], lod.splitBox[4]),
} else { Vertex(lod.splitBox[0], lod.splitBox[2], lod.splitBox[5]),
// Affiche la AABB. Vertex(lod.splitBox[1], lod.splitBox[2], lod.splitBox[5]),
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[4]); Vertex(lod.splitBox[1], lod.splitBox[3], lod.splitBox[5]),
glVertex3d(lod.aabb[0],lod.aabb[3],lod.aabb[5]); Vertex(lod.splitBox[0], lod.splitBox[3], lod.splitBox[5]),
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[5]); hashInRange(seed, 42, 0, 256),
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[4]); hashInRange(seed, 43, 0, 256),
glVertex3d(lod.aabb[1],lod.aabb[2],lod.aabb[5]); hashInRange(seed, 44, 0, 256)
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[5]); );
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[4]);
glVertex3d(lod.aabb[0],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[0],lod.aabb[3],lod.aabb[4]);
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[4]);
glVertex3d(lod.aabb[0],lod.aabb[3],lod.aabb[4]);
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[2],lod.aabb[5]);
glVertex3d(lod.aabb[1],lod.aabb[2],lod.aabb[4]);
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[2],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[5]);
glVertex3d(lod.aabb[0],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[0],lod.aabb[3],lod.aabb[4]);
glVertex3d(lod.aabb[0],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[0],lod.aabb[2],lod.aabb[5]);
glVertex3d(lod.aabb[1],lod.aabb[2],lod.aabb[5]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[1],lod.aabb[2],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[2],lod.aabb[5]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[0],lod.aabb[3],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[5]);
glVertex3d(lod.aabb[1],lod.aabb[2],lod.aabb[4]);
glVertex3d(lod.aabb[1],lod.aabb[3],lod.aabb[4]);
}
} }
unsigned int Chose::initialSeed = 779313522;//random_seed(); unsigned int Chose::initialSeed = 779313522;//random_seed();

View File

@ -11,14 +11,11 @@ class Chose {
std::vector<Chose*> children; std::vector<Chose*> children;
std::vector<Triangle*> triangles; std::vector<Triangle*> triangles;
LodNode lod; LodNode lod;
int inCounter;
int splitCube[6];
int mergeCube[6];
Vertex lctr; // Local center; Vertex lctr; // Local center;
public : public :
void display(); void display();
void displayAABB(); void drawAABB(); // DEBUG
virtual bool split() = 0; virtual bool split() = 0;
virtual bool merge(); virtual bool merge();
virtual void triangulation() = 0; virtual void triangulation() = 0;

View File

@ -3,7 +3,7 @@
// camera(Camera(Vertex(9600,10000,15300),0,179,1000,0.6) // camera(Camera(Vertex(9600,10000,15300),0,179,1000,0.6)
View::View(Chose* root) View::View(Chose* root)
: root(root), : root(root),
camera(Camera(Vertex(10,10,-100),45,90,1000,0.6)), camera(Camera(Vertex(-15000,-15000,3000),45,90,1000,0.6)),
lod(camera.cameraCenter, root) { lod(camera.cameraCenter, root) {
initWindow(); initWindow();
mainLoop(); mainLoop();
@ -97,13 +97,6 @@ void View::renderScene(int lastTime, int currentTime) {
root->display(); root->display();
glEnd(); glEnd();
// DEBUG : display AABB
// glDisable(GL_LIGHTING);
// glDisable(GL_TEXTURE_2D);
// glBegin(GL_TRIANGLES);
// root->displayAABB();
// glEnd();
glFlush(); glFlush();
SDL_GL_SwapBuffers(); SDL_GL_SwapBuffers();
} }