⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctexture.h

📁 Ion Team Lord Of The Rings Demo 模拟指环王的3D游戏 VS.NET编译 里面提供高级渲染算法
💻 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 + -