Affichage des splitBox.
This commit is contained in:
parent
124d59f2b9
commit
bbba636472
2
hash.hh
2
hash.hh
|
@ -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
|
||||
|
|
29
lod.cpp
29
lod.cpp
|
@ -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();
|
||||
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
4
lod.hh
|
@ -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;
|
||||
};
|
||||
|
|
1
main.cpp
1
main.cpp
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
9
view.cpp
9
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(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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user