diff --git a/hash.cpp b/hash.cpp index 44c527a..18e4c0a 100644 --- a/hash.cpp +++ b/hash.cpp @@ -26,3 +26,12 @@ int hashInRange(int seed, int n, int a, int b) { int newSeed(int seed, int n) { return hash2(seed, n); } + +int random_seed() { + static bool initialized = false; + if (!initialized) { + initialized = true; + srand(time(NULL)); + } + return rand(); +} diff --git a/hash.hh b/hash.hh index 52787b9..25176ab 100644 --- a/hash.hh +++ b/hash.hh @@ -3,6 +3,8 @@ #include "all_includes.hh" +int random_seed(); + unsigned int hash2(unsigned int a, unsigned int b); unsigned int hash3(unsigned int seed, int x, int y); 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. diff --git a/main.cpp b/main.cpp index 2f6d86f..544217d 100644 --- a/main.cpp +++ b/main.cpp @@ -18,7 +18,7 @@ int main() { // Générer une tile de base Vertex ne(50, 50, 0); Vertex sw(0, 0, 0); - Chose* c = new RectangleRoutes(ne, sw); + Chose* c = new RectangleRoutes(ne,sw);//new RectangleRoutes(ne, sw); recursiveSubdivide(c); new View(c); diff --git a/rules/batiment.cpp b/rules/batiment.cpp index 0112cd1..e33d75f 100644 --- a/rules/batiment.cpp +++ b/rules/batiment.cpp @@ -31,10 +31,10 @@ void Batiment::triangulation() { Vertex toit = (ah + bh + ch + dh) / 4 + Vertex(0,0,h/2); // 4 Murs - addTriangle(new Triangle(a,bh,ah,0xf1,0xe3,0xad)); addTriangle(new Triangle(a,b,bh,0xf1,0xe3,0xad)); // a-b-bh-ah - addTriangle(new Triangle(b,dh,bh,0xf1,0xe3,0xad)); addTriangle(new Triangle(b,d,dh,0xf1,0xe3,0xad)); // b-d-dh-bh - addTriangle(new Triangle(d,ch,dh,0xf1,0xe3,0xad)); addTriangle(new Triangle(d,c,ch,0xf1,0xe3,0xad)); // d-c-ch-dh - addTriangle(new Triangle(c,ah,ch,0xf1,0xe3,0xad)); addTriangle(new Triangle(c,a,ah,0xf1,0xe3,0xad)); // c-a-ah-ch + addTriangle(new Triangle(ah,bh,a,0xf1,0xe3,0xad)); addTriangle(new Triangle(bh,b,a,0xf1,0xe3,0xad)); // a-b-bh-ah + addTriangle(new Triangle(bh,dh,b,0xf1,0xe3,0xad)); addTriangle(new Triangle(dh,d,b,0xf1,0xe3,0xad)); // b-d-dh-bh + addTriangle(new Triangle(dh,ch,d,0xf1,0xe3,0xad)); addTriangle(new Triangle(ch,c,d,0xf1,0xe3,0xad)); // d-c-ch-dh + addTriangle(new Triangle(ch,ah,c,0xf1,0xe3,0xad)); addTriangle(new Triangle(ah,a,c,0xf1,0xe3,0xad)); // c-a-ah-ch // 1 Toit addTriangle(new Triangle(ah,toit,bh,0x8a,0x48,0x3c)); diff --git a/rules/carrefour.cpp b/rules/carrefour.cpp index d108ce7..9d074c9 100644 --- a/rules/carrefour.cpp +++ b/rules/carrefour.cpp @@ -20,6 +20,6 @@ std::ostream& operator<<(std::ostream& os, const Carrefour& c) { void Carrefour::triangulation() { triangles.reserve(2); - addTriangle(new Triangle(sw, nw, ne, 0x80, 0x80, 0x80)); + addTriangle(new Triangle(ne, nw, sw, 0x80, 0x80, 0x80)); addTriangle(new Triangle(sw, se, ne, 0x80, 0x80, 0x80)); } diff --git a/rules/chose.cpp b/rules/chose.cpp index 558bf4e..be0f9f2 100644 --- a/rules/chose.cpp +++ b/rules/chose.cpp @@ -34,3 +34,5 @@ void Chose::display() { } } } + +unsigned int Chose::initialSeed = random_seed(); diff --git a/rules/chose.hh b/rules/chose.hh index 5b02d45..c8a4d43 100644 --- a/rules/chose.hh +++ b/rules/chose.hh @@ -6,7 +6,7 @@ // RectangleRoutes est un quadrilatère de routes avec des angles aux coins égaux à 90°. class Chose { public: - static const unsigned int initialSeed = 42; + static unsigned int initialSeed; unsigned int seed; std::vector children; std::vector triangles; diff --git a/rules/rectangleroutes.cpp b/rules/rectangleroutes.cpp index 7e6e6e6..6273f34 100644 --- a/rules/rectangleroutes.cpp +++ b/rules/rectangleroutes.cpp @@ -11,9 +11,13 @@ int RectangleRoutes::height() { return std::abs(this->ne.y - this->sw.y); } bool RectangleRoutes::subdivide() { children.reserve(9); + int splitXMin = this->sw.x + std::max(4, this->width()*1/4); + int splitXMax = this->ne.x - std::max(4, this->width()*1/4); + int splitYMin = this->sw.y + std::max(4, this->height()*1/4); + int splitYMax = this->ne.y - std::max(4, this->height()*1/4); Vertex split( - hashInRange(this->seed, 0, this->sw.x + this->width()*1/4, this->sw.x + this->width()*3/4), - hashInRange(this->seed, 1, this->sw.y + this->height()*1/4, this->sw.y + this->height()*3/4), + hashInRange(this->seed, 0, splitXMin, splitXMax), + hashInRange(this->seed, 1, splitYMin, splitYMax), 0 // TODO ); // TODO : addChild(…); @@ -45,7 +49,7 @@ void RectangleRoutes::triangulation() { triangles.reserve(2); Vertex nw(this->sw.x, this->ne.y, 0); Vertex se(this->ne.x, this->sw.y, 0); - addTriangle(new Triangle(this->sw, nw, this->ne, 0xc0, 0xc0, 0xc0)); + addTriangle(new Triangle(this->ne, nw, this->sw, 0xc0, 0xc0, 0xc0)); addTriangle(new Triangle(this->sw, se, this->ne, 0xc0, 0xc0, 0xc0)); } diff --git a/rules/route.cpp b/rules/route.cpp index 6cae4ce..69b7ba0 100644 --- a/rules/route.cpp +++ b/rules/route.cpp @@ -21,6 +21,6 @@ std::ostream& operator<<(std::ostream& os, const Route& r) { void Route::triangulation() { triangles.reserve(2); - addTriangle(new Triangle(sw, nw, ne, 0x6c, 0x6c, 0x6c)); + addTriangle(new Triangle(ne, nw, sw, 0x6c, 0x6c, 0x6c)); addTriangle(new Triangle(sw, se, ne, 0x6c, 0x6c, 0x6c)); } diff --git a/triangle.cpp b/triangle.cpp index 88165ce..ce37394 100644 --- a/triangle.cpp +++ b/triangle.cpp @@ -2,8 +2,7 @@ Triangle::Triangle(Vertex v1, Vertex v2, Vertex v3, unsigned char r, unsigned char g, unsigned char b): v1(v1), v2(v2), v3(v3), r(r), g(g), b(b) { // TODO : calcul de la normale. - normal = this->normalVector(v1,v2,v3); - + normal = normalVector(v1,v2,v3); } std::ostream& operator<<(std::ostream& os, const Triangle* t) { @@ -26,7 +25,7 @@ Vertexf Triangle::normalVector(Vertex v1, Vertex v2, Vertex v3) { float x = (float)((ay * bz) - (az * by)); float y = (float)((az * bx) - (ax * bz)); - float z = -(float)((ax * by) - (ay * bx)); + float z = (float)((ax * by) - (ay * bx)); float length = sqrt(x*x + y*y + z*z); normal.x = x/length; @@ -37,14 +36,15 @@ Vertexf Triangle::normalVector(Vertex v1, Vertex v2, Vertex v3) { } void Triangle::display() { - glDisable(GL_LIGHTING); - glDisable(GL_TEXTURE_2D); - glBegin(GL_LINES); - glColor3ub(255,255,0); - glVertex3d(v1.x*10,v1.y*10,v1.z*10); - glVertex3d(v1.x*10+normal.x*50,v1.y*10+normal.y*50,v1.z*10+normal.z*50); - glEnd( ); - glEnable(GL_LIGHTING); + // glDisable(GL_LIGHTING); + // glDisable(GL_TEXTURE_2D); + // glBegin(GL_LINES); + // glColor3ub(255,255,0); + // Vertex v = (v1 + v2 + v3) / 3; + // glVertex3d(v.x*10,v.y*10,v.z*10); + // glVertex3d(v.x*10+normal.x*50,v.y*10+normal.y*50,v.z*10+normal.z*50); + // glEnd( ); + // glEnable(GL_LIGHTING); View::setColor(r,g,b); glNormal3d(normal.x,normal.y,normal.z); diff --git a/view.cpp b/view.cpp index 8f5d998..3efb517 100644 --- a/view.cpp +++ b/view.cpp @@ -1,6 +1,6 @@ #include "all_includes.hh" -View::View(Chose* root) : root(root), cameraCenter(120,-120,50), xAngle(135), yAngle(102), moveDist(4) { +View::View(Chose* root) : root(root), cameraCenter(127,14,128), xAngle(44), yAngle(101), moveDist(4) { cameraSight = cameraCenter + Vertex::fromSpherical(100, yAngle, xAngle); initWindow(); mainLoop(); @@ -23,7 +23,7 @@ void View::initWindow() { float MatSpec[4] = {0.0f, 0.0f, 0.0f, 1.0f}; float MatDif[4] = {0.5f, 0.5f, 0.5f, 1.0f}; - float MatAmb[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + float MatAmb[4] = {0.4f, 0.4f, 0.4f, 1.0f}; float shininess = 128.0f; glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,MatSpec); @@ -36,10 +36,10 @@ void View::initWindow() { } void View::setLight() { - float Light1Pos[4] = {0.5f, 1.0f, 0.0f, 0.0f}; + float Light1Pos[4] = {0.5f, 1.0f, 1.0f, 0.0f}; float Light1Dif[4] = {1.0f, 1.0f, 1.0f, 1.0f}; float Light1Spec[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - float Light1Amb[4] = {0.4f, 0.4f, 0.4f, 1.0f}; + float Light1Amb[4] = {0.2f, 0.2f, 0.2f, 1.0f}; glLightfv(GL_LIGHT0, GL_DIFFUSE, Light1Dif); glLightfv(GL_LIGHT0, GL_SPECULAR, Light1Spec); @@ -124,6 +124,11 @@ void View::mainLoop() { continuer = 0; break; default: + if (SDL_GetKeyName(event.key.keysym.sym)[0] == 'q') + continuer = 0; + if (SDL_GetKeyName(event.key.keysym.sym)[0] == 'p') { // _Print _Position + std::cout << "Camera = " << cameraCenter << " xAngle = " << xAngle << " yAngle = " << yAngle << std::endl; + } break; } break;