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();
|
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
|
||||||
|
|
29
lod.cpp
29
lod.cpp
|
@ -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();
|
||||||
|
(*it)->drawAABB();
|
||||||
addSplitCube((*it));
|
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
4
lod.hh
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
1
main.cpp
1
main.cpp
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
9
view.cpp
9
view.cpp
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user