//------------------------------------------------------------------------------
// Place la caméra
//------------------------------------------------------------------------------

void    draw_cam()
 {
    //  EXPLICATIONS
    //
    //  mouse_up : angle haut-bas
    //  mouse_rl : angle gauche-droite
    //  alpha : mouse_up / beta : mouse_rl
    //
    //  targetx = cos(alpha) * cos(beta)
    //  targety = sin(alpha)
    //  targetz = cos(alpha) * sin(beta)

    targetx=run+10*cos(((width-mouse_rl)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
    targety=jump+10*sin(((height-mouse_up)/height)*pi/2);
    targetz=move_rl+10*sin(((mouse_rl-width)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
    gluLookAt(run,jump,move_rl,targetx,targety,targetz,0,1,0);
 }

//------------------------------------------------------------------------------
// Affiche le hud
//------------------------------------------------------------------------------

void    draw_hud()
 {
    glBindTexture(GL_TEXTURE_2D, Name[1]);          // Texture blanche
    gluLookAt(0,0,0.1f,0,0,0,0,1,0);                // Caméra et Target volontairement très rapprochés

    draw_crosshair();                               // Affichage de la crosshair
    if (cg_zoom <= 0)                                 // Si on ne zoome pas
     {
        draw_fumee();                                   // Affichage de la fumée
        draw_weapon();                                  // Affichage de l'arme
     }
    draw_texte();                                   // Affiche les textes à l'écran
    draw_console();                                 // Affichage de la console
 }

//------------------------------------------------------------------------------
// Affiche le menu Principal
//------------------------------------------------------------------------------

void    draw_main_menu()
 {
    int boucle;
    // Réactualise les clics des boutons
    for (boucle=1; boucle<=TOTAL_BOUTON; boucle++)
     {
        if ((mpos.x>bouton[boucle].x1) && (mpos.y>bouton[boucle].y1) && (mpos.x<bouton[boucle].x2) && (mpos.y<bouton[boucle].y2))
            bouton[boucle].stat=!bouton[boucle].stat;
     }

    // Titre
    glPrint(260,416, "arc", 3, "Menu");

    glDisable(GL_TEXTURE_2D);                        // Textures 2D activées
    COLOR_ARC_EN_CIEL;
    glBegin(GL_LINES);                                    // Start Drawing Line Strips (Something New)
        glVertex2d(0,96);  glVertex2d(640,96);                                // Top Right Of Bottom Box
        glVertex2d(0,400); glVertex2d(640,400);                                // Lower Left Of Bottom Box
    glEnd();                                                // Done First Line Strip
    glEnable(GL_TEXTURE_2D);                        // Textures 2D activées

    // Touches
    glPrint(450,352, "green", 2, "Touches");
    glPrint(500,336, "white", 1, nbfps);
    glPrint(480,320, "white", 1, "Echap : Menu");
    glPrint(480,304, "white", 1, "    E : Avancer");
    glPrint(480,288, "white", 1, "    D : Reculer");
    glPrint(480,272, "white", 1, "    S : Gauche");
    glPrint(480,256, "white", 1, "    F : Droite");
    glPrint(480,240, "white", 1, "Space : Zoom");
    glPrint(480,224, "white", 1, "ClicG : Tir");
    glPrint(480,208, "white", 1, "    B : Blend");
    glPrint(480,192, "white", 1, "    L : Light");
    glPrint(480,176, "white", 1, " PgUP : Haut");
    glPrint(480,160, "white", 1, " PgDN : Bas");
    glPrint(480,144, "red", 1, "  F10 : Quitter");


    glPrint(535,48, "yellow", 2, "Cube");
    glPrint(520,32, "white", 1, "Version 2.5");
    glPrint(530,16, "red", 1, "By BeLZeL");

    // Variables
    glPrint(10,352, "green", 2, "Variables");
    glPrint(10,240, "white", 1, "Entrer un nombre [10-200]");
    glPrint(10,224, "white", 1, "et appuyez sur Enter :");
    //bouton 1 : cg_fov

    glPrint(110,336, "white", 1, "FOV : "); glButton(170,336, 1, "%d", cg_fov);
    if (bouton[1].clic==true)                       
     {
        switch (cg_fov)
         {
        case 45 : cg_fov = 60; break ;
        case 60 : cg_fov = 90; break ;
        case 90 : cg_fov = 120; break ;
        case 120 : cg_fov = 45; break ;
         }
        bouton[1].clic=false;
     }

    //bouton 2 : sensitivity
    glPrint(30,320, "white", 1, "Sensitivity : "); glButton(170,320, 2, "%d", sensitivity);
    if (bouton[2].clic==true)
     {
        switch (sensitivity)
         {
        case 1 : sensitivity = 2; break ;
        case 2 : sensitivity = 3; break ;
        case 3 : sensitivity = 4; break ;
        case 4 : sensitivity = 1; break ;
         }
        bouton[2].clic=false;
     }

    //bouton 3 : mode
    glPrint(100,304, "white", 1, "Mode : "); glButton(170,304, 3, (cg_player)?"Joueur":"Spectateur");
    if (bouton[3].clic==true)
     {
        switch (cg_player)
         {
        case 0 : cg_player=1; break ;
        case 1 : cg_player=0; break ;
         }
        bouton[3].clic=false;
     }

    //bouton 4 : change de menu -> menu_map

    glButton(32,32, 4, "LES MAPS");
    if (bouton[4].clic==true)
     {
        main_menu=false;
        map_menu=true;
        bouton[4].clic=false;
     }

    //bouton 5 : retour
    glButton(400,48, 5, "JOUER");
    if (bouton[5].clic==true)
     {
        main_menu=false;
        bouton[5].clic=false;
     }

    //bouton 6 : quitter
    glButton(400,16, 6, "QUITTER");
    if (bouton[6].clic==true) exit(0);

    //bouton 7 : profondeur
    glPrint(90,208, "green", 1, "Depth : "); glWrite(170,208, 7, &champ_depth, bouton[7].texte);

    //bouton 8 : ciel
    glPrint(100,288, "white", 1, "Ciel : "); glButton(170,288, 8, (ciel)?"ON":"OFF");
    if (bouton[8].clic==true)
     {
        ciel=!ciel;
        bouton[8].clic=false;
     }

    //bouton 9 : moteur 3D
    glPrint(70,272, "white", 1, "Optimiz : "); glButton(170,272, 9, (m3D)?"ON":"OFF");
    if (bouton[9].clic==true)
     {
        m3D=!m3D;
        bouton[9].clic=false;
     }

    //bouton 10 : change de menu -> menu_map
    glButton(32,48, 10, "GRAPHICS");
    if (bouton[10].clic==true)
     {
        main_menu=false;
        graph_menu=true;
        bouton[10].clic=false;
     }
 }

//------------------------------------------------------------------------------
// Affiche le menu Map
//------------------------------------------------------------------------------

void    draw_map_menu()
 {
    int boucle;
    // Réactualise les clics des boutons
    for (boucle=1; boucle<=TOTAL_BOUTON; boucle++)
     {
        if ((mpos.x>bouton[boucle].x1) && (mpos.y>bouton[boucle].y1) && (mpos.x<bouton[boucle].x2) && (mpos.y<bouton[boucle].y2))
            bouton[boucle].stat=!bouton[boucle].stat;
     }

    // Titre
    glPrint(260,416, "arc", 3, "Maps");

    glDisable(GL_TEXTURE_2D);                        // Textures 2D activées
    COLOR_ARC_EN_CIEL;
    glBegin(GL_LINES);                                    // Start Drawing Line Strips (Something New)
        glVertex2d(0,96);  glVertex2d(640,96);                                // Top Right Of Bottom Box
        glVertex2d(0,400); glVertex2d(640,400);                                // Lower Left Of Bottom Box
    glEnd();                                                // Done First Line Strip
    glEnable(GL_TEXTURE_2D);                        // Textures 2D activées

    glPrint(535,48, "yellow", 2, "Cube");
    glPrint(520,32, "white", 1, "Version 2.0");
    glPrint(530,16, "red", 1, "By BeLZeL");

    //bouton 4 : retour
    glButton(32,32, 4, "BACK");
    if (bouton[4].clic==true)
     {
        main_menu=true;
        map_menu=false;
        bouton[4].clic=false;
     }

    //bouton 5 : retour
    glButton(400,48, 5, "JOUER");
    if (bouton[5].clic==true)
     {
        main_menu=false;
        map_menu=false;
        bouton[5].clic=false;
     }

    //bouton 6 : quitter
    glButton(400,16, 6, "QUITTER");
    if (bouton[6].clic==true) exit(0);

    //bouton 14 : map
    glImage(16, 256, 14, "mapbelzel.map");
    //bouton 15 : map
    glImage(176, 256, 15, "maplab.map");
    //bouton 16 : map
    glImage(336, 256, 16, "mapjail.map");
    //bouton 17 : map
    glImage(16, 128, 17, "mapmrboom.map");
 }

//------------------------------------------------------------------------------
// Affiche le menu Graphics
//------------------------------------------------------------------------------

void    draw_graph_menu()
 {
    char    *token;                                 // On va y placer toutes nos fonctions OpenGL gérées par le système
    int     cnt=0;                                  // Compteur de fonctions
    char*   text=(char *)malloc(strlen((char *)glGetString(GL_EXTENSIONS))+1); // Alloue de la mémoire permettant de contenir toutes nos extensions OpenGL
    int boucle;

    strcpy (text,(char *)glGetString(GL_EXTENSIONS)); // On récupère la liste des extensions dans un texte
    token=strtok(text," ");                         // On sépare par des espaces

    // Réactualise les clics des boutons
    for (boucle=1; boucle<=TOTAL_BOUTON; boucle++)
     {
        if ((mpos.x>bouton[boucle].x1) && (mpos.y>bouton[boucle].y1) && (mpos.x<bouton[boucle].x2) && (mpos.y<bouton[boucle].y2))
            bouton[boucle].stat=!bouton[boucle].stat;
     }

    // Titre
    glPrint(200,416, "arc", 3, "Graphics");

    glDisable(GL_TEXTURE_2D);                       // Textures 2D desactivées
    COLOR_ARC_EN_CIEL;                              // Constante couleur arc-en-ciel
    glBegin(GL_LINES);                              // On fait un cadre fait de deux lignes
        glVertex2d(0,96);  glVertex2d(640,96);
        glVertex2d(0,400); glVertex2d(640,400);
    glEnd();
    glEnable(GL_TEXTURE_2D);                        // Textures 2D réactivées

    glPrint(535,48, "yellow", 2, "Cube");
    glPrint(520,32, "white", 1, "Version 2.0");
    glPrint(530,16, "red", 1, "By BeLZeL");

    glPrint(200,32,"white",1,"   Monter : I");
    glPrint(200,16,"white",1,"Descendre : K");

    glPrint(20,384,"white",1,"  Rendu : "); glPrint(120,384,"blue",1, (char *)glGetString(GL_RENDERER));
    glPrint(20,368,"white",1,"Vendeur : "); glPrint(120,368,"blue",1, (char *)glGetString(GL_VENDOR));
    glPrint(20,352,"white",1,"Version : "); glPrint(120,352,"blue",1, (char *)glGetString(GL_VERSION));  

    glScissor(0,96,640,256);                        // On fait un "découpage" de l'écran, coin bas-gauche puis taille
    glEnable(GL_SCISSOR_TEST);                      // On l'active

    while(token!=NULL)                              // Tant qu'on est pas à la fin
    {
        cnt++;                                      // On augmente le compteur
        if (cnt>maxtokens)
            maxtokens=cnt;

        glPrint(0,352-(cnt*16)+scroll,"green", 1, "%i",cnt); // Ecrit le nombre
        glPrint(50,352-(cnt*16)+scroll,"yellow", 1, token);  // Ecrit la fonction correspondante
        token=strtok(NULL," ");                              // Va au suivant
    }

    glDisable(GL_SCISSOR_TEST);                     // Désactive le "découpage" de l'écran
    free(text);                                     // Libère la mémoire

    //bouton 4 : retour
    glButton(32,32, 4, "BACK");
    if (bouton[4].clic==true)
     {
        main_menu=true;
        graph_menu=false;
        bouton[4].clic=false;
     }

    //bouton 5 : retour
    glButton(400,48, 5, "JOUER");
    if (bouton[5].clic==true)
     {
        main_menu=false;
        graph_menu=false;
        bouton[5].clic=false;
     }

    //bouton 6 : quitter
    glButton(400,16, 6, "QUITTER");
    if (bouton[6].clic==true) exit(0);
 }




//------------------------------------------------------------------------------
// Fin Du Fichier
//------------------------------------------------------------------------------


/*
//    char *chaine;
//    int     cnt=0;                                  // Compteur de fonctions
    char *Fonctions_Activees[]={
"GL_ALPHA_TEST",
"GL_CULL_FACE",
"GL_BLEND",
"GL_DEPTH_TEST",
"GL_COLOR_ARRAY_EXT"};
*//*
"GL_ALPHA_TEST",
"GL_AUTO_NORMAL",
"GL_BLEND",
"GL_CLIP_PLANE1",
"GL_COLOR_ARRAY_EXT",
"GL_COLOR_MATERIAL", 
"GL_CULL_FACE", 
"GL_DEPTH_TEST", 
"GL_DITHER", 
"GL_EDGE_FLAG_ARRAY_EXT", 
"GL_FOG", 
"GL_INDEX_ARRAY_EXT", 
"GL_LIGHT1", 
"GL_LIGHTING", 
"GL_LINE_SMOOTH", 
"GL_LINE_STIPPLE", 
"GL_LOGIC_OP", 
"GL_MAP1_COLOR_4", 
"GL_MAP1_INDEX", 
"GL_MAP1_NORMAL", 
"GL_MAP1_TEXTURE_COORD_1", 
"GL_MAP1_TEXTURE_COORD_2", 
"GL_MAP1_TEXTURE_COORD_3", 
"GL_MAP1_TEXTURE_COORD_4", 
"GL_MAP1_VERTEX_3", 
"GL_MAP1_VERTEX_4", 
"GL_MAP2_COLOR_4", 
"GL_MAP2_INDEX", 
"GL_MAP2_NORMAL", 
"GL_MAP2_TEXTURE_COORD_1", 
"GL_MAP2_TEXTURE_COORD_2", 
"GL_MAP2_TEXTURE_COORD_3", 
"GL_MAP2_TEXTURE_COORD_4", 
"GL_MAP2_VERTEX_3", 
"GL_MAP2_VERTEX_4", 
"GL_NORMAL_ARRAY_EXT", 
"GL_NORMALIZE", 
"GL_POINT_SMOOTH", 
"GL_POLYGON_SMOOTH", 
"GL_POLYGON_STIPPLE", 
"GL_SCISSOR_TEST", 
"GL_STENCIL_TEST", 
"GL_TEXTURE_1D", 
"GL_TEXTURE_2D", 
"GL_TEXTURE_COORD_ARRAY_EXT", 
"GL_TEXTURE_GEN_Q", 
"GL_TEXTURE_GEN_R", 
"GL_TEXTURE_GEN_S", 
"GL_TEXTURE_GEN_T", 
"GL_VERTEX_ARRAY_EXT"};
*//*

//    chaine=strtok(Fonctions_Activees," ");                         // On sépare par des espaces

    // Réactualise les clics des boutons
    for (int boucle=1; boucle<=TOTAL_BOUTON; boucle++)
     {
        if ((mpos.x>bouton[boucle].x1) && (mpos.y>bouton[boucle].y1) && (mpos.x<bouton[boucle].x2) && (mpos.y<bouton[boucle].y2))
            bouton[boucle].stat=!bouton[boucle].stat;
     }

    // Titre
    glPrint(200,416, "arc", 3, "Graphics");

    glDisable(GL_TEXTURE_2D);                       // Textures 2D desactivées
    COLOR_ARC_EN_CIEL;                              // Constante couleur arc-en-ciel
    glBegin(GL_LINES);                              // On fait un cadre fait de deux lignes
        glVertex2d(0,96);  glVertex2d(640,96);
        glVertex2d(0,400); glVertex2d(640,400);
    glEnd();
    glEnable(GL_TEXTURE_2D);                        // Textures 2D réactivées

    glPrint(535,48, "yellow", 2, "Cube");
    glPrint(520,32, "white", 1, "Version 2.0");
    glPrint(530,16, "red", 1, "By BeLZeL");

    glPrint(200,32,"white",1,"   Monter : I");
    glPrint(200,16,"white",1,"Descendre : K");

    glPrint(20,384,"white",1,"  Rendu : "); glPrint(120,384,"blue",1, (char *)glGetString(GL_RENDERER));
    glPrint(20,368,"white",1,"Vendeur : "); glPrint(120,368,"blue",1, (char *)glGetString(GL_VENDOR));
    glPrint(20,352,"white",1,"Version : "); glPrint(120,352,"blue",1, (char *)glGetString(GL_VERSION));  

    glScissor(0,96,640,256);                        // On fait un "découpage" de l'écran, coin bas-gauche puis taille
    glEnable(GL_SCISSOR_TEST);                      // On l'active


    for (int t=0; t<=4; t++)
     {
        glPrint(0,352-(t*16)+scroll,"green", 1, "%d", t); // Ecrit le nombre
        glPrint(50,352-(t*16)+scroll,"yellow", 1, Fonctions_Activees[t]);  // Ecrit la fonction correspondante
        glPrint(450,352-(t*16)+scroll,"blue", 1, (glIsEnabled(int(Fonctions_Activees[t]))==GL_TRUE)?"ON":"OFF");  // Ecrit la fonction correspondante
        glPrint(500,352-(t*16)+scroll,"blue", 1, (glIsEnabled(int(Fonctions_Activees[t]))==GL_FALSE)?"ON":"OFF");  // Ecrit la fonction correspondante
     }

    glDisable(GL_SCISSOR_TEST);                     // Désactive le "découpage" de l'écran
//    free(Fonctions_Activees);                                     // Libère la mémoire

    //bouton 4 : retour
    glButton(32,32, 4, "BACK");
    if (bouton[4].clic==true)
     {
        main_menu=true;
        graph_menu=false;
        bouton[4].clic=false;
     }

    //bouton 5 : retour
    glButton(400,48, 5, "JOUER");
    if (bouton[5].clic==true)
     {
        main_menu=false;
        graph_menu=false;
        bouton[5].clic=false;
     }

    //bouton 6 : quitter
    glButton(400,16, 6, "QUITTER");
    if (bouton[6].clic==true) exit(0);
 }

*/