//------------------------------------------------------------------------------
// Charge une image BMP 24 bits
//------------------------------------------------------------------------------
int LoadBMP(char *filename, int nb)
{
GLubyte *image;
GLubyte Header[0x36];
GLuint DataPos, imageSize;
GLsizei Width,Height;
// Lit le fichier et son header
FILE * fichier = fopen(filename,"rb");
if (!fichier) return -1;
if (fread(Header,1,0x36,fichier)!=0x36) EXIT;
if (Header[0]!='B' || Header[1]!='M') EXIT;
if (CTOI(Header[0x1E])!=0) EXIT;
if (CTOI(Header[0x1C])!=24) EXIT;
// Récupère les infos du fichier
DataPos = CTOI(Header[0x0A]);
imageSize = CTOI(Header[0x22]);
// Récupère les infos de l'image
Width = CTOI(Header[0x12]);
Height = CTOI(Header[0x16]);
// !!!!
if (imageSize==0) imageSize=Width*Height*3;
if (DataPos==0) DataPos=0x36;
// 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 += 3 )
{
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, GL_RGB, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
fclose (fichier);
free (image);
return TexNum[nb];
}