//------------------------------------------------------------------------------
// Charge une image TGA 32 bits non compressée
//------------------------------------------------------------------------------

int    LoadTGA(char *filename, int nb) // Loads A TGA File Into Memory
 {
    GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};// Header d'un TGA non compressé
    GLubyte TGAcompare[12];                         // Header TGA utilisé pour une comparaison
    GLubyte header[6];                              // 6 premiers bytes utiles du header
    int     imageSize;                              // taille de l'image
    int     type;                                   // type de l'image
    GLubyte *image;                                 // l'image sous forme de données
    int     bpp;                                    // bits par pixel de l'image
    int     Width, Height;                          // taille de l'image
                                                    
    // Lit le fichier et son header
    FILE *fichier = fopen(filename, "rb");          // ouvre le fichier
    if (fread(TGAcompare,1,sizeof(TGAcompare),fichier)!=sizeof(TGAcompare)) EXIT; // 12 bytes à lire ?
    if (memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0)                  EXIT; // Correspondent-t-ils à ce qu'on a ?
    if (fread(header,1,sizeof(header),fichier)!=sizeof(header))             EXIT; // Lisons les 6 bytes suivants

    // Récupère les infos de l'image
    Width  = header[1] * 256 + header[0];           // Détermine la largeur de l'image
    Height = header[3] * 256 + header[2];           // Détermine la largeur de l'image
    bpp = header[4];                                // Détermine le nombre de bits par pixel de l'image
    if (bpp==24) type=GL_RGB;
    else type=GL_RGBA;
    imageSize = Width*Height*bpp/8;                 // Calcule la taille de l'image

    // Charge l'image
    image = (GLubyte *) malloc ( imageSize );
    if (fread(image, 1, imageSize, fichier) != imageSize)
     {
        free (image);
        EXIT;
     }
    
    // Inverse R et B
    int t, i;
    for ( i = 0; i < imageSize; i += bpp / 8 )
     {
        t = image[i];
        image[i] = image[i+2];
        image[i+2] = t;
     }

    // Traitements de la texture par OpenGL
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);        // Construit la texture sous forme de données
    glGenTextures(nb, &TexNum[nb]);              // Génère une ID pour la texture OpenGL                                             
    
    glBindTexture(GL_TEXTURE_2D, TexNum[nb]);    // Pointe la texture
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

    // Génère la texture OpenGL en mémoire
    glTexImage2D(GL_TEXTURE_2D, 0, type, Width, Height, 0, type, GL_UNSIGNED_BYTE, image);

    fclose (fichier);
    free (image);
    return TexNum[nb];
 }