//------------------------------------------------------------------------------
// 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];
}