From 34e979895e082bc2b0dec4b41661c980851b9f27 Mon Sep 17 00:00:00 2001 From: Volodymyr Patuta Date: Sat, 2 Jan 2021 23:22:22 +0100 Subject: [PATCH] simplifying 1. bind `m` to reset speed multiplier 2. using an object_t struct 3. get object parameters from a file 4. draw all planets and moons in one loop --- vars.txt | 28 +++++ window.c | 351 +++++++++++++++++++------------------------------------ 2 files changed, 145 insertions(+), 234 deletions(-) create mode 100644 vars.txt diff --git a/vars.txt b/vars.txt new file mode 100644 index 0000000..22ca2c1 --- /dev/null +++ b/vars.txt @@ -0,0 +1,28 @@ +0 24.5 0 1 0 1 0 2 0 0 0 +1 87.97 0 1 4.2 1 0 0.0881 59.0 0 1 +1 224.7 0 1 7.9 1 0 0.177 243.75 -0.1773 -1 +1 364.2425 0 1 10 1 0 0.185 1 -0.234 1 +2 1 0 0 4.0 0 0 0.2 1 0 0 +1 686.98 0 1 15.2 1 0 0.096 1.0416 -0.252 1 +2 0.2325 0 0.1 10 0 0 0.2 0 0 0 +2 1.5 0 0.1 25 0 0 0.1666 0 0 0 +1 4382.91 0 1 30 1 0 2.062 0.416 -0.031 1 +2 0.33 0 0.1 1 0 1 0.0893 0 0 0 +2 2 0 0.1 -2.0 0 -1 0.076 0 0 0 +2 3 0 0.1 -3 0 -1.5 0.111 0 0 0 +2 5 0 0.1 4 0 0 0.2 0 0 0 +1 10957.275 0 1 50.4 1 0 1.7544 0.4583 -0.267 1 +2 0.2 0 0.1 1 0 -1 0.05 0 0 0 +2 0.244 0 0.1 -2 0 -0.5 0.0556 0 0 0 +2 0.3125 0 0.1 3 0 -2.5 0.0667 0 0 0 +2 4.3 0 0.1 -4.0 0 -2.2 0.1 0 0 0 +2 6.3 0 0.1 5 0 0 0.0714 0 0 0 +1 30680.37 0 1 65 1 0 0.7463 0.7083 -0.978 0 +2 1 0.01 0 0 3 -2.2 0.05 0 0 0 +2 2 0.01 0 0 -4 -1.2 0.05 0 0 0 +2 5 0.01 0 0 5.0 0 0.0588 0 0 0 +2 7 0.01 0 0 6 -4.4 0.0588 0 0 0 +1 60265.0125 0 1 75 1 0 0.722 0.6 -0.283 1 +2 5 0 0.01 3 0 0 0.1 0 0 0 +1 90580.14 0 1 85 1 0 0.03994 6.4 -0.119 1 +2 5 0 0.01 3 0 0 0.0769 0 0 0 diff --git a/window.c b/window.c index 329aa8d..149be41 100644 --- a/window.c +++ b/window.c @@ -33,18 +33,14 @@ static void draw_object(float * nmv, float * projMat, surface_t * obj, float ma, float mx, float my, float tx, float ty, float tz, float s, float ra, float rx, float ry); +static void get_params(void); static int get_sign(float x, float y); /*!\brief un identifiant pour l'écran (de dessin) */ static uint _screenId = 0; -// surface representing the Sun. -static surface_t * _sun; - -// surface array representing 8 planets + pluto (dwarf planet). -static surface_t * _planet[9]; -// surface array representing 18 moons of the planets. -static surface_t * _moon[18]; +// obj contains all planets, the Sun, Pluto, all the moons and their parameters. +static object_t _obj[28]; /* des variable d'états pour activer/désactiver des options de rendu */ static int _use_tex = 1, _use_color = 0, _use_lighting = 1; @@ -115,7 +111,7 @@ int main(int argc, char ** argv) { /*!\brief init de nos données, spécialement les trois surfaces * utilisées dans ce code */ void init(void) { - uint id[9], sun_id, i, moon_id[18]; + uint id[28], i; int flags, initted; flags = MIX_INIT_MP3; @@ -136,71 +132,71 @@ void init(void) { fprintf(stderr, "Mix_PlayChannel: %s\n", Mix_GetError()); // create all spheres. - _sun = mkSphere(12, 12); /*ça fait 12x12x2 triangles !*/ - for (i = 0; i < 18; ++i) { - _moon[i] = mkSphere(12, 12); - if (i < 9) - _planet[i] = mkSphere(12, 12); + for (i = 0; i < 28; ++i) { + _obj[i].s = mkSphere(12, 12); } // get all textures. - sun_id = getTexFromBMP("images/2k-sun.bmp"); - id[0] = getTexFromBMP("images/2k-mercury.bmp"); - id[1] = getTexFromBMP("images/2k-venus-surface.bmp"); - id[2] = getTexFromBMP("images/2k-earth-daymap.bmp"); - id[3] = getTexFromBMP("images/2k-mars.bmp"); - id[4] = getTexFromBMP("images/2k-jupiter.bmp"); - id[5] = getTexFromBMP("images/2k-saturn.bmp"); - id[6] = getTexFromBMP("images/2k-uranus.bmp"); - id[7] = getTexFromBMP("images/2k-neptune.bmp"); - id[8] = getTexFromBMP("images/pluto.bmp"); + id[0] = getTexFromBMP("images/2k-sun.bmp"); + id[1] = getTexFromBMP("images/2k-mercury.bmp"); + id[2] = getTexFromBMP("images/2k-venus-surface.bmp"); + id[3] = getTexFromBMP("images/2k-earth-daymap.bmp"); + id[4] = getTexFromBMP("images/2k-moon.bmp"); + id[5] = getTexFromBMP("images/2k-mars.bmp"); + id[6] = getTexFromBMP("images/moons/phobos.bmp"); + id[7] = getTexFromBMP("images/moons/deimos.bmp"); + id[8] = getTexFromBMP("images/2k-jupiter.bmp"); + id[9] = getTexFromBMP("images/moons/io.bmp"); + id[10] = getTexFromBMP("images/moons/europa.bmp"); + id[11] = getTexFromBMP("images/moons/ganymede.bmp"); + id[12] = getTexFromBMP("images/moons/callisto.bmp"); + id[13] = getTexFromBMP("images/2k-saturn.bmp"); + id[14] = getTexFromBMP("images/moons/enceladus.bmp"); + id[15] = getTexFromBMP("images/moons/dione.bmp"); + id[16] = getTexFromBMP("images/moons/rhea.bmp"); + id[17] = getTexFromBMP("images/moons/titan.bmp"); + id[18] = getTexFromBMP("images/moons/iapetus.bmp"); + id[19] = getTexFromBMP("images/2k-uranus.bmp"); + id[20] = getTexFromBMP("images/moons/ariel.bmp"); + id[21] = getTexFromBMP("images/moons/umbriel.bmp"); + id[22] = getTexFromBMP("images/moons/titania.bmp"); + id[23] = getTexFromBMP("images/moons/oberon.bmp"); + id[24] = getTexFromBMP("images/2k-neptune.bmp"); + id[25] = getTexFromBMP("images/moons/triton.bmp"); + id[26] = getTexFromBMP("images/pluto.bmp"); + id[27] = getTexFromBMP("images/moons/charon.bmp"); // https://upload.wikimedia.org/wikipedia/commons/4/4f/Moons_of_solar_system_v7.jpg // most of the biggest moons are here. - moon_id[0] = getTexFromBMP("images/2k-moon.bmp"); - moon_id[1] = getTexFromBMP("images/moons/phobos.bmp"); - moon_id[2] = getTexFromBMP("images/moons/deimos.bmp"); - moon_id[3] = getTexFromBMP("images/moons/io.bmp"); - moon_id[4] = getTexFromBMP("images/moons/europa.bmp"); - moon_id[5] = getTexFromBMP("images/moons/ganymede.bmp"); - moon_id[6] = getTexFromBMP("images/moons/callisto.bmp"); - moon_id[7] = getTexFromBMP("images/moons/enceladus.bmp"); - moon_id[8] = getTexFromBMP("images/moons/dione.bmp"); - moon_id[9] = getTexFromBMP("images/moons/rhea.bmp"); - moon_id[10] = getTexFromBMP("images/moons/titan.bmp"); - moon_id[11] = getTexFromBMP("images/moons/iapetus.bmp"); - moon_id[12] = getTexFromBMP("images/moons/ariel.bmp"); - moon_id[13] = getTexFromBMP("images/moons/umbriel.bmp"); - moon_id[14] = getTexFromBMP("images/moons/titania.bmp"); - moon_id[15] = getTexFromBMP("images/moons/oberon.bmp"); - moon_id[16] = getTexFromBMP("images/moons/triton.bmp"); - moon_id[17] = getTexFromBMP("images/moons/charon.bmp"); // set texture to an object id and set all options. - setTexId(_sun, sun_id); - if (_use_tex) - enableSurfaceOption(_sun, SO_USE_TEXTURE); - if (_use_lighting) - enableSurfaceOption(_sun, SO_USE_LIGHTING); - disableSurfaceOption(_sun, SO_USE_COLOR); - for (i = 0; i < 18; ++i) { - setTexId(_moon[i], moon_id[i]); - disableSurfaceOption(_moon[i], SO_USE_COLOR); + for (i = 0; i < 28; ++i) { + setTexId(_obj[i].s, id[i]); + disableSurfaceOption(_obj[i].s, SO_USE_COLOR); if (_use_tex) - enableSurfaceOption(_moon[i], SO_USE_TEXTURE); + enableSurfaceOption(_obj[i].s, SO_USE_TEXTURE); if (_use_lighting) - enableSurfaceOption(_moon[i], SO_USE_LIGHTING); - if (i < 9) { - setTexId(_planet[i], id[i]); - disableSurfaceOption(_planet[i], SO_USE_COLOR); - if (_use_tex) - enableSurfaceOption(_planet[i], SO_USE_TEXTURE); - if (_use_lighting) - enableSurfaceOption(_planet[i], SO_USE_LIGHTING); - } + enableSurfaceOption(_obj[i].s, SO_USE_LIGHTING); } + get_params(); atexit(sortie); } +static void get_params(void) { + int i; + FILE * f; + f = fopen("vars.txt", "r"); + for (i = 0; i < 28; ++i) { + fscanf(f, "%d %f %f %f %f %f %f %f %f %f %f", &_obj[i].id, + &_obj[i].vars[0], &_obj[i].vars[1], &_obj[i].vars[2], &_obj[i].vars[3], &_obj[i].vars[4], + &_obj[i].vars[5], &_obj[i].vars[6], &_obj[i].vars[7], &_obj[i].vars[8], &_obj[i].vars[9]); + // debug + /*fprintf(stderr, "%d %f %f %f %f %f %f %f %f %f %f\n", _obj[i].id, + _obj[i].vars[0], _obj[i].vars[1], _obj[i].vars[2], _obj[i].vars[3], _obj[i].vars[4], + _obj[i].vars[5], _obj[i].vars[6], _obj[i].vars[7], _obj[i].vars[8], _obj[i].vars[9]);*/ + } + fclose(f); +} + // get sign for further move calculation. static int get_sign(float x, float y) { if (x > y) @@ -227,53 +223,53 @@ static void goto_obj(float * mvMat) { switch (_p) { case 1: // MERCURY _a = 0; // reset angle to 0. - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 4.2f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(4.2f, 1.0f, 0.5f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[1].vars[3], _obj[1].vars[4], _obj[1].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[1].vars[3], _obj[1].vars[4], 0.5f); break; case 2: // VENUS _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 7.9f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(7.9f, 1.0f, 1.0f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[2].vars[3], _obj[2].vars[4], _obj[2].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[2].vars[3], _obj[2].vars[4], 1.0f); break; case 3: // EARTH _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 10.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(10.0f, 1.0f, 1.0f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[3].vars[3], _obj[3].vars[4], _obj[3].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[3].vars[3], _obj[3].vars[4], 1.0f); break; case 4: // MARS _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 15.2f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(15.2f, 1.0f, 0.5f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[5].vars[3], _obj[5].vars[4], _obj[5].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[5].vars[3], _obj[5].vars[4], 0.5f); break; case 5: // JUPITER _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 30.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(30.0f, 1.0f, 5.0f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[8].vars[3], _obj[8].vars[4], _obj[8].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[8].vars[3], _obj[8].vars[4], 8.0f); break; case 6: // SATURN _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 50.4f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(50.4f, 1.0f, 5.0f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[13].vars[3], _obj[13].vars[4], _obj[13].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[13].vars[3], _obj[13].vars[4], 8.0f); break; case 7: // URANUS _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 65.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(65.0f, 1.0f, 5.0f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[19].vars[3], _obj[19].vars[4], _obj[19].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[19].vars[3], _obj[19].vars[4], 5.0f); break; case 8: // NEPTUNE _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 75.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(75.0f, 1.0f, 4.0f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[24].vars[3], _obj[24].vars[4], _obj[24].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[24].vars[3], _obj[24].vars[4], 4.0f); break; case 9: // PLUTO _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 85.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(85.0f, 1.0f, 0.1f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[26].vars[3], _obj[26].vars[4], _obj[26].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[26].vars[3], _obj[26].vars[4], 0.4f); break; case 0: // SUN _a = 0; - lookAt(mvMat, _cam.x, _cam.y, _cam.z, 0, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - move_to(0.0f, 1.0f, 10.0f); + lookAt(mvMat, _cam.x, _cam.y, _cam.z, _obj[0].vars[3], _obj[0].vars[4], _obj[0].vars[5], 0.0f, 1.0f, 0.0f); + move_to(_obj[0].vars[3], _obj[0].vars[4], 10.0f); break; } } @@ -292,10 +288,12 @@ static void draw_object(float * nmv, float * projMat, surface_t * obj, /*!\brief la fonction appelée à chaque display. */ void draw(void) { static double t0 = 0, t, dt; - t = gl4dGetElapsedTime(); - dt = (t - t0) / 1000.0; - t0 = t; + int i; float mvMat[16], projMat[16], nmv[16], cpy[16]; + + t = gl4dGetElapsedTime(); + dt = (t - t0) / 1000.0; + t0 = t; /* effacer l'écran et le buffer de profondeur */ gl4dpClearScreen(); clearDepth(); @@ -315,114 +313,24 @@ void draw(void) { // SUN memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _sun, _r/24.5f, 0, 1, 0, 1, 0, 2, 0, 0, 0); - // MERCURY - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[0], _a/87.97f, 0, 1, 4.2f, 1, 0, (2/227.0f)*10, _r/59.0f, 0, 1); + draw_object(nmv, projMat, _obj[0].s, _r/_obj[0].vars[0], _obj[0].vars[1], _obj[0].vars[2], _obj[0].vars[3], + _obj[0].vars[4], _obj[0].vars[5], _obj[0].vars[6], _obj[0].vars[7], _obj[0].vars[8], _obj[0].vars[9]); - // VENUS - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[1], _a/224.7f, 0, 1, 7.9f, 1, 0, (2/113.0f)*10, _r/243.75f, -0.1773f, -1); - - // EARTH - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[2], _a/365.2425f, 0, 1, 10.0f, 1, 0, (2/108.0f)*10, _r, -0.234f, 1); - - // Moon - draw_object(nmv, projMat, _moon[0], 1, 0, 0, 4.0f, 0, 0, (1/5.0f), 1, 0, 0); - - // MARS - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[3], _a/686.98f, 0, 1, 15.2f, 1, 0, (2/208.0f)*10, _r/1.0416f, -0.252f, 1); - - memcpy(cpy, nmv, sizeof cpy); - - // Phobos - draw_object(nmv, projMat, _moon[1], _r*4.3f, 0, 0.1f, 10.0f, 0, 0, (1/5.0f), 0, 0, 0); - - // Deimos - draw_object(cpy, projMat, _moon[2], _r/1.5f, 0, 0.1f, 25.0f, 0, 0, (1/6.0f), 0, 0, 0); - - // JUPITER - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[4], _a/(12 * 365.2425f), 0, 1, 30.0f, 1, 0, (2/9.7f)*10, _r/0.416f, -0.031f, 1); - - memcpy(cpy, nmv, sizeof cpy); - - // Io - draw_object(nmv, projMat, _moon[3], _r*3.0f, 0, 0.1f, 1.0f, 0, 1, (1/11.2f), 0, 0, 0); - - // Europa - memcpy(nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[4], _r/2.0f, 0, 0.1f, -2.0f, 0, -1, (1/13.2f), 0, 0, 0); - - // Ganymede - memcpy(nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[5], _r/3.0f, 0, 0.1f, -3.0f, 0, -1.5f, (1/9.0f), 0, 0, 0); - - // Callisto - memcpy(nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[6], _r/5.0f, 0, 0.1f, 4.0f, 0, 0, (1/10.0f), 0, 0, 0); - - // SATURN - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[5], _a/(30 * 365.2425f), 0, 1, 50.4f, 1, 0, (2/11.4f)*10, _r/0.4583f, -0.267f, 1); - - memcpy(cpy, nmv, sizeof cpy); - - // Enceladus - draw_object(nmv, projMat, _moon[7], _r*5.0f, 0, 0.1f, 1.0f, 0, -1.0f, (1/20.0f), 0, 0, 0); - - // Dione - memcpy(nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[8], _r*4.1f, 0, 0.1f, -2.0f, 0, -0.5f, (1/18.0f), 0, 0, 0); - - // Rhea - memcpy(nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[9], _r*3.2f, 0, 0.1f, 3.0f, 0, -2.5f, (1/15.0f), 0, 0, 0); - - // Titan - memcpy(nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[10], _r/4.3f, 0, 0.1f, -4.0f, 0, -2.2f, (1/10.0f), 0, 0, 0); - - // Iapetus - memcpy(nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[11], _r/6.3f, 0, 0.1f, 5.0f, 0, 0, (1/14.0f), 0, 0, 0); - - // URANUS - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[6], _a/(84 * 365.2425f), 0, 1, 65.0f, 1, 0, (2/26.8f)*10, _r/0.7083f, -0.978f, 0); - - memcpy(cpy, nmv, sizeof cpy); - - // Ariel - draw_object(nmv, projMat, _moon[12], _r, 0.01f, 0, 0, 3.0f, -2.2f, (1/20.0f), 0, 0, 0); - - // Umbriel - memcpy (nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[13], _r/2.0f, 0.01f, 0, 0, -4.0f, -1.2f, (1/20.0f), 0, 0, 0); - - // Titania - memcpy (nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[14], _r/5.0f, 0.01f, 0, 0, 5.0f, 0, (1/17.0f), 0, 0, 0); - - // Oberon - memcpy (nmv, cpy, sizeof nmv); - draw_object(nmv, projMat, _moon[15], _r/7.0f, 0.01f, 0, 0, 6.0f, -4.4f, (1/17.0f), 0, 0, 0); - - // NEPTUNE - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[7], _a/(165 * 365.2425f), 0, 1, 75.0f, 1, 0, (2/27.7f)*10, _r/0.6f, -0.283f, 1.0f); - - // Triton - draw_object(nmv, projMat, _moon[16], _r/5.0f, 0, 0.01f, 3.0f, 0.0f, 0.0f, (1/10.0f), 0, 0, 0); - - // PLUTO - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - draw_object(nmv, projMat, _planet[8], _a/(248 * 365.2425f), 0, 1, 85.0f, 1, 0, (2/500.7f)*10, _r/6.4f, -0.119f, 1.0f); - - // Charon - draw_object(nmv, projMat, _moon[17], _r/5.0f, 0, 0.01f, 3.0f, 0.0f, 0.0f, (1/13.0f), 0, 0, 0); + for (i = 1; i < 28; ++i) { + if(_obj[i].id == 1) { // if object is a planet + memcpy(nmv, mvMat, sizeof nmv); + draw_object(nmv, projMat, _obj[i].s, _a/_obj[i].vars[0], _obj[i].vars[1], _obj[i].vars[2], _obj[i].vars[3], + _obj[i].vars[4], _obj[i].vars[5], _obj[i].vars[6], _r/_obj[i].vars[7], _obj[i].vars[8], _obj[i].vars[9]); + if (i <= 27) { + if (_obj[i+1].id == 2) + memcpy(cpy, nmv, sizeof cpy); + } + } else if (_obj[i].id == 2) { // if object is a moon + memcpy(nmv, cpy, sizeof nmv); + draw_object(nmv, projMat, _obj[i].s, _r/_obj[i].vars[0], _obj[i].vars[1], _obj[i].vars[2], _obj[i].vars[3], + _obj[i].vars[4], _obj[i].vars[5], _obj[i].vars[6], _obj[i].vars[7], _obj[i].vars[8], _obj[i].vars[9]); + } + } /* déclarer qu'on a changé (en bas niveau) des pixels du screen */ gl4dpScreenHasChanged(); @@ -518,6 +426,9 @@ void key(int keycode) { _movement = 1; _overview = 0; break; + case GL4DK_m: + _s = 1; + break; case GL4DK_q: exit(0); break; @@ -614,54 +525,36 @@ void key(int keycode) { case GL4DK_t: /* 't' la texture */ _use_tex = !_use_tex; if(_use_tex) { - enableSurfaceOption(_sun, SO_USE_TEXTURE); - for (i = 0; i < 18; ++i) { - enableSurfaceOption(_moon[i], SO_USE_TEXTURE); - if (i < 9) - enableSurfaceOption(_planet[i], SO_USE_TEXTURE); + for (i = 0; i < 28; ++i) { + enableSurfaceOption(_obj[i].s, SO_USE_TEXTURE); } } else { - disableSurfaceOption(_sun, SO_USE_TEXTURE); - for (i = 0; i < 18; ++i) { - disableSurfaceOption(_moon[i], SO_USE_TEXTURE); - if (i < 9) - disableSurfaceOption(_planet[i], SO_USE_TEXTURE); + for (i = 0; i < 28; ++i) { + disableSurfaceOption(_obj[i].s, SO_USE_TEXTURE); } } break; case GL4DK_c: /* 'c' utiliser la couleur */ _use_color = !_use_color; if(_use_color) { - enableSurfaceOption(_sun, SO_USE_COLOR); - for (i = 0; i < 18; ++i) { - enableSurfaceOption(_moon[i], SO_USE_COLOR); - if (i < 9) - enableSurfaceOption(_planet[i], SO_USE_COLOR); + for (i = 0; i < 28; ++i) { + enableSurfaceOption(_obj[i].s, SO_USE_COLOR); } } else { - disableSurfaceOption(_sun, SO_USE_COLOR); - for (i = 0; i < 18; ++i) { - disableSurfaceOption(_moon[i], SO_USE_COLOR); - if (i < 9) - disableSurfaceOption(_planet[i], SO_USE_COLOR); + for (i = 0; i < 28; ++i) { + disableSurfaceOption(_obj[i].s, SO_USE_COLOR); } } break; case GL4DK_l: /* 'l' utiliser l'ombrage par la méthode Gouraud */ _use_lighting = !_use_lighting; if(_use_lighting) { - enableSurfaceOption(_sun, SO_USE_LIGHTING); - for (i = 0; i < 18; ++i) { - enableSurfaceOption(_moon[i], SO_USE_LIGHTING); - if (i < 9) - enableSurfaceOption(_planet[i], SO_USE_LIGHTING); + for (i = 0; i < 28; ++i) { + enableSurfaceOption(_obj[i].s, SO_USE_LIGHTING); } } else { - disableSurfaceOption(_sun, SO_USE_LIGHTING); - for (i = 0; i < 18; ++i) { - disableSurfaceOption(_moon[i], SO_USE_LIGHTING); - if (i < 9) - disableSurfaceOption(_planet[i], SO_USE_LIGHTING); + for (i = 0; i < 28; ++i) { + disableSurfaceOption(_obj[i].s, SO_USE_LIGHTING); } } break; @@ -696,20 +589,10 @@ void sortie(void) { int i; Mix_CloseAudio(); Mix_Quit(); - if (_sun) { - freeSurface(_sun); - _sun = NULL; - } - for (i = 0; i < 18; ++i) { - if(_moon[i]){ - freeSurface(_moon[i]); - _moon[i] = NULL; - } - if (i < 9) { - if (_planet[i]){ - freeSurface(_planet[i]); - _planet[i] = NULL; - } + for (i = 0; i < 28; ++i) { + if(_obj[i].s){ + freeSurface(_obj[i].s); + _obj[i].s = NULL; } } if (bsound)