- typedef struct tbgRGBA {
- unsigned char r,g,b,a;
- } TRGBA, PRGBA;
- typedef TRGBA TRGBATable[9999];
- typedef TRGBATable *PRGBATable;
- typedef struct tbgRGBAIMAGE {
- int width, height;
- PRGBATable data;
- } TRGBAImage, *PRGBAImage;
- typedef struct tbgTGAHEADER {
- unsigned char idlength;
- unsigned char colourmaptype;
- unsigned char datatypecode;
- unsigned short colourmaporigin;
- unsigned short colourmaplength;
- unsigned char colourmapdepth;
- unsigned short x_origin;
- unsigned short y_origin;
- unsigned short width;
- unsigned short height;
- unsigned char bitsperpixel;
- unsigned char imagedescriptor;
- } TTGAHeader;
- PRGBAImage LoadTGAImage(char *FileName)
- {
- TTGAHeader Header;
- FILE* F;
- PRGBAImage img;
- int l;
- char h;
- img = NULL;
- F = fopen(FileName, "rb");
- if (F!=NULL)
- {
- fread(&Header.idlength, 1, 1, F);
- fread(&Header.colourmaptype, 1, 1, F);
- fread(&Header.datatypecode, 1, 1, F);
- fread(&Header.colourmaporigin, 2, 1, F);
- fread(&Header.colourmaplength, 2, 1, F);
- fread(&Header.colourmapdepth, 1, 1, F);
- fread(&Header.x_origin, 2, 1, F);
- fread(&Header.y_origin, 2, 1, F);
- fread(&Header.width, 2, 1, F);
- fread(&Header.height, 2, 1, F);
- fread(&Header.bitsperpixel, 1, 1, F);
- fread(&Header.imagedescriptor, 1, 1, F);
- if ((Header.datatypecode==2) && (Header.bitsperpixel==32))
- {
- fseek(F, 18 + Header.idlength + Header.colourmaptype * Header.colourmaplength, SEEK_SET);
- img = (PRGBAImage) malloc(sizeof(TRGBAImage));
- img->width = Header.width;
- img->height = Header.height;
- l = img->width * img->height;
- img->data = (PRGBATable) malloc(l * 4);
- fread(img->data, 4, l, F);
- do
- {
- l--;
- h = (*img->data)[l].r;
- (*img->data)[l].r = (*img->data)[l].b;
- (*img->data)[l].b = h;
- } while (l>=0);
- }
- fclose(F);
- }
- else
- {
- img = (PRGBAImage) malloc(sizeof(TRGBAImage));
- img->width = 16;
- img->height = 16;
- img->data = (PRGBATable) malloc(1024);
- memset(img->data, 0xFF, 1024);
- }
- return img;
- }
- ...
- t2dImage ist vom Typ PRGBAImage, dem Rückgabewert von LoadTGAImage
- ...
- void CTexture2D::Compile()
- {
- glBindTexture(texTarget, texHandle); // texture binding info
- // either use mipmaps or set texture image directly
- if (t2dImage!=NULL)
- {
- #if !defined(NO_GLU)
- if ((bgUseMipMaps) && (gluBuild2DMipmaps!=NULL))
- gluBuild2DMipmaps(texTarget, // target
- texComponents, // components
- t2dImage->width, t2dImage->height,
- GL_RGBA, GL_UNSIGNED_BYTE, t2dImage->data);
- else
- #endif
- glTexImage2D(texTarget, // target
- 0, // mipmap level
- texComponents, // components
- t2dImage->width, t2dImage->height,
- 0, // border
- GL_RGBA, GL_UNSIGNED_BYTE, t2dImage->data);
- }
- glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, texMinFilter); // filter for pixels > texels
- glTexParameteri(texTarget, GL_TEXTURE_MAG_FILTER, texMagFilter); // filter for pixels < texels
- glTexParameteri(texTarget, GL_TEXTURE_WRAP_S, t2dWrapS); // wrap texture s parameter
- glTexParameteri(texTarget, GL_TEXTURE_WRAP_T, t2dWrapT); // wrap texture t parameter
- glTexParameterfv(texTarget, GL_TEXTURE_BORDER_COLOR, (GLfloat*) &t2dBorderColor); // texture border color
- }