
/*! \addtogroup tuto_application écrire une application openGL

cf \ref tuto1.cpp

une application openGL est composée de plusieurs éléments :
	- une fenêtre pour voir ce que l'on dessine,
	- un contexte openGL pour dessiner,
	- 3 fonctions : 
		- init( ) pour créer les objets que l'on veut dessiner, 
		- quit( ) pour détruire les objets openGL crées dans init( ), à la fermeture de l'application,
		- draw( ) pour afficher / dessiner quelquechose.
    
ces 3 fonctions sont appelées dans le main.

## création de la fenêtre et du contexte openGL :

\code
#include "window.h"

int init( ) { ... }
int quit( ) { ... }
int draw( ) { ... }

int main( int argc, char **argv )
{
    // etape 1 : creer la fenetre
    Window window= create_window(1024, 640);	// indiquer les dimensions de la fenêtre
    if(window == NULL) 
        return 1;       // erreur lors de la création de la fenetre ou de l'init de SDL2
    
    // etape 2 : creer un contexte opengl pour pouvoir dessiner
    Context context= create_context(window);
    if(context == NULL) 
        return 1;       // erreur lors de la creation du contexte opengl
    
    // etape 3 : creation des objets openGL de l'application
    if(init() < 0)
    {
        printf("[error] init failed.\n");
        return 1;
    }
    
    // etape 4 : affichage de l'application, tant que la fenetre n'est pas fermee. ou que draw() ne renvoie pas 0
    // appelle draw( ) pour dessiner une nouvelle image, 60 fois par seconde.
    run(window, draw);

    // etape 5 : nettoyage
    quit();	// detruire les objets openGL crees par l'application
    release_context(context);
    release_window(window);
    return 0;
}
\endcode

ces fonctions sont documentées dans \ref window.h et utilisent la librairie [SDL2](http://libsdl.org) pour rester portable sur les mêmes
systèmes qu'openGL.

il est aussi possible d'utiliser directement sdl, sans passer par ces fonctions prédéfinies. une application crée une fenêtre et traite
les evènements clavier, souris et d'autres générés par le système d'exploitation. la fonction run( ) les traite pour vous.

dans la mesure du possible, les fonctions de window.h ne dupliquent pas / n'abstraient pas les fonctionnalités de sdl2, vous pouvez 
les utiliser directement. par exemple :
	- SDL_GetTicks() pour  connaitre le temps écoulé depuis le lancement de l'application, 
	- SDL_GetMouseState() pour récupérer la position de la souris et l'état de ses boutons.

window.h définit par contre des utilitaires pour simplifier l'écriture d'applications interactives. par exemple, si vous voulez modifier
la position d'un objet en appuyant sur une touche, les fonctions key_state( ) et clear_key_state( ) permettent de le faire très 
simplement.

autre exemple d'utilisation : faire une capture d'écran de l'application

\code
#include "window.h"
#include "texture.h"

int draw( )
{
	...
	if(key_state('s'))
	{
		clear_key_state('s');
		screenshot("screenshot.png");
	}
	...
}
\endcode

à quoi sert le clear_key_state( ) ? vu que draw( ) est appelée 60 fois par seconde, il est probable que la touche reste enfoncée pendant
une bonne dixaine d'appels, reinitialiser l'état de la touche permet d'éviter d'enregistrer 10 fois l'image...


 */
