diff --git a/images/2k-stars-milky-way.bmp b/images/2k-stars-milky-way.bmp new file mode 100644 index 0000000..8d642e3 Binary files /dev/null and b/images/2k-stars-milky-way.bmp differ diff --git a/window.c b/window.c index 8484c3c..9e779fc 100644 --- a/window.c +++ b/window.c @@ -35,139 +35,168 @@ static surface_t * _sphere = NULL; static int _use_tex = 1, _use_color = 0, _use_lighting = 1; /*!\brief on peut bouger la caméra vers le haut et vers le bas avec cette variable */ -static float _ycam = 1.0f; -static float _xcam = 1.0f; +static float _ycam = 0.0f; +static float _xcam = 0.0f; +static float _zcam = 10.0f; + +static float _y = 0.0f; +static float _x = 0.0f; +static float _z = 0.0f; /*!\brief paramètre l'application et lance la boucle infinie. */ int main(int argc, char ** argv) { - /* tentative de création d'une fenêtre pour GL4Dummies */ - if(!gl4duwCreateWindow(argc, argv, /* args du programme */ - "Mon moteur de rendu <>", /* titre */ - 10, 10, 640, 480, /* x, y, largeur, heuteur */ - GL4DW_SHOWN) /* état visible */) { - /* ici si échec de la création souvent lié à un problème d'absence - * de contexte graphique ou d'impossibilité d'ouverture d'un - * contexte OpenGL (au moins 3.2) */ - return 1; - } - /* Pour forcer la désactivation de la synchronisation verticale */ - SDL_GL_SetSwapInterval(0); - init(); - /* création d'un screen GL4Dummies (texture dans laquelle nous - * pouvons dessiner) aux dimensions de la fenêtre */ - _screenId = gl4dpInitScreen(); - /* mettre en place la fonction d'interception clavier */ - gl4duwKeyDownFunc(key); - /* mettre en place la fonction de display */ - gl4duwDisplayFunc(draw); - /* boucle infinie pour éviter que le programme ne s'arrête et ferme - * la fenêtre immédiatement */ - gl4duwMainLoop(); - return 0; + /* tentative de création d'une fenêtre pour GL4Dummies */ + if(!gl4duwCreateWindow(argc, argv, /* args du programme */ + "Solar System", /* titre */ + 10, 10, 640, 480, /* x, y, largeur, heuteur */ + GL4DW_SHOWN) /* état visible */) { + /* ici si échec de la création souvent lié à un problème d'absence + * de contexte graphique ou d'impossibilité d'ouverture d'un + * contexte OpenGL (au moins 3.2) */ + return 1; + } + /* Pour forcer la désactivation de la synchronisation verticale */ + SDL_GL_SetSwapInterval(0); + init(); + /* création d'un screen GL4Dummies (texture dans laquelle nous + * pouvons dessiner) aux dimensions de la fenêtre */ + _screenId = gl4dpInitScreen(); + /* mettre en place la fonction d'interception clavier */ + gl4duwKeyDownFunc(key); + /* mettre en place la fonction de display */ + gl4duwDisplayFunc(draw); + /* boucle infinie pour éviter que le programme ne s'arrête et ferme + * la fenêtre immédiatement */ + gl4duwMainLoop(); + return 0; } /*!\brief init de nos données, spécialement les trois surfaces * utilisées dans ce code */ void init(void) { - GLuint id; - vec4 g = {0, 1, 0, 1}; - /* on créé nos trois type de surfaces */ - _sphere = mkSphere(12, 12); /* ça fait 12x12x2 trianles ! */ - /* on change les couleurs de surfaces */ - _sphere->dcolor = g; - /* on leur rajoute la même texture */ - id = getTexFromBMP("images/2k-jupiter.bmp"); - setTexId(_sphere, id); - /* si _use_tex != 0, on active l'utilisation de la texture pour les - * trois */ - if(_use_tex) { - enableSurfaceOption(_sphere, SO_USE_TEXTURE); - } - /* si _use_lighting != 0, on active l'ombrage */ - if(_use_lighting) { - enableSurfaceOption(_sphere, SO_USE_LIGHTING); - } - disableSurfaceOption(_sphere, SO_USE_COLOR); - atexit(sortie); + GLuint id; + vec4 g = {0, 1, 0, 1}; + /* on créé nos trois type de surfaces */ + _sphere = mkSphere(12, 12); /* ça fait 12x12x2 trianles ! */ + /* on change les couleurs de surfaces */ + _sphere->dcolor = g; + /* on leur rajoute la même texture */ + id = getTexFromBMP("images/2k-mars.bmp"); + setTexId(_sphere, id); + /* si _use_tex != 0, on active l'utilisation de la texture pour les + * trois */ + if(_use_tex) { + enableSurfaceOption(_sphere, SO_USE_TEXTURE); + } + /* si _use_lighting != 0, on active l'ombrage */ + if(_use_lighting) { + enableSurfaceOption(_sphere, SO_USE_LIGHTING); + } + disableSurfaceOption(_sphere, SO_USE_COLOR); + atexit(sortie); } /*!\brief la fonction appelée à chaque display. */ void draw(void) { - static float a = 0.0f; - float mvMat[16], projMat[16], nmv[16]; - /* effacer l'écran et le buffer de profondeur */ - gl4dpClearScreen(); - clearDepth(); - /* des macros facilitant le travail avec des matrices et des - * vecteurs se trouvent dans la bibliothèque GL4Dummies, dans le - * fichier gl4dm.h */ - /* charger un frustum dans projMat */ - MFRUSTUM(projMat, -0.05f, 0.05f, -0.05f, 0.05f, 0.1f, 1000.0f); - /* charger la matrice identité dans model-view */ - MIDENTITY(mvMat); - /* on place la caméra en arrière-haut, elle regarde le centre de la scène */ - lookAt(mvMat, _xcam, _ycam, 10, 0, 0, 0, 0, 1, 0); - /* la sphère est laissée au centre et tourne autour de son axe y */ - memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ - rotate(nmv, a, 0.0f, 1.0f, 0.0f); - transform_n_raster(_sphere, nmv, projMat); - /* déclarer qu'on a changé (en bas niveau) des pixels du screen */ - gl4dpScreenHasChanged(); - /* fonction permettant de raffraîchir l'ensemble de la fenêtre*/ - gl4dpUpdateScreen(NULL); - a += 0.1f; + static float a = 0.0f; + float mvMat[16], projMat[16], nmv[16]; + /* effacer l'écran et le buffer de profondeur */ + gl4dpClearScreen(); + clearDepth(); + /* des macros facilitant le travail avec des matrices et des + * vecteurs se trouvent dans la bibliothèque GL4Dummies, dans le + * fichier gl4dm.h */ + /* charger un frustum dans projMat */ + MFRUSTUM(projMat, -0.05f, 0.05f, -0.05f, 0.05f, 0.1f, 1000.0f); + /* charger la matrice identité dans model-view */ + MIDENTITY(mvMat); + /* on place la caméra en arrière-haut, elle regarde le centre de la scène */ + lookAt(mvMat, _xcam, _ycam, _zcam, _x, _y, _z, 0, 1, 0); + /* la sphère est laissée au centre et tourne autour de son axe y */ + memcpy(nmv, mvMat, sizeof nmv); /* copie mvMat dans nmv */ + rotate(nmv, a, 0.0f, 1.0f, 0.0f); + transform_n_raster(_sphere, nmv, projMat); + /* déclarer qu'on a changé (en bas niveau) des pixels du screen */ + gl4dpScreenHasChanged(); + /* fonction permettant de raffraîchir l'ensemble de la fenêtre*/ + gl4dpUpdateScreen(NULL); + a += 0.1f; } /*!\brief intercepte l'événement clavier pour modifier les options. */ void key(int keycode) { - switch(keycode) { - case GL4DK_UP: - _ycam += 0.55f; - break; - case GL4DK_DOWN: - _ycam -= 0.55f; - break; - case GL4DK_RIGHT: - _xcam += 0.55f; - break; - case GL4DK_LEFT: - _xcam -= 0.55f; - break; - case GL4DK_t: /* 't' la texture */ - _use_tex = !_use_tex; - if(_use_tex) { - enableSurfaceOption(_sphere, SO_USE_TEXTURE); - } else { - disableSurfaceOption(_sphere, SO_USE_TEXTURE); - } - break; - case GL4DK_c: /* 'c' utiliser la couleur */ - _use_color = !_use_color; - if(_use_color) { - enableSurfaceOption(_sphere, SO_USE_COLOR); - } else { - disableSurfaceOption(_sphere, SO_USE_COLOR); - } - break; - case GL4DK_l: /* 'l' utiliser l'ombrage par la méthode Gouraud */ - _use_lighting = !_use_lighting; - if(_use_lighting) { - enableSurfaceOption(_sphere, SO_USE_LIGHTING); - } else { - disableSurfaceOption(_sphere, SO_USE_LIGHTING); - } - break; - default: break; - } + switch(keycode) { + case GL4DK_UP: + _zcam -= 0.15f; + break; + case GL4DK_DOWN: + _zcam += 0.15f; + break; + case GL4DK_RIGHT: + _xcam += 0.15f; + break; + case GL4DK_LEFT: + _xcam -= 0.15f; + break; + case GL4DK_w: + if (_y > 10.0f) { + _y = -_y; + } + _y += 0.15f; + break; + case GL4DK_a: + if (_x < -10.0f) { + _x = -_x; + } + _x -= 0.15f; + break; + case GL4DK_s: + if (_y < -10.0f) { + _y = -_y; + } + _y -= 0.15f; + break; + case GL4DK_d: + if (_x > 10.0f) { + _x = -_x; + } + _x += 0.15f; + break; + case GL4DK_t: /* 't' la texture */ + _use_tex = !_use_tex; + if(_use_tex) { + enableSurfaceOption(_sphere, SO_USE_TEXTURE); + } else { + disableSurfaceOption(_sphere, SO_USE_TEXTURE); + } + break; + case GL4DK_c: /* 'c' utiliser la couleur */ + _use_color = !_use_color; + if(_use_color) { + enableSurfaceOption(_sphere, SO_USE_COLOR); + } else { + disableSurfaceOption(_sphere, SO_USE_COLOR); + } + break; + case GL4DK_l: /* 'l' utiliser l'ombrage par la méthode Gouraud */ + _use_lighting = !_use_lighting; + if(_use_lighting) { + enableSurfaceOption(_sphere, SO_USE_LIGHTING); + } else { + disableSurfaceOption(_sphere, SO_USE_LIGHTING); + } + break; + default: break; + } } /*!\brief à appeler à la sortie du programme. */ void sortie(void) { - if(_sphere) { - freeSurface(_sphere); - _sphere = NULL; - } - /* libère tous les objets produits par GL4Dummies, ici - * principalement les screen */ - gl4duClean(GL4DU_ALL); + if(_sphere) { + freeSurface(_sphere); + _sphere = NULL; + } + /* libère tous les objets produits par GL4Dummies, ici + * principalement les screen */ + gl4duClean(GL4DU_ALL); }