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();
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`.
#endif

39
lod.cpp
View File

@ -32,7 +32,8 @@ void Lod::setCamera(Vertex newCamera) {
Chose* c;
int pos = NegateOdd(camera[i>>1], i);
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++) {
if(i == j) continue;
split[2*j].remove(c);
@ -40,8 +41,8 @@ void Lod::setCamera(Vertex newCamera) {
doSplit(c);
}
else {
c->inCounter++;
split[2*i].insert(c->splitCube[i], c);
c->lod.inCounter++;
split[2*i].insert(c->lod.splitBox[i], c);
}
}
}
@ -51,40 +52,42 @@ void Lod::setCamera(Vertex newCamera) {
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);
c->lod.inCounter--;
split[2*i+1].insert(c->lod.splitBox[i], c);
}
}
}
void Lod::doSplit(Chose* c) {
// TODO
c->split();
std::vector<Chose*>::iterator it;
for (it = c->children.begin(); it != c->children.end(); ++it) {
(*it)->triangulation();
(*it)->updateAABB();
addSplitCube((*it));
if (c->split()) {
std::vector<Chose*>::iterator it;
for (it = c->children.begin(); it != c->children.end(); ++it) {
(*it)->triangulation();
(*it)->updateAABB();
(*it)->drawAABB();
addSplitCube((*it));
}
}
}
void Lod::addMergeCube(Chose* chose) {
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) {
chose->inCounter = 0;
chose->lod.inCounter = 0;
for(int i = 0; i < 6; i++) {
if(NegateEven(chose->lod.splitCube[i] - camera[i>>1], i) >= 0) {
chose->inCounter++;
split[2*i].insert(NegateEven(chose->lod.splitCube[i],i), chose);
if(NegateEven(chose->lod.splitBox[i] - camera[i>>1], i) >= 0) {
chose->lod.inCounter++;
split[2*i].insert(NegateEven(chose->lod.splitBox[i],i), chose);
} 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.
if (chose->inCounter == 6) {
if (chose->lod.inCounter == 6) {
for(int i = 0; i < 6; i++) {
split[2*i].remove(chose);
}

4
lod.hh
View File

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

View File

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

View File

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

View File

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

View File

@ -3,7 +3,7 @@
// camera(Camera(Vertex(9600,10000,15300),0,179,1000,0.6)
View::View(Chose* 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) {
initWindow();
mainLoop();
@ -97,13 +97,6 @@ void View::renderScene(int lastTime, int currentTime) {
root->display();
glEnd();
// DEBUG : display AABB
// glDisable(GL_LIGHTING);
// glDisable(GL_TEXTURE_2D);
// glBegin(GL_TRIANGLES);
// root->displayAABB();
// glEnd();
glFlush();
SDL_GL_SwapBuffers();
}