📄 ctexture.h
字号:
/////////////////////////////////////////////////////////////////////
// This Code was done by HiperBlaster
// uses FreeImage 2.50
// OpenGL ready! :)
//////////////////////////////////////////////////////////////////////
// **USE**
// *-link freeimage.lib to start-*
// just declare the class as a global (IMHO it's better that way)
// declare "GLuint texture" to create a opengl texture reference
// use LoadTexture to set the value of "texture"
// don't forget to bind and unload the texture when necessary
////////////////////////////////////////////////////////////////////////
// Warnings: PCXs don't work
// TGAs,BMPs and JPGs with weird compression types get screwed
// no error checking for now, make sure you have the textures in the right place
// 12-3-2002: Converted To Non-Class
//used for Type in LoadTexture
#define CT_FIND 0 //checks from the texture extension
#define CT_BMP 1
#define CT_TGA 2
#define CT_JPG 3
#define CT_PCX 4
#define CT_MIPMAP 0
#define CT_LINEAR 1
typedef pair<GLuint,string> p_ui16str;
vector<p_ui16str> TextureDB;
inline void Bind(GLuint texture) //sets texture as the current one
{
int i=TextureDB[texture].first;
glBindTexture(GL_TEXTURE_2D,i);
}
GLuint LoadTexture(string Filename,int Type, int Filtering=CT_MIPMAP)
{
FIBITMAP *Image; //the freeimage image used for loading
if(Type==CT_FIND)
{
int fif; //lame :)
fif = FreeImage_GetFileType(Filename.c_str(),16);
if(fif == FIF_BMP)
Type=CT_BMP;
//if(fif == FIF_TARGA)Type=CT_TGA; //doesn't work :( ,don't get it
if(fif == FIF_JPEG)
Type=CT_JPG;
if(fif == FIF_PCX)
Type=CT_PCX;
if(fif != FIF_BMP && fif != FIF_JPEG)
Type=CT_TGA;
}
if(Type==CT_BMP)
{
Image = FreeImage_LoadBMP(Filename.c_str());
}
if(Type==CT_TGA)
{
Image = FreeImage_LoadTARGA(Filename.c_str(),TARGA_LOAD_RGB888 ); //force 24 bit
}
if(Type==CT_JPG)
{
Image = FreeImage_LoadJPEG(Filename.c_str(),JPEG_ACCURATE );
}
if(Type==CT_PCX)
{
Image = FreeImage_LoadPCX(Filename.c_str());
}
FreeImage_ConvertTo24Bits(Image); //for safety
BYTE *data;
data = FreeImage_GetBits(Image); //get a pointer to the data
GLuint texture; //the gl texture
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D, texture);
if (Filtering == CT_MIPMAP)
{
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, FreeImage_GetWidth(Image), FreeImage_GetHeight(Image), GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
}
if (Filtering == CT_LINEAR)
{
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, FreeImage_GetWidth(Image) , FreeImage_GetHeight(Image) , 0, GL_BGR_EXT , GL_UNSIGNED_BYTE, data);
}
FreeImage_Free(Image); //frees up the memory used, it's now on gl
TextureDB.push_back(p_ui16str(texture,Filename));
return TextureDB.size()-1; //return the loaded texture index in the Texture database :=)
}
GLuint LoadAlphaBitmap(string Filename, int Filtering=CT_MIPMAP, int Threshold=30)
{
FIBITMAP *Image;
Image = FreeImage_LoadBMP(Filename.c_str());
if (FreeImage_GetBPP(Image)!=24)
Image = FreeImage_ConvertTo24Bits(Image); //for safety
unsigned char *data;
data = FreeImage_GetBits(Image); //get a pointer to the data
////////////////////////////////////////////
//this is slow , should be asm :(
//convert BGR to RGB for compatibility
unsigned int a,b; //temp location
unsigned int loop=0;
while(loop!=(FreeImage_GetWidth(Image)*FreeImage_GetHeight(Image))*3)
{
a=data[loop]; //store B
b=data[loop+2]; //store R
data[loop]=b; //put R in the first byte
data[loop+2]=a; //and B in the last
loop+=3;
}
/////////////////////////////////////////////
//create the alpha channel
unsigned char *aTexture = (unsigned char*)malloc((FreeImage_GetWidth(Image)*FreeImage_GetHeight(Image))*4);
loop=0;
int aloop=0;
while(loop!=FreeImage_GetWidth(Image)*FreeImage_GetHeight(Image)*3)
{
aTexture[aloop]=data[loop];
aTexture[aloop+1]=data[loop+1];
aTexture[aloop+2]=data[loop+2];
//the comparation
if((aTexture[aloop]+aTexture[aloop+1]+aTexture[aloop+2])<Threshold)
aTexture[aloop+3]=0;
else
aTexture[aloop+3]=255;
loop+=3;
aloop+=4;
}
/////////////////////////////////
//create the gl texture
GLuint Tex;
glGenTextures(1,&Tex);
glBindTexture(GL_TEXTURE_2D,Tex);
if (Filtering == CT_MIPMAP)
{
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, FreeImage_GetWidth(Image), FreeImage_GetHeight(Image), GL_RGBA, GL_UNSIGNED_BYTE, aTexture);
}
if (Filtering == CT_LINEAR)
{
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4, FreeImage_GetWidth(Image) , FreeImage_GetHeight(Image) , 0, GL_RGBA , GL_UNSIGNED_BYTE, aTexture);
}
free(aTexture);
FreeImage_Free(Image); //frees up the memory used, it's now on gl
TextureDB.push_back(p_ui16str(Tex,Filename));
return TextureDB.size()-1;
//free(data);
}
GLuint ReloadTexture(string Filename)
{
FIBITMAP *Image; //the freeimage image used for loading
int Type;
int fif; //lame :)
fif = FreeImage_GetFileType(Filename.c_str(),16);
if(fif == FIF_BMP)
Type=CT_BMP;
//if(fif == FIF_TARGA)Type=CT_TGA; //doesn't work :( ,don't get it
if(fif == FIF_JPEG)
Type=CT_JPG;
if(fif == FIF_PCX)
Type=CT_PCX;
if(fif != FIF_BMP && fif != FIF_JPEG)
Type=CT_TGA;
if(Type==CT_BMP)
{
Image = FreeImage_LoadBMP(Filename.c_str());
}
if(Type==CT_TGA)
{
Image = FreeImage_LoadTARGA(Filename.c_str(),TARGA_LOAD_RGB888 ); //force 24 bit
}
if(Type==CT_JPG)
{
Image = FreeImage_LoadJPEG(Filename.c_str(),JPEG_ACCURATE );
}
if(Type==CT_PCX)
{
Image = FreeImage_LoadPCX(Filename.c_str());
}
FreeImage_ConvertTo24Bits(Image); //for safety
BYTE *data;
data = FreeImage_GetBits(Image); //get a pointer to the data
GLuint texture; //the gl texture
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D, texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, FreeImage_GetWidth(Image), FreeImage_GetHeight(Image), GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
//Potencial Problem: GL_BGR_EXT maybe not always supported
// glTexImage2D(GL_TEXTURE_2D, 0, 3, FreeImage_GetWidth(Image) , FreeImage_GetHeight(Image) , 0, GL_BGR_EXT , GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
FreeImage_Free(Image); //frees up the memory used, it's now on gl
return texture; //return the texture number :)
}
void UnloadTexture(GLuint texture)
{
glDeleteTextures(1,&texture);
}
void RebuildTextures()
{
for (Uint16 i=0;i<TextureDB.size();i++)
{
TextureDB[i].first = ReloadTexture(TextureDB[i].second);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -