//------------------------------------------------------------------------------
// Création de la police venant d'une texture TGA
//------------------------------------------------------------------------------

void    BuildFont()
 {
    int loop;
    base=glGenLists(95);                            // On génère 95 listes d'éléments
    glBindTexture(GL_TEXTURE_2D, Name[9]);// On cherche la texture de notre police
    for (loop=0; loop<95; loop++)
     {
        float cx=(float)(loop%16)/16.0f;              // Position X du caractère courant
        float cy=(float)(loop/16)/8.0f;               // Position Y du caractère courant

        glNewList(base+loop,GL_COMPILE);            // On commence à construire une liste
        glBegin(GL_QUADS);                          // On fait un carré
            glTexCoord2f(cx,         1.0f-cy-0.120f); glVertex2i(0,0);  // Bas gauche
            glTexCoord2f(cx+0.0625f, 1.0f-cy-0.120f); glVertex2i(16,0); // Bas Droit
            glTexCoord2f(cx+0.0625f, 1.0f-cy);        glVertex2i(16,16);// Haut Droit
            glTexCoord2f(cx,         1.0f-cy);        glVertex2i(0,16); // Haut Gauche
        glEnd();
        glTranslated(10,0,0);                       // On se déplace vers la droite
        glEndList();                                // On termine la liste
     }                                              // On boucle jusqu'au 256è caractère créé
 }

//------------------------------------------------------------------------------
// Affichage de la police à l'écran
//------------------------------------------------------------------------------

void    glPrint(int x, int y, char *color, int size, const char *string, ...)
 {
    char    text[256];                              // Notre texte
    va_list ap;                                     // pointeur d'une liste d'argument

    va_start(ap, string);                           // On passe la chaine en variable
        vsprintf(text, string, ap);                 // On convertit le symbole
    va_end(ap);                                     // Résultat mis dans en texte

    glBindTexture(GL_TEXTURE_2D, Name[9]);// On sélectionne notre texture

    //---   On écrit un texte   ---\\

    glPushMatrix();                                 // On enregistre la matrice
    Blend_ON;
    if (color=="arc") COLOR_ARC_EN_CIEL;            // Constante couleur arc-en-ciel
    if (color=="white") glColor3f(1.0f, 1.0f, 1.0f);
    if (color=="red") glColor3f(1.0f, 0.0f, 0.0f);
    if (color=="green") glColor3f(0.0f, 1.0f, 0.0f);
    if (color=="blue") glColor3f(0.0f, 0.0f, 1.0f);
    if (color=="yellow") glColor3f(1.0f, 1.0f, 0.0f);
    if (color=="cyan") glColor3f(0.0f, 1.0f, 1.0f);
    if (color=="purple") glColor3f(1.0f, 0.0f, 1.0f);
    glTranslated(x,y,0);                            // on translate
    glScaled(size, size, 1);                        // On modifie la taille
    glListBase(base-32);                            // On choisit les caractères
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // On affiche le texte
    Blend_OFF;
    glPopMatrix();                                  // On restore la matrice d'origine
 }

//------------------------------------------------------------------------------
// Affiche un hyper texte à l'écran
//------------------------------------------------------------------------------

void    glButton(int x, int y, int nb, const char *string, ...)
 {
    char    text[256];                              // Notre texte
    va_list ap;                                     // pointeur d'une liste d'argument
    bool     stat=bouton[nb].stat;

    va_start(ap, string);                           // On passe la chaine en variable
        vsprintf(text, string, ap);                 // On convertit le symbole
    va_end(ap);                                     // Résultat mis dans en texte

    //---   On écrit le texte   ---\\

    glBindTexture(GL_TEXTURE_2D, Name[9]);// On sélectionne notre texture
    glPushMatrix();                                 // On enregistre la matrice
    if (stat) glColor3f(1.0f, 0.0f, 0.0f);    // si on clique
    if (!stat) glColor3f(1.0f, 1.0f, 0.0f);   // si on ne clique pas
    glTranslated(x,y,0);                            // on translate
    glListBase(base-32);                            // On choisit les caractères
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // On affiche le texte
    glPopMatrix();                                  // On restore la matrice d'origine

    //---   On crée le bouton   ---\\

    bouton[nb].x1=x;                                // bas gauche X
    bouton[nb].y1=y;                                // bas gauche Y
    bouton[nb].x2=x+strlen(text)*10;                // haut droit X
    bouton[nb].y2=y+16;                             // haut droit Y
    bouton[nb].stat=false;                          // etat revenant à faux
 }


//------------------------------------------------------------------------------
// Affiche un hyper texte à l'écran
//------------------------------------------------------------------------------

void    glWrite(int x, int y, /*bool stat,*/ int nb, int *var, const char *string, ...)
 {
    char    text[256];                              // Notre texte
    va_list ap;                                     // pointeur d'une liste d'argument
    bool    stat=bouton[nb].stat;
    int xx, xxx;
    char txt[10];

    va_start(ap, string);                           // On passe la chaine en variable
        vsprintf(text, string, ap);                 // On convertit le symbole
    va_end(ap);                                     // Résultat mis dans en texte
    
    if (stat) bouton[nb].clic=true;

    //---   On écrit le texte   ---\\

    glBindTexture(GL_TEXTURE_2D, Name[9]);          // On sélectionne notre texture
    glPushMatrix();                                 // On enregistre la matrice
    if (stat) glColor3f(1.0f, 0.0f, 0.0f);          // si on clique
    if (!stat) glColor3f(1.0f, 1.0f, 0.0f);         // si on ne clique pas
    glTranslated(x,y,0);                            // on translate
    glListBase(base-32);                            // On choisit les caractères
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, strcat(text, "|")); // On affiche le texte
    glPopMatrix();                                  // On restore la matrice d'origine

    //---   On crée le bouton   ---\\

    // on crée un bouton virtuel, avec les coordonnées de 2 coins opposés
    bouton[nb].x1=x;                                // bas gauche X
    bouton[nb].y1=y;                                // bas gauche Y
    bouton[nb].x2=x+strlen(text)*10;                // haut droit X
    bouton[nb].y2=y+16;                             // haut droit Y
    bouton[nb].stat=false;                          // etat redevenant à faux

    //---   Le texte qu'on tape   ---\\

    if ((stat) || (bouton[nb].clic))
     {
        strcpy(txt, "");
        for (xx=32;xx<=128;xx++)                // caractère entre 32 et 128
         {
            if (g_keys[xx])
             {
                sprintf(txt,"%c",xx);
                strcat(bouton[nb].texte,txt);
                g_keys[xx]=false;
                stat=false;
             }
         }

        if (g_keys[13])                             // touche entrée
         {
            *var=0;
            for (xxx=0; xxx<strlen(text)-1; xxx++)
             {
                double yy=pow(10, (strlen(text)-xxx-2));
                (*var)+=(text[xxx]-48)*(int)(yy);
             }
            bouton[nb].clic=false;
         }

        char temp[10];
        strcpy(temp, "");
        if ((g_keys[8]) && (strlen(bouton[nb].texte)>0)) // touche backspace
         {
            for (xx=0;xx<strlen(bouton[nb].texte)-1;xx++)
             {
                sprintf(temp,"%c",bouton[nb].texte[xx]);
                strcat(txt, temp);
             }
            strcpy(bouton[nb].texte, "");
            strcpy(bouton[nb].texte, txt);
            g_keys[8]=false;
            stat=false;
         }
     }
 }

//------------------------------------------------------------------------------
// Affiche une image à l'écran
//------------------------------------------------------------------------------

void    glImage(int x, int y, int nb, char nom_map[256])
 {
    int boucle;
    glPushMatrix();                                 // On enregistre la matrice
    glBindTexture(GL_TEXTURE_2D, Name[9]);          // On sélectionne notre texture
    glColor3d(1,1,1);
    glTranslated(x,y-16,0);                            // on translate
    glListBase(base-32);                            // On choisit les caractères
    glCallLists(strlen(nom_map), GL_UNSIGNED_BYTE, nom_map); // On affiche le texte
    glPopMatrix();                                  // On restore la matrice d'origine

    glDisable(GL_TEXTURE_2D);
    if (bouton[nb].stat) glColor3d(1,0,0);
    if (!bouton[nb].stat) glColor3d(1,1,0);
    if (bouton[nb].select) glColor3d(0,1,0);
    glBegin(GL_QUADS);                              // On fait un carré
        glVertex2i(x-2,y-2);         // Bas gauche
        glVertex2i(x+128+2,y-2);     // Bas Droit
        glVertex2i(x+128+2,y+96+2); // Haut Droit
        glVertex2i(x-2,y+96+2);     // Haut Gauche
    glEnd();
    glEnable(GL_TEXTURE_2D);

    glColor3d(1,1,1);
    glBindTexture(GL_TEXTURE_2D, Name[nb]);         // On sélectionne notre texture
    glBegin(GL_QUADS);                              // On fait un carré
        glTexCoord2f(0,0); glVertex2i(x,y);         // Bas gauche
        glTexCoord2f(1,0); glVertex2i(x+128,y);     // Bas Droit
        glTexCoord2f(1,1); glVertex2i(x+128,y+96); // Haut Droit
        glTexCoord2f(0,1); glVertex2i(x,y+96);     // Haut Gauche
    glEnd();

    //---   On crée le bouton   ---\\

    bouton[nb].x1=x;                                // bas gauche X
    bouton[nb].y1=y;                                // bas gauche Y
    bouton[nb].x2=x+128;                            // haut droit X
    bouton[nb].y2=y+128;                            // haut droit Y
    bouton[nb].stat=false;                          // etat redevenant à faux

    if (bouton[nb].clic)
     {
        map_name=nom_map;
        for (boucle=1; boucle<=TOTAL_BOUTON; boucle++)
         {
            if (boucle!=nb)
                bouton[boucle].select=false;
         }
        bouton[nb].select=true;
        bouton[nb].clic=false;
        map=false;
     }
 }

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